透過プロキシ用のHTTPパーサーを作成しています。私を困惑させているのは、Trailer:
の仕様に記載されているTransfer-Encoding: chunked
です。それはどのように見えますか?
通常、HTTPチャンクはこのように終了します。
0\r\n
\r\n
私が混乱しているのは、ある種の末尾ヘッダーがある場合にチャンクの終わりを検出する方法です...
PDATE:単純な\r\n\r\n
、つまり空の行で、末尾のヘッダーの終わりを検出するのに十分だと思います... あれは正しいですか?
0\r\n
SomeAfterHeader:TheData \ r\n
\ r\n
言い換えれば、素人の言葉で\r\n\r\n
を探すだけで十分です:空白行。チャンク送信の終了を検出します。ただし、これを行う前に各チャンクを読み取ることが非常に重要です。チャンク化されたデータ自体に空白行が含まれている可能性があるため、ストリームの終わりとして誤って検出されます。
以下は、私がコピーしたトレーラーの例のコピーです TCP/IPガイドサイト 。
ご覧のとおり、トレーラーヘッダーを使用する場合は、ヘッダー名を含む「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)。
これは、トレーラーヘッダー領域で他の標準ヘッダーとカスタムヘッダーを使用できることを意味します。
予告編について:
ご存知のように、トレーリングヘッダーのリストは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>