38

チャンク エンコーディングである http 応答を正しく gzip するように Web サーバーを取得しようとしています。

gzip 以外の応答についての私の理解は、次のようになるということです。

<the response headers>

そして、各チャンクに対して、

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

最後に、長さゼロのチャンク:

0\r\n\r\n

gzip圧縮を機能させようとしましたが、実際に何が返されるべきかを理解するのに役立つことができました. このドキュメントは、各チャンクを gzip するのではなく、応答全体を gzip する必要があることを意味します。

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.

全体を gzip して、チャンクなしでも応答を返そうとしましたが、うまくいきませんでした。Content-Encoding ヘッダーを「gzip」に設定してみました。チャンクの gzip 圧縮をサポートするには、上記のスキームにどのような変更を加える必要があるかを誰かが説明できますか? ありがとう。

4

3 に答える 3

37

他の回答が十分に明確でない場合:

最初に、zlib を使用して本体を gzip します (これはストリームで実行できるため、メモリ内のすべてを一度に必要としません。これがチャンクの要点です)。

次に、その圧縮された本文をチャンクで送信します (おそらく gzip ストリームによって提供されるもので、その長さを宣言するためのチャンク ヘッダーを使用)。ヘッダ)。

圧縮に gzip や zcat などのユーティリティを使用している場合、おそらく機能しません。zlib である必要があります。チャンクを作成してから圧縮する場合、それは間違いなく機能しません。これを正しく行っているのにうまくいかない場合は、パケット トレースを取得し、それとエラー メッセージに基づいて質問してみてください。

于 2012-02-02T19:56:44.503 に答える
27

コンテンツを gzip してから、チャンク エンコーディングを適用します。

「「チャンク」は、HTTP/1.1 受信者が理解する必要がある唯一の転送コーディングであるため、永続的な接続でメッセージを区切る上で重要な役割を果たします。転送コーディングが要求のペイロード本体に適用されるときはいつでも、適用される最終転送コーディングは「チャンク」する必要があります. 転送コーディングが応答ペイロード本体に適用される場合は、適用される最終転送コーディングを「チャンク」するか、接続を閉じてメッセージを終了する必要があります. 「チャンクされた」転送コーディングが使用されている場合、メッセージ本文を形成するために適用される最後の転送コーディングでなければなりません.「チャンクされた」転送コーディングは、メッセージ本文で複数回適用してはなりません.

( HTTPbis Part1、セクション 6.2.1 )

于 2011-04-08T06:56:28.850 に答える
1

適切に gzip された応答を実際に送信していない可能性があります。

zlibでwindow bitstoを設定してみてください。31そして使用しますdeflateInit2()

于 2011-04-08T05:30:07.560 に答える