Skip to content

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.

Dados sobre este código de status
Classe4xx, Erros do cliente
Definido emRFC 9110 §15.5.12
Pode ir para o cache por padrãoSó com Cache-Control ou Expires explícitos
Pode repetir o pedidoSim, depois que o pedido levar um Content-Length válido
Cabeçalhos relevantes
  • Content-Length: cabeçalho do pedido que o servidor exige; use Content-Length: 0 para corpo vazio
  • Transfer-Encoding: uploads em chunks não têm tamanho conhecido de início, e é isso que alguns servidores recusam

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

Express (Node.js)
app.post('/ingest', (req, res, next) => {
  if (req.get('Content-Length') === undefined) {
    return res.status(411).json({ error: 'Content-Length header required' });
  }
  next();
});
Go net/http
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
	}
	// ...
})
Terminal
# 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/ingest

Costuma 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.