In HTTP/1.1 specifications (RFC 7230), there's no defined maximum size for POST requests. The protocol leaves this implementation-dependent, creating important variations across different web servers and frameworks.
Major web servers enforce their own POST size limits:
// Apache configuration example
LimitRequestBody 10000000 // 10MB limit in httpd.conf
// Nginx configuration example
client_max_body_size 20m; // 20MB limit in nginx.conf
// IIS configuration example
<requestLimits maxAllowedContentLength="30000000" /> // 30MB in web.config
Application frameworks add another layer of constraints:
// Express.js middleware example
app.use(express.json({ limit: '5mb' }));
app.use(express.urlencoded({ limit: '5mb', extended: true }));
// Django settings.py example
DATA_UPLOAD_MAX_MEMORY_SIZE = 2621440 # 2.5MB default
FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440
When dealing with large payloads, consider these approaches:
// Chunked upload implementation example (JavaScript)
async function uploadLargeFile(file) {
const chunkSize = 5 * 1024 * 1024; // 5MB chunks
for (let start = 0; start < file.size; start += chunkSize) {
const chunk = file.slice(start, start + chunkSize);
await fetch('/upload', {
method: 'POST',
body: chunk,
headers: {
'Content-Range': bytes ${start}-${start+chunk.size-1}/${file.size}
}
});
}
}
Common error responses and their meanings:
- 413 Payload Too Large: Server-side limit exceeded
- 400 Bad Request: Possible malformed chunked encoding
- 502 Bad Gateway: Upstream server rejected large payload
For performance-critical applications:
// Compression example (Node.js)
const zlib = require('zlib');
app.post('/api/data', (req, res) => {
const compressed = zlib.gzipSync(JSON.stringify(largeData));
// Send compressed data with appropriate headers
res.setHeader('Content-Encoding', 'gzip');
res.send(compressed);
});
The maximum size of an HTTP POST request is not strictly defined by the HTTP/1.1 protocol specification (RFC 7231). However, practical limitations exist at multiple levels:
// Example Node.js server setting for POST size limit
const express = require('express');
const app = express();
// Set limit to 10MB for JSON payloads
app.use(express.json({ limit: '10mb' }));
// Set limit to 50MB for URL-encoded data
app.use(express.urlencoded({ limit: '50mb', extended: true }));
Web servers typically impose their own POST size limits:
- Apache: LimitRequestBody directive (default 0 = unlimited)
- Nginx: client_max_body_size (default 1MB)
- IIS: maxAllowedContentLength (default 28.6MB)
# Python Flask example
from flask import Flask
app = Flask(__name__)
# Set max content length to 16MB
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
For large file uploads, consider:
- Chunked transfer encoding
- Streaming uploads
- Alternative protocols (WebSockets, gRPC)
// Express middleware to handle payload too large
app.use((err, req, res, next) => {
if (err.type === 'entity.too.large') {
return res.status(413).json({
error: 'Payload exceeds size limit'
});
}
next(err);
});