417 Expectation Failed
Utilisation
Lorsque le message d’erreur 417 Expectation Failed est reçu, le client a indiqué une ou plusieurs conditions de négociation proactive dans l’en-tête Expect de la requête. Cela est lié à la réponse informationnelle 100.
Lorsqu’une requête est soumise avec l’en-tête Expect: 100-continue, le serveur examine les éléments pertinents de la requête. Ceux-ci incluent les champs d’en-tête Content-Type ou Content-Length. Si le serveur est disposé à accepter le corps du message, la réponse informationnelle 100 est renvoyée.
Si le serveur n’est pas disposé à accepter le corps du message, un statut approprié est envoyé, tel que 401 ou 405. L’erreur 417 Expectation Failed n’est renvoyée que lorsque le serveur ou la chaîne de réponse ne prend pas en charge les attentes. Si ce message est reçu, le client renvoie la requête sans l’en-tête Expect.
Impact SEO
Les moteurs de recherche comme Google n’indexent pas une URL dont le statut de réponse est 417 Expectation Failed. Les URL précédemment indexées sont retirées des résultats de recherche.
Considération particulière pour les clients
Un client qui envoie Expect: 100-continue n’est pas tenu d’attendre pendant une durée déterminée. Le client poursuit la transmission du corps du message sans avoir reçu de réponse au préalable. Comme les serveurs HTTP/1.0 ne prennent pas en charge les attentes, lorsque l’un d’eux sert d’intermédiaire, le client n’attend pas indéfiniment avant de transmettre le corps du message.
Considération particulière pour les serveurs
Si un serveur reçoit Expect: 100-continue dans une requête HTTP/1.0, l’attente doit être ignorée. Le serveur n’a pas besoin de répondre par un 100 si le corps du message a déjà été reçu ou s’il n’existe aucun corps de message.
Lorsqu’un serveur envoie un 100, un statut final tel que 200 doit finalement suivre, à moins que la connexion ne soit interrompue avant.
Si un serveur renvoie la réponse finale avant d’avoir reçu l’intégralité du corps du message, la réponse indique ce que le serveur compte faire de la connexion : fermer la connexion, ou continuer à lire et ignorer le message de requête.
Exemple
Le client demande à envoyer un fichier PDF de 10 Ko. Le serveur répond 417 Expectation Failed car les attentes ne sont pas prises en charge.
Requête
PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 10000
Expect: 100-continue
Réponse
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>
Comment corriger
Supprimez l’en-tête Expect: 100-continue et renvoyez la requête avec le corps complet inclus. Le serveur ou un proxy intermédiaire ne prend pas en charge le mécanisme 100-continue.
De nombreuses bibliothèques clientes HTTP ajoutent automatiquement l’en-tête Expect: 100-continue pour les charges utiles volumineuses, sans instruction explicite. Désactivez ce comportement au niveau de la bibliothèque :
Problèmes de proxy et d’intermédiaires. Les proxys HTTP/1.0, les répartiteurs de charge et les passerelles anciennes ne comprennent pas la négociation Expect: 100-continue. Lorsque la requête traverse un tel intermédiaire, le proxy la rejette avant que le serveur d’origine ne traite l’attente. Mettre à niveau le proxy ou contourner les intermédiaires HTTP/1.0 résout le problème dans ces environnements.
Côté serveur, ce statut est rare dans les piles HTTP modernes. La plupart des serveurs honorent Expect: 100-continue ou ignorent silencieusement l’en-tête. Renvoyer 417 est un signal délibéré demandant de retirer l’attente de la requête.
Références de code
.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