28

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

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

0\r\n
\r\n

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

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

4

3 に答える 3

16

予告編について:

お気づきのように、末尾のヘッダーのリストは Trailer ヘッダーで指定する必要があります。

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

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

Gourley と Totty は次の例を示します。

Trailer: Content-Length

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

シフレットは次の例を示します。

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>
于 2012-07-03T14:36:01.347 に答える
15

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

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

于 2011-04-15T09:41:18.110 に答える