100 Continue
Utilisation
Les clients qui incluent l’en-tête Expect souhaitent confirmer que le serveur est prêt à recevoir le corps du message avant de le transmettre. Lorsque le corps du message est volumineux, qu’il emploie un type de contenu que le serveur n’accepte pas, ou que l’utilisateur n’a pas l’autorisation d’envoyer des fichiers, ce procédé valide ces conditions avant tout envoi du corps.
Dès que le code de statut 100 Continue parvient au client, le corps du message est envoyé. Si le serveur renvoie 417 à la place, le client ne poursuit pas.
L’intérêt d’utiliser l’en-tête Expect avec 100-continue est d’économiser de la bande passante lorsque le serveur se montre sélectif quant au contenu qu’il reçoit et traite.
L’inconvénient tient à ce que l’en-tête et le corps de la requête HTTP sont envoyés indépendamment. Certains environnements ont tendance à les dissocier et à renvoyer une erreur au lieu de traiter la requête HTTP.
Exemple
Requête
PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 99000
Expect: 100-continue
Réponse
HTTP/1.1 100 Continue
Suite donnée à la requête
<PDF file contents are sent as message body>
Réponse finale
HTTP/1.1 200 OK
Le client prévoit d’envoyer au serveur un fichier PDF de 99 Ko pour traitement et le signale dans la requête HTTP, en demandant une validation préalable. Le serveur répond favorablement et le client envoie alors le corps du message. En guise de réponse finale, le serveur clôt la session HTTP par une indication de succès.
Autre cas de figure, le serveur répond par une erreur :
HTTP/1.1 417 Expectation Failed
Dans cette situation, le client n’envoie pas le PDF, et la suite des échanges reprend avec une nouvelle requête HTTP.
Expect100Continue dans les bibliothèques clientes
De nombreuses bibliothèques clientes HTTP exposent Expect100Continue sous forme de propriété configurable. En .NET, ServicePointManager.Expect100Continue détermine si les requêtes POST et PUT incluent automatiquement l’en-tête Expect: 100-continue. Désactiver cette propriété court-circuite la vérification préliminaire et envoie le corps immédiatement.
Références de code
.NET
HttpStatusCode.Continue
Rust
http::StatusCode::CONTINUE
Rails
:continue
Go
http.StatusContinue
Symfony
Response::HTTP_CONTINUE
Python3.5+
http.HTTPStatus.CONTINUE
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_CONTINUE
Angular
@angular/common/http/HttpStatusCode.Continue