Código de status HTTP · Informativos (1xx)
100 Continue
O 100 Continue é uma resposta provisória que avisa o cliente de que os cabeçalhos do pedido foram aceitos e o corpo já pode ser enviado. Ele aparece quando o cliente manda Expect: 100-continue antes de um upload grande, para o servidor poder recusar logo no início em vez de receber gigabytes que seriam rejeitados.
| Classe | 1xx, Informativos |
|---|---|
| Definido em | RFC 9110 §15.2.1 |
| Pode ir para o cache por padrão | Não |
| Pode repetir o pedido | Não se aplica; é uma resposta provisória e o status final vem depois |
| Cabeçalhos relevantes |
|
O que significa o 100
A RFC 9110 descreve esse acordo nas seções 10.1.1 e 15.2.1. O cliente envia os cabeçalhos com Expect: 100-continue e espera. O servidor responde 100 Continue, e o cliente transmite o corpo, ou vai direto para um status final como 401, 413 ou 417, e o upload nem começa.
O cliente não precisa esperar para sempre. O curl aguarda um segundo por padrão (opção --expect100-timeout) e depois manda o corpo assim mesmo, por isso uploads através de um servidor ou proxy que ignora a expectativa começam com uma pausa curta e sem explicação. Navegadores ficam de fora: o padrão Fetch proíbe o cabeçalho Expect, então o 100 Continue só aparece com ferramentas de linha de comando, SDKs de armazenamento e chamadas entre servidores.
Quando usar
- Quase nunca você envia na mão: o Node responde 100 Continue sozinho, a não ser que você escute o evento checkContinue, e o Go envia na primeira vez que o handler lê r.Body.
- Assuma o controle quando quiser recusar uploads antes de começarem: confira Content-Length, autenticação ou cota primeiro, e só depois deixe o corpo passar.
Causas comuns
Se você administra o servidor
- Uploads travam por cerca de um segundo antes de começar: o cliente espera um 100 que o proxy ou servidor nunca envia.
- Um proxy ou equipamento antigo responde 417 Expectation Failed porque não entende o cabeçalho Expect.
Como resolver
Se você administra o servidor
- Desative a expectativa no cliente quando ele for seu: curl -H "Expect:" envia o corpo na hora.
- Garanta que cada intermediário repasse ou responda a expectativa; se algum não conseguir, remova o Expect na borda em vez de deixar os clientes esperando.
Como enviar um 100
Route handlers do Next.js e o FastAPI não oferecem gancho para isso: o servidor por baixo (Node ou Uvicorn) responde 100 Continue sozinho.
import http from 'node:http';
import app from './app.js'; // your Express app
const server = http.createServer(app);
// Without this listener Node answers 100 Continue by itself.
server.on('checkContinue', (req, res) => {
const size = Number(req.headers['content-length'] ?? 0);
if (size > 50 * 1024 * 1024) {
res.writeHead(413).end(); // refused before any byte is uploaded
return;
}
res.writeContinue(); // 100 Continue
app(req, res);
});
server.listen(3000);mux.HandleFunc("PUT /uploads/{name}", func(w http.ResponseWriter, r *http.Request) {
// Reject before reading: the client never uploads the body.
if r.ContentLength > 50<<20 {
http.Error(w, "file too large", http.StatusRequestEntityTooLarge)
return
}
f, err := os.Create(filepath.Join("uploads", filepath.Base(r.PathValue("name"))))
if err != nil {
http.Error(w, "cannot store file", http.StatusInternalServerError)
return
}
defer f.Close()
n, _ := io.Copy(f, r.Body) // first Read sends "100 Continue" (StatusContinue)
fmt.Fprintf(w, "stored %d bytes\n", n)
})# See the handshake: curl prints "HTTP/1.1 100 Continue" before the final status
curl -v -T big-file.bin https://example.com/uploads/big-file.bin
# Skip the handshake and send the body right away
curl -H "Expect:" -T big-file.bin https://example.com/uploads/big-file.binCostuma ser confundido com
- 100 vs 417
- O 417 Expectation Failed é a recusa: o servidor não atende o cabeçalho Expect, e o cliente deve repetir o pedido sem ele.
- 100 vs 103
- O 103 Early Hints também é provisório, mas traz cabeçalhos Link sobre a resposta; o 100 só trata de enviar ou não o corpo do pedido.
Perguntas frequentes
- Navegadores usam o 100 Continue?
- Não. O padrão Fetch proíbe que páginas definam o cabeçalho Expect, e o navegador não o envia por conta própria. O 100 Continue aparece com curl, SDKs de armazenamento como os da AWS enviando arquivos ao S3 e outros clientes fora do navegador.
- Por que o curl espera um segundo antes de enviar o arquivo?
- Em uploads maiores o curl manda Expect: 100-continue e aguarda até um segundo pela resposta 100. Se nada chega, ele envia o corpo assim mesmo. Use -H "Expect:" para pular a espera ou --expect100-timeout para mudar o tempo.
- O 100 Continue é um erro?
- Não. É uma resposta provisória 1xx, sempre seguida de um status final no mesmo pedido. É esse status final, um 201 ou um 413 por exemplo, que diz se o upload deu certo.
Revisado em por Arielton Oberek.