HTTPQUERY
Français

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