Skip to content

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.

Dados sobre este código de status
Classe1xx, Informativos
Definido emRFC 9110 §15.2.1
Pode ir para o cache por padrãoNão
Pode repetir o pedidoNão se aplica; é uma resposta provisória e o status final vem depois
Cabeçalhos relevantes
  • Expect: cabeçalho do pedido; 100-continue pede autorização antes de enviar o corpo

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.

Express (Node.js)
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);
Go net/http
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)
})
Terminal
# 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.bin

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