Sto scrivendo un server HTTP semplicistico che accetterà richieste PUT principalmente da cURL come client e sto avendo un po 'di problemi con la gestione dell'intestazione Expect: 100-continue
.Come gestire il messaggio HTTP "100 continue"?
Da quanto ho capito, si suppone al server di leggere l'intestazione, inviare una risposta HTTP/1.1 100 Continue
sulla connessione, leggere il flusso fino al valore su Content-Length
e quindi inviare di nuovo il codice di risposta reale (Di solito HTTP/1.1 200 OK
ma qualsiasi altro la risposta HTTP valida dovrebbe fare).
Bene, questo è esattamente ciò che fa il mio server. Il problema è che, apparentemente, se invio una risposta 100 Continue
, cURL non riesce a segnalare alcun successivo codice di errore HTTP e presume che il caricamento sia stato un successo. Ad esempio, se il caricamento viene rifiutato a causa della natura del contenuto (si verifica un controllo dei dati di base), voglio che il client chiamante rilevi il problema e agisca di conseguenza.
Mi manca qualcosa di ovvio?
edit: ecco un esempio di output da cURL con un colpo di testa secondaria contenente un errore:
> 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
<
è che non è necessario riga vuota dopo 'HTTP/1.1 100 CONTINUE? – YOU
Ce n'è uno. Il fatto che non venga registrato sembra essere un problema di visualizzazione con cURL. – Stephane
Giusto per chiarire, inviare una risposta HTTP completamente valida ('HTTP/1.1 100 Continue \ r \ n \ r \ n') non semplicemente la stringa' "HTTP/1.1 100 Continua" '. Il client cURL attenderà fino a quando non riceverà queste due sequenze e se si arrenderà, produrrà (in modalità dettagliata) il messaggio "Fatto aspettare 100-continua". –
bishop