web-dev-qa-db-ja.com

HTTPチャンクエンコーディング。 SPECに記載されている「トレーラー」の例が必要

透過プロキシ用のHTTPパーサーを作成しています。私を困惑させているのは、Trailer:の仕様に記載されているTransfer-Encoding: chunkedです。それはどのように見えますか?

通常、HTTPチャンクはこのように終了します。

0\r\n
\r\n

私が混乱しているのは、ある種の末尾ヘッダーがある場合にチャンクの終わりを検出する方法です...

PDATE:単純な\r\n\r\n、つまり空の行で、末尾のヘッダーの終わりを検出するのに十分だと思います... あれは正しいですか?

25
unixman83

0\r\n
SomeAfterHeader:TheData \ r\n
\ r\n

言い換えれば、素人の言葉で\r\n\r\nを探すだけで十分です:空白行。チャンク送信の終了を検出します。ただし、これを行う前に各チャンクを読み取ることが非常に重要です。チャンク化されたデータ自体に空白行が含まれている可能性があるため、ストリームの終わりとして誤って検出されます。

15
unixman83

以下は、私がコピーしたトレーラーの例のコピーです TCP/IPガイドサイト 。 trailer sample

ご覧のとおり、トレーラーヘッダーを使用する場合は、ヘッダー名を含む「Trailer:header_name」ヘッダーフィールドを追加してから、チャンク化された本文領域の後にトレーラーヘッダーエンティティを追加する必要があります。

RFCに従って、HTTPボディに0個以上のトレーラーヘッダーを追加できます。 RFC72 のセクション4.1.2は、トレーラーヘッダー領域での次のヘッダーの使用を禁止しています。

送信者は、メッセージのフレーミング(Transfer-EncodingやContent-Lengthなど)、ルーティング(Hostなど)、リクエスト修飾子( のセクション5のコントロールや条件など)に必要なフィールドを含むトレーラーを生成してはなりません。 RFC7231 )、認証(たとえば、 RFC7235 および RFC6265 を参照)、応答制御データ(たとえば、 RFC7231 のセクション7.1を参照)、または、ペイロードの処理方法を決定します(たとえば、Content-Encoding、Content-Type、Content-Range、Trailer)。

これは、トレーラーヘッダー領域で他の標準ヘッダーとカスタムヘッダーを使用できることを意味します。

16
appleleaf

予告編について:

ご存知のように、トレーリングヘッダーのリストはTrailerヘッダーで指定する必要があります。

RFC 2616のセクション14.4 のBNFは次のとおりです。

Trailer  = "Trailer" ":" 1#field-name

GourleyとTottyはこの例を示しています。

Trailer: Content-Length

(14.40ではContent-Lengthが末尾のヘッダーになることが明示的に禁止されているため、この例を示すのは奇妙です。)

Shiflettはこの例を示しています:

Trailer: Date

末尾にヘッダーがあるメッセージの終わりについて:

RFC 2616のセクション3.6.1 のBNFはあなたが探しているものです。ここに一部があります:

Chunked-Body = *chunk
               last-chunk
               trailer
               CRLF
last-chunk   = 1*("0") [ chunk-extension ] CRLF
trailer      = *(entity-header CRLF)

したがって、最後のチャンクと2つの末尾のヘッダーは次のようになります。

0<CRLF>
Date:Sun, 06 Nov 1994 08:49:37 GMT<CRLF>
Content-MD5:1B2M2Y8AsgTpgAmY7PhCfg==<CRLF>
<CRLF>
15
james.garriss