Código de status HTTP · Erros do cliente (4xx)
Erro 417 Expectation Failed
O erro 417 Expectation Failed significa que algum servidor no caminho não conseguiu atender o que o cabeçalho Expect pediu. Na prática o cabeçalho é Expect: 100-continue num upload grande, e um proxy antigo no meio não oferece suporte.
| Classe | 4xx, Erros do cliente |
|---|---|
| Definido em | RFC 9110 §15.5.18 |
| Pode ir para o cache por padrão | Só com Cache-Control ou Expires explícitos |
| Pode repetir o pedido | Sim, a RFC 9110 manda repetir o pedido sem o cabeçalho Expect |
| Cabeçalhos relevantes |
|
O que significa o 417
A RFC 9110, seção 15.5.18, define o 417 como a expectativa do cabeçalho Expect não ter sido atendida por pelo menos um servidor no caminho. A seção 10.1.1 define 100-continue como a única expectativa; um servidor que recebe outro valor pode recusar com 417. O cliente que recebe 417 depois de mandar 100-continue deve reenviar sem ele, porque o 417 só indica que a cadeia, talvez passando por um trecho HTTP/1.0, não suporta expectativas.
Node.js e Go respondem 417 sozinhos para um Expect diferente de 100-continue. No Node dá para interceptar isso com o evento checkExpectation do servidor.
Causas comuns
Se você administra o servidor
- O cliente HTTP inclui Expect: 100-continue em uploads grandes (o curl faz isso em POSTs grandes, o HttpWebRequest do .NET fazia por padrão) e um proxy antigo recusa.
- Código próprio define um valor de Expect diferente de 100-continue, que servidores Node.js e Go recusam automaticamente.
Como resolver
Se você administra o servidor
- Reenvie sem o cabeçalho. No curl, passe -H "Expect:" para removê-lo; no .NET, defina ServicePointManager.Expect100Continue = false ou DefaultRequestHeaders.ExpectContinue = false no HttpClient.
- Atualize ou reconfigure o proxy para ele repassar o Expect: 100-continue ou responder 100 Continue por conta própria.
Como diagnosticar o 417
Node.js e Go geram 417 automaticamente para expectativas desconhecidas, então quase nunca há motivo para enviá-lo num handler. No Node, escute o evento checkExpectation do http.Server se quiser aceitar um valor próprio.
# Suppress curl's automatic Expect: 100-continue
curl -H 'Expect:' -T big-file.bin https://upload.example.com/files/Costuma ser confundido com
- 417 vs 100
- O 100 Continue é a resposta positiva ao Expect: 100-continue; o 417 é a negativa.
- 417 vs 412
- O 412 falha numa condição If-* sobre o recurso; o 417 falha no cabeçalho Expect, que trata da cadeia de conexão.
Perguntas frequentes
- Para que serve o Expect: 100-continue?
- Ele pede ao servidor que confirme com 100 Continue antes do cliente enviar um corpo grande, assim o servidor pode recusar o pedido (401, 413) sem desperdiçar o upload.
- Como impedir o curl de mandar Expect: 100-continue?
- Adicione -H "Expect:" ao comando. Um cabeçalho com valor vazio faz o curl tirá-lo da requisição.
- É seguro repetir o pedido depois de um 417?
- Sim. A RFC 9110 diz que o cliente que recebe 417 em resposta a uma expectativa 100-continue deve repetir o pedido sem ela.
Revisado em por Arielton Oberek.