4. Transfer Codings (転送エンコーディング)
転送エンコーディング (Transfer codings) 名は、ネットワーク経由での"安全な転送"を確保するために、ペイロード本文に適用された、適用できる、または適用する必要がある可能性のあるエンコーディング変換を示すために使用されます。
transfer-coding = "chunked"
/ "compress"
/ "deflate"
/ "gzip"
/ transfer-extension
transfer-extension = token *( OWS ";" OWS transfer-parameter )
transfer-parameter = token BWS "=" BWS ( token / quoted-string )
4.1. Chunked Transfer Coding (チャンク転送エンコーディング)
チャンク転送エンコーディング (chunked transfer coding) は、ペイロード本文を一連のチャンクにラップし、各チャンクには独自のサイズインジケータがあり、その後にオプションでトレーラーフィールドを含むトレーラーセクションが続きます。
chunked-body = *chunk
last-chunk
trailer-part
CRLF
chunk = chunk-size [ chunk-ext ] CRLF
chunk-data CRLF
chunk-size = 1*HEXDIG
last-chunk = 1*("0") [ chunk-ext ] CRLF
chunk-data = 1*OCTET
chunk-size (チャンクサイズ) フィールドは、チャンクデータのサイズ (オクテット単位) を示す16進数の文字列です。
受信者は、チャンク転送エンコーディングを解析およびデコードできなければなりません。
4.1.1. Chunk Extensions (チャンク拡張)
チャンク転送エンコーディングでは、各チャンクにゼロ個以上のチャンク拡張 (chunk extensions) を含めることができます。
chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-val ] )
chunk-ext-name = token
chunk-ext-val = token / quoted-string
4.1.2. Chunked Trailer Part (チャンクトレーラーパート)
トレーラー (trailer) により、送信者は、メッセージ本文の送信中に動的に生成される可能性のあるメタデータを提供するために、チャンクメッセージの最後に追加のヘッダーフィールドを含めることができます。
trailer-part = *( header-field CRLF )
送信者は、トレーラーに Transfer-Encoding、Content-Length、または Trailer フィールドを生成してはなりません。
4.1.3. Decoding Chunked (チャンクのデコード)
チャンク転送エンコーディングをデコードするプロセスは、次のように実装できます (疑似コードを使用):
length := 0
read chunk-size, chunk-ext (if any), and CRLF
while (chunk-size > 0) {
read chunk-data and CRLF
append chunk-data to decoded-body
length := length + chunk-size
read chunk-size, chunk-ext (if any), and CRLF
}
read trailer field
while (trailer field is not empty) {
if (trailer field is allowed to be sent in a trailer) {
append trailer field to existing header fields
}
read trailer-field
}
Content-Length := length
Remove "chunked" from Transfer-Encoding
4.2. Compression Codings (圧縮エンコーディング)
次の3つの圧縮エンコーディング名は、HTTP/1.0との互換性のために定義されています。
4.2.1. Compress Coding (Compress エンコーディング)
"compress"エンコーディングは、適応型Lempel-Ziv-Welch (LZW) エンコーディング [Welch] であり、通常はUNIXファイル圧縮プログラム"compress"によって生成されます。
4.2.2. Deflate Coding (Deflate エンコーディング)
"deflate"エンコーディングは、Lempel-Ziv (LZ77) 圧縮アルゴリズムとHuffmanエンコーディングの組み合わせを使用する"deflate"圧縮データストリーム [RFC1951] を含む"zlib"データ形式 [RFC1950] です。
4.2.3. Gzip Coding (Gzip エンコーディング)
"gzip"エンコーディングは、32ビット巡回冗長検査 (CRC) を備えたLZ77エンコーディングであり、通常はgzipファイル圧縮プログラム [RFC1952] によって生成されます。
4.3. TE
"TE"ヘッダーフィールドは、chunked以外にクライアントがレスポンスの一部として受け入れる転送エンコーディングと、クライアントがトレーラーフィールドを受け入れるかどうかを示します。
TE = #t-codings
t-codings = "trailers" / ( transfer-coding [ t-ranking ] )
t-ranking = OWS ";" OWS "q=" rank
rank = ( "0" [ "." 0*3DIGIT ] )
/ ( "1" [ "." 0*3("0") ] )
4.4. Trailer
送信者が最後のチャンクのトレーラーセクションに送信するヘッダーフィールドを知っている場合、送信者はこれらのヘッダーフィールド名のリストを含む Trailer ヘッダーフィールドを送信すべきです。
Trailer = 1#field-name