2011-12-16 14 views
5

Sembra che nginx non supporti bene le richieste Chunked. Ma sto cercando di ottenere una risposta più definitiva (e attuale). Ho un client che effettua una richiesta SOAP a un server da un client Java che imposta l'intestazione Transfer-Encoding: chunked. Funziona tutto bene quando mi collego direttamente alla mia applicazione su Tomcat.Come effettuare una richiesta Chunked via nginx

Ma quando inserisco nginx tra di loro, le cose si spezzano.

Per aggiungere alcuni dettagli: Sto lavorando con CloudFoundry. Sto usando Micro Cloud Foundry per confermare che le cose funzionino come previsto in assenza di nginx. Ma il mio requisito è usare cloudfoundry.com, quindi non ho la possibilità di bypassare nginx lì.

This question and answer dice che questa è forse la mia unica soluzione: http://wiki.nginx.org/NginxHttpChunkinModule. Ma questa soluzione alternativa non è disponibile, dal momento che non posso modificare la configurazione su cloudfoundry.com.

This question sembra simile, ma in realtà copre il contrario di questo requisito. Copre le risposte bocciate piuttosto che le richieste chunked.

Quindi che ne dici di eventuali modifiche sul client per aggirare questo problema? È possibile inviare sia Transfer-Encoding: chunked e Content-Length: 123 come intestazioni? Quest'area è nuova per me, ma da progetti come Apache HttpComponents sembra che uno possa impostare la lunghezza o il chunking ma non entrambi. Il punto di suddivisione in blocchi è che non è necessario conoscere la lunghezza all'avvio della richiesta. Posso dire al mio cliente di usare HTTP/1.0 e giocare bene con nginx senza chunking? Ci sono altre idee alternative che sto dimenticando?

risposta

4

Ho raccolto le risposte a tutte le parti di questa domanda.

Base nginx non supporta le richieste Chunked (come confermato da Alexander!). Nginx può supportare la richiesta Chunked utilizzando NginXHttpCunkinModule (come indicato nella mia domanda). Migliore: questo modulo è passato dallo stato beta alla qualità della produzione più di 18 mesi fa. Migliore: ho parlato con alcuni membri del team di ingegneri di CloudFoundry al recente meetup; confermano che è previsto l'aggiunta di questo modulo alla loro versione di nginx. Problema risolto. (Bene, è completamente risolto a lungo termine, ma non abbiamo una data esatta per quando aspettarci questo.)

Quindi una soluzione a breve termine sarebbe anche bella. Ne ho trovato uno.

Rispondere alla domanda indirizzata ad Alexander: Non è possibile inviare "Content-Length" con messaggi chunked. Questo è davvero il punto dei messaggi chunked: inizi a inviarli prima di avere il contenuto completo, quindi non puoi ancora conoscere la lunghezza. Quindi la sua idea di evitare le richieste Chunked è corretta. Ma per essere più pratico direi, "Usa HTTP/1.0 piuttosto che HTTP/1.1." Questo ha l'effetto di non inviare messaggi chunked. Siamo stati in grado di riparare temporaneamente il nostro client per testare questa idea. Ha funzionato. Ma non abbiamo in programma di implementare una patch pubblica. Sembra controproducente far sì che tutti utilizzino un protocollo di dieci anni (e una libreria client non supportata di 10 anni!) Per risolvere il problema di questa situazione.

Invece userò il client compromesso quando necessario, invierò un'e-mail se gli altri ne avessero bisogno, e aspetteremo l'aggiornamento di CloudFoundry a HttpChunkin e HTTP/1.1.

2

Nginx non supporta le richieste Chunked. Restituisce 411 Content Length required in assenza dell'intestazione Content-Length.

Dato che si sta controllando il codice cliente, suppongo che l'unica scelta sia quella di evitare l'uso di richieste chunked e di specificare esplicitamente Content-Length.

+0

È possibile inviare sia la codifica di trasferimento: Chunked e Content-Length: 123 come intestazioni? È comune? – mdahlman

Problemi correlati