41 Stimmen

gzip-Komprimierung von Chunked-Coding-Antworten?

Ich versuche, meinen Webserver dazu zu bringen, eine HTTP-Antwort mit Chunk-Kodierung korrekt zu gzipen.

Nach meinem Verständnis sieht die Nicht-Gzip-Antwort folgendermaßen aus:

<the response headers>

und dann für jeden Chunk,

<chunk length in hex>\r\n<chunk>\r\n

und schließlich ein Chunk der Länge Null:

0\r\n\r\n

Ich habe versucht, die gzip-Komprimierung zum Laufen zu bringen, und ich könnte etwas Hilfe dabei gebrauchen, herauszufinden, was eigentlich zurückgegeben werden sollte. Diese Dokumentation impliziert, dass die gesamte Antwort gzipped werden sollte, im Gegensatz zu gzipping jedes Chunk:

HTTP servers sometimes use compression (gzip) or deflate methods to optimize transmission.
Chunked transfer encoding can be used to delimit parts of the compressed object.
In this case the chunks are not individually compressed. Instead, the complete payload 
is compressed and the output of the compression process is chunk encoded.

Ich habe versucht, das ganze Ding zu gzipen und die Antwort auch ohne chunked zurückzugeben, aber es hat nicht funktioniert. Ich habe versucht, den Content-Encoding-Header auf "gzip" zu setzen. Kann mir jemand erklären, welche Änderungen an dem obigen Schema vorgenommen werden müssen, um das Gzipen von Chunks zu unterstützen? Danke!

41voto

sosiouxme Punkte 1196

Falls die anderen Antworten nicht deutlich genug waren:

Zuerst gzipst du den Body mit zlib (das kann in einem Stream geschehen, so dass du nicht alles auf einmal im Speicher brauchst, was ja der Sinn des Chunking ist).

Dann senden Sie den komprimierten Body in Chunks (vermutlich die vom gzip-Stream bereitgestellten, mit dem Chunk-Header zur Angabe der Länge), mit den Headern Content-Encoding: gzip und Transfer-Encoding: chunked (und keinem Content-Length-Header).

Wenn Sie gzip oder zcat oder ein anderes Dienstprogramm für die Komprimierung verwenden, wird es wahrscheinlich nicht funktionieren. Es muss zlib sein. Wenn Sie die Chunks erstellen und sie dann komprimieren, wird das definitiv nicht funktionieren. Wenn Sie glauben, dass Sie alles richtig machen und es nicht funktioniert, können Sie versuchen, ein Paketprotokoll zu erstellen und anhand dessen und der Fehlermeldungen, die Sie erhalten, Fragen zu stellen.

0 Stimmen

ZU IHRER INFORMATION. string in gzip konvertieren

29voto

Julian Reschke Punkte 37371

Sie gzipen den Inhalt und wenden erst dann die Chunked-Kodierung an:

"Da "chunked" die einzige Übertragungscodierung ist, die von HTTP/1.1-Empfängern verstanden werden muss, spielt sie eine entscheidende Rolle bei der Abgrenzung von Nachrichten auf einer dauerhaften Verbindung. Wann immer eine Übertragungskodierung auf einen Nutzdatenkörper in einer Anfrage angewendet wird, MUSS die endgültige Übertragungskodierung "chunked" sein. Wird eine Übertragungskodierung auf einen Nutzdatenkörper einer Antwort angewandt, MUSS entweder die endgültige Übertragungskodierung "chunked" sein oder die Nachricht MUSS durch Schließen der Verbindung beendet werden. Wenn die "chunked"-Transferkodierung verwendet wird, MUSS sie die letzte Transferkodierung sein, die zur Bildung des Nachrichtenkörpers verwendet wird. Die "chunked"-Transferkodierung MUSS NICHT mehr als einmal in einem Nachrichtentext verwendet werden.

( HTTPbis Teil1, Abschnitt 6.2.1 )

2 Stimmen

Der erste Satz in diesem Text ist wirklich verwirrend. Ich denke, es sollte geändert werden.....you gzip jeder Chunk Körper (Ich habe es gerade implementiert und es funktionierte wie ein Charme). Sie nicht gzip den gesamten Inhalt dann Chunked Encoding anwenden. Sie gzip jeden Körper und markieren Sie die Chunk-Größe als die komprimierte Byte-Array-Größe.

0 Stimmen

HTTP/1.1 hat drei Möglichkeiten definiert, um zu unterscheiden, wo eine Nachricht endet und die nächste beginnt (HTTP-Pipelining, persistente Verbindungen): content-length header, transfer-encoding header und als allerletzte Priorität, wenn keine der oben genannten vorhanden sind, das Schließen der Verbindung.

1voto

unixman83 Punkte 8807

Wahrscheinlich senden Sie nicht wirklich eine ordnungsgemäß gepackte Antwort.

Versuchen Sie die Einstellung window bits a 31 in zlib. Und verwenden deflateInit2() .

1 Stimmen

Dabei werden einige Annahmen über die Umsetzung getroffen. Was wäre, wenn er, um eine komprimierte Datei zurückzugeben, einfach den Befehl "gzip" zum Komprimieren der Datei verwenden und diese zurückgeben würde, während er den Header Content-Encoding: gzip setzt? Ergibt das die gleiche Ausgabe?

0 Stimmen

Der HTTP-Standard verlangt eigentlich, dass die zlib Bibliothek verwendet werden. Die gzip wird mehr Header ausgeben, aber das MUSS mit zlib kompatibel sein, das in den meisten anderen HTTP-Clients/Servern verwendet wird.

0 Stimmen

Es ist wahrscheinlicher, dass der Poster nicht die Content-Length Header oder sendet die Chunked-Antwort nicht ordnungsgemäß oder vergisst etwas Grundlegendes wie einen abschließenden Zeilenumbruch nach den Headern.

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