6 Stimmen

Tomcat gzip während chunked Problem

Ich erlebe ein Problem mit einem meiner Datenquellendienste. Wie es in den HTTP-Antwort-Headern steht, läuft er auf Apache-Coyote/1.1. Der Server gibt Antworten mit Transfer-Encoding: chunked, hier eine Beispielantwort:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked
Content-Encoding: gzip
Date: Tue, 30 Mar 2010 06:13:52 GMT

Und das Problem ist, wenn ich den Server auffordere, eine gzipped-Anfrage zu senden, wird oft keine vollständige Antwort gesendet. Ich erhalte die Antwort und sehe, dass der letzte Chunk empfangen wurde, aber nach dem Unzippen sehe ich, dass die Antwort nur teilweise ist. Ich habe ein solches Verhalten noch nie gesehen, wenn gzip in den Anforderungs-Headern ausgeschaltet ist.

Also meine Frage ist: ist es gemeinsame Tomcat Problem? vielleicht einer seiner Mod, die Kompression tut? Oder ist es vielleicht eine Art von Proxy-Problem? Ich kann nicht sagen, über die Versionen von tomcat oder welche gzip mod sie verwenden, aber fühlen Sie sich frei zu fragen, ich werde versuchen, fragen Sie meinen Dienstanbieter.

Danke.

3voto

BalusC Punkte 1034465

Da die Länge des Inhalts einer gzipped-Antwort nicht vorhersehbar ist und es potenziell teuer und langsam ist, sie zuerst vollständig im Speicher zu komprimieren, dann die Länge zu berechnen und dann die gzipped-Antwort aus dem Speicher zu streamen, sendet der durchschnittliche Webserver sie in Stücken mit Transfer-Encoding: chunked ohne a Content-Length Kopfzeile.

Da es sich um einen selbstentwickelten HTTP-Client handelt, klingt es so, als ob er chunked-Anfragen nicht korrekt verarbeitet. Sie müssen die Transfer-Encoding Antwort-Header und wenn er gleich ist mit chunked dann müssen Sie ihn als Chunked Stream parsen.

Sie können aus den oben erwähnten Links zu den HTTP-Spezifikationen lernen und aus Wikipedia wie man einen Chunked Stream parst. Jeder Chunk besteht aus einem Header, der die Chunk-Länge in hexadezimaler Form angibt, dann ein CRLF, dann der eigentliche Chunk-Inhalt, dann ein CRLF. Dies wird so lange wiederholt, bis ein Chunk mit einem Header, der die Chunk-Länge von 0 . Sie müssen die Chunks einzeln entpacken und dann zusammenfügen.

Um sich die ganze mühsame Programmierarbeit zu ersparen (wahrscheinlich auch für den Rest Ihres selbstentwickelten HTTP-Clients), empfehle ich dringend, einen Blick auf Apache HttpComponents Client .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X