Código de status HTTP · Erros do cliente (4xx)
Erro 411 Length Required
O erro 411 Length Required significa que o servidor só aceita o pedido se ele informar o tamanho do corpo no cabeçalho Content-Length. Quase sempre é um POST ou PUT com corpo vazio, ou um upload enviado em chunks.
| Classe | 4xx, Erros do cliente |
|---|---|
| Definido em | RFC 9110 §15.5.12 |
| Pode ir para o cache por padrão | Só com Cache-Control ou Expires explícitos |
| Pode repetir o pedido | Sim, depois que o pedido levar um Content-Length válido |
| Cabeçalhos relevantes |
|
O que significa o 411
A RFC 9110, seção 15.5.12, diz que o servidor recusa o pedido sem um Content-Length definido e que o cliente pode repeti-lo depois de incluir o cabeçalho. Servidores fazem isso quando querem conferir o tamanho antes de ler qualquer coisa, ou quando há um trecho HTTP/1.0 no caminho que não entende corpo em chunks.
O exemplo clássico é o Google: um POST sem Content-Length para vários endpoints do Google devolve uma página 411 dizendo que requisições POST exigem o cabeçalho Content-length. HTTP/2 e HTTP/3 delimitam o corpo por conta própria, então o erro aparece quase só em HTTP/1.1.
Causas comuns
Se você administra o servidor
- O cliente envia POST ou PUT sem corpo nenhum, como o curl -X POST sem -d, e não inclui Content-Length.
- O cliente HTTP transmite o corpo com Transfer-Encoding: chunked (streams do Node, HttpURLConnection do Java em modo chunked) para um servidor ou proxy que exige tamanho.
- Um balanceador ou proxy antigo na frente da sua aplicação recusa pedidos em chunks, mesmo que a aplicação aceitasse.
Como resolver
Se você administra o servidor
- Para corpo vazio, envie Content-Length: 0 explicitamente (curl -d "" ou -H "Content-Length: 0").
- Em uploads, carregue o corpo em memória ou calcule o tamanho antes, para o cliente poder definir Content-Length em vez de mandar chunks.
- Se o servidor é seu, aceite corpo em chunks a menos que haja motivo para não aceitar; controle o tamanho com um limite de corpo.
Como enviar um 411
app.post('/ingest', (req, res, next) => {
if (req.get('Content-Length') === undefined) {
return res.status(411).json({ error: 'Content-Length header required' });
}
next();
});mux.HandleFunc("POST /ingest", func(w http.ResponseWriter, r *http.Request) {
// ContentLength is -1 when the client streamed a chunked body
if r.ContentLength == -1 {
http.Error(w, "Content-Length header required", http.StatusLengthRequired) // 411
return
}
// ...
})# Fails on servers that require a length
curl -X POST https://api.example.com/ingest
# Works: an explicit empty body sets Content-Length: 0
curl -X POST -d '' https://api.example.com/ingestCostuma ser confundido com
- 411 vs 413
- O 413 indica que o corpo declarado ou real é grande demais; o 411 indica que o tamanho nem foi informado.
- 411 vs 400
- O 400 é um pedido malformado em geral; o 411 aponta exatamente o cabeçalho que falta.
Perguntas frequentes
- Por que um POST vazio recebe 411?
- Sem corpo, alguns clientes nem mandam o Content-Length, e o servidor não consegue distinguir um corpo vazio de um corpo que ainda não chegou. Enviar Content-Length: 0 acaba com a dúvida.
- O erro 411 acontece em HTTP/2?
- Raramente. HTTP/2 e HTTP/3 marcam o fim do corpo nos próprios frames, então o cabeçalho de tamanho não é necessário. O 411 aparece mais em conexões HTTP/1.1 ou atrás de proxies que convertem para HTTP/1.1.
- Posso repetir um pedido que recebeu 411?
- Sim. A RFC 9110 permite explicitamente que o cliente repita o pedido depois de incluir um Content-Length válido.
Revisado em por Arielton Oberek.