Skip to content

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.

Dados sobre este código de status
Classe4xx, Erros do cliente
Definido emRFC 9110 §15.5.18
Pode ir para o cache por padrãoSó com Cache-Control ou Expires explícitos
Pode repetir o pedidoSim, a RFC 9110 manda repetir o pedido sem o cabeçalho Expect
Cabeçalhos relevantes
  • Expect: cabeçalho do pedido; só 100-continue é definido, qualquer outro valor pode gerar 417

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.

Terminal
# 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.