417 Expectation Failed
Uso
Cuando se recibe el mensaje de error 417 Expectation Failed, el cliente indicó una o varias condiciones para la negociación proactiva en la cabecera Expect de la solicitud. Esto está relacionado con la respuesta informativa 100.
Cuando se envía una solicitud con la cabecera Expect: 100-continue, el servidor examina los detalles pertinentes de la solicitud. Entre ellos están los campos de cabecera Content-Type o Content-Length. Si el servidor está dispuesto a aceptar el cuerpo del mensaje, se devuelve la respuesta informativa 100.
Si el servidor no está dispuesto a aceptar el cuerpo del mensaje, envía un estado apropiado, como 401 o 405. El error 417 Expectation Failed solo se devuelve cuando el servidor o la cadena de respuesta no admiten expectativas. Si se recibe este mensaje, el cliente reenvía la solicitud sin la cabecera Expect.
Impacto en SEO
Los motores de búsqueda como Google no indexarán una URL con un estado de respuesta 417 Expectation Failed. Las URL indexadas previamente se eliminarán de los resultados de búsqueda.
Consideración especial para los clientes
Un cliente que envía Expect: 100-continue no está obligado a esperar durante un tiempo determinado. El cliente puede proceder a transmitir el cuerpo del mensaje sin haber recibido antes una respuesta. Dado que los servidores HTTP/1.0 no admiten expectativas, cuando uno de ellos actúa como intermediario, el cliente no espera de forma indefinida antes de transmitir el cuerpo del mensaje.
Consideración especial para los servidores
Si un servidor recibe Expect: 100-continue como parte de una solicitud HTTP/1.0, debe ignorar la expectativa. El servidor no necesita confirmar con un 100 si el cuerpo del mensaje ya se ha recibido o si no existe cuerpo del mensaje.
Cuando un servidor envía un 100, debe seguirle finalmente un estado final como 200, salvo que la conexión se interrumpa antes.
Si un servidor responde con la respuesta final antes de recibir el cuerpo completo del mensaje, la respuesta indica qué pretende hacer el servidor con la conexión: cerrarla o seguir leyendo y descartar el mensaje de solicitud.
Ejemplo
El cliente solicita enviar un archivo PDF de 10K. El servidor responde con 417 Expectation Failed porque no admite expectativas.
Solicitud
PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 10000
Expect: 100-continue
Respuesta
HTTP/1.1 417 Expectation Failed
Content-Type: text/html
Content-Length: 159
<html>
<head>
<title>Expectations not supported</title>
</head>
<body>
<p>Expectations are not supported by this server.
</p>
</body>
</html>
Cómo solucionarlo
Elimine la cabecera Expect: 100-continue y reenvíe la solicitud incluyendo el cuerpo completo. El servidor o un proxy intermediario no admite el mecanismo 100-continue.
Muchas bibliotecas cliente de HTTP añaden la cabecera Expect: 100-continue de forma automática para cargas útiles grandes, sin indicación explícita. Desactive este comportamiento a nivel de la biblioteca:
Problemas con proxies e intermediarios. Los proxies HTTP/1.0, los equilibradores de carga y las pasarelas antiguas no entienden el intercambio Expect: 100-continue. Cuando la solicitud atraviesa uno de esos intermediarios, el proxy la rechaza antes de que el servidor de origen procese la expectativa. Actualizar el proxy o evitar el paso por intermediarios HTTP/1.0 resuelve el problema en estos entornos.
En el lado del servidor, este estado es poco frecuente en las pilas HTTP modernas. La mayoría de los servidores o bien respetan Expect: 100-continue, o bien ignoran la cabecera en silencio. Devolver 417 es una señal deliberada para que se elimine la expectativa de la solicitud.
Referencias de código
.NET
HttpStatusCode.ExpectationFailed
Rust
http::StatusCode::EXPECTATION_FAILED
Rails
:expectation_failed
Go
http.StatusExpectationFailed
Symfony
Response::HTTP_EXPECTATION_FAILED
Python3.5+
http.HTTPStatus.EXPECTATION_FAILED
Java
HttpServletResponse.SC_EXPECTATION_FAILED
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_EXPECTATION_FAILED
Angular
@angular/common/http/HttpStatusCode.ExpectationFailed