J'écris un serveur HTTP simpliste qui acceptera les requêtes PUT principalement de cURL en tant que client et j'ai un peu de problème avec la gestion de l'en-tête Expect: 100-continue
.Comment gérer le message HTTP "100 continuer"?
Si je comprends bien, le serveur est censé lire l'en-tête, renvoyer une réponse HTTP/1.1 100 Continue
sur la connexion, lire le flux jusqu'à la valeur sur Content-Length
puis renvoyer le code de réponse réelle (généralement HTTP/1.1 200 OK
mais tout autre réponse HTTP valide devrait faire).
Eh bien, c'est exactement ce que fait mon serveur. Le problème est que, apparemment, si j'envoie une réponse 100 Continue
, cURL ne signale aucun code d'erreur HTTP suivant et suppose que le téléchargement a réussi. Par exemple, si le téléchargement est rejeté en raison de la nature du contenu (une vérification des données de base est en cours), je souhaite que le client appelant détecte le problème et agisse en conséquence.
Est-ce que quelque chose me manque?
edit: voici un exemple de sortie de cURL avec un en-tête secondaire contenant une erreur:
> PUT /test1%2Epdf HTTP/1.1
> Authorization: Basic xxxx
> User-Agent: curl/7.20.0 (i386-pc-win32) libcurl/7.20.0 OpenSSL/0.9.8l zlib/1.2.3
> Host: localhost
> Accept: */*
> Content-Length: 24
> Expect: 100-continue
>
< HTTP/1.1 100 Continue
< HTTP/1.1 415 Unsupported Media Type
< Connection: close
< Content-Type: text/xml
< Content-Length: 289
<
ne vous besoin ligne vide après 'HTTP/1.1 100 CONTINUE? – YOU
Il y en a un. Le fait qu'il ne soit pas enregistré semble être un problème d'affichage avec cURL. – Stephane
Juste pour clarifier, renvoyez une réponse HTTP complètement valide ('HTTP/1.1 100 Continue \ r \ n \ r \ n') et pas simplement la chaîne' "HTTP/1.1 100 Continue" '. Le client cURL attendra jusqu'à ce qu'il reçoive les deux séquences, et s'il abandonne, il affichera (en mode verbeux) le message "Fait attendre 100-continuer". –
bishop