Transfer-Encoding ヘッダー
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
HTTP の Transfer-Encoding リクエストヘッダーおよびレスポンスヘッダーヘッダーは、ネットワーク上のノード間でメッセージを転送する際に使用するエンコード方式を指定します。
Transfer-Encoding はホップバイホップヘッダーであり、リソース自体ではなく、二つのノード間のメッセージに適用されます。
ノード間のコネクションが複数ある場合は、それぞれの区間で使用する Transfer-Encoding の値が異なることがあります。
コネクション全体を通してデータを圧縮したい場合は、代わりにエンドトゥエンドの Content-Encoding ヘッダーを使用してください。
実際にはこのヘッダーはほとんど使用されず、使用される場合でもほぼ常に chunked で使用されます。
すなわち、仕様書では、メッセージ内に存在する場合、そのホップにおけるメッセージの圧縮方式や、メッセージがチャンク化されているか否かを示すとしています。
例えば、Transfer-Encoding: gzip, chunked は、コンテンツが gzip 符号化で圧縮された後、メッセージ本体を形成する際にチャンク符号化でチャンク化されたことを示します。
HEAD リクエストへのレスポンスでは、このヘッダーは省略可能です。これらのメッセージには本体がなく、したがって転送エンコード方式も存在しないためです。
存在する場合、対応するレスポンスに適用される値を示します。これは、その GET メッセージに対するレスポンスであり、その GET リクエストに優先されるTransfer-Encoding が指定されていない場合に適用されます。
警告:
HTTP/2 では Transfer-Encoding ヘッダーの使用をすべて禁止しています。
HTTP/2 以降では、チャンク転送よりも効率的なデータストリーミングの仕組みを提供しているからです。
HTTP/2 でこのヘッダーを使用すると、特定のプロトコルエラーが発生する可能性が高いです。
| ヘッダー種別 | リクエストヘッダー, レスポンスヘッダー, コンテンツヘッダー |
|---|---|
| 禁止リクエストヘッダー | はい |
構文
Transfer-Encoding: chunked
Transfer-Encoding: compress
Transfer-Encoding: deflate
Transfer-Encoding: gzip
// カンマで区切って複数の値を並べることができます
Transfer-Encoding: gzip, chunked
ディレクティブ
chunked-
データはチャンク(塊)の連続で送られます。 コンテンツは、長さが区切られたバッファーの連続として転送される未知のサイズのストリームで送信可能であるため、送信者は接続を開いたままに保ち、受信者がメッセージ全体を受信した時点で通知することができます。 この場合は
Content-Lengthヘッダーが省略されます。それぞれのチャンクの先頭に現在のチャンクの長さを 16 進数の形式で追加し、その後で\r\nが続き、チャンク自体ももう一つの\r\nが続きます。 最後のチャンクは長さ 0 のチャンクです。 compress-
Lempel-Ziv-Welch (LZW) アルゴリズムを使用した形式です。この値の名前はこのアルゴリズムを実装している UNIX の compress プログラムから採られました。 特許問題(2003 年に期限切れ)の影響もあり、多くの UNIX ディストリビューションから compress プログラムが消滅したように、今日ではこのコンテンツ符号化方式を使用しているブラウザーはほとんどありません。
deflate-
zlib 構造体(RFC 1950 で定義)と deflate 圧縮アルゴリズム(RFC 1951 で定義)を使用します。
gzip-
Lempel-Ziv coding (LZ77) と 32 ビット CRC を使用する形式です。 これは元は UNIX の gzip プログラムの形式です。 HTTP/1.1 標準は、互換性のために、このコンテンツ符号化方式の別名として
x-gzipを解釈することにサーバーが対応することを推奨しています。
例
チャンク化の符号化
チャンク化の符号化は、大量のデータをクライアントに送り、リクエストが完了するまでレスポンスの合計の長さが分からない場合に便利です。 例えば、巨大な HTML の表をデータベースのクエリーの結果として作成したり、大きな画像を転送したりする場合などです。チャンク化されたレスポンスは以下のようになります。
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
7\r\n
Welcome\r\n
1c\r\n
to Mozilla Developer Network\r\n
0\r\n
\r\n
仕様書
| Specification |
|---|
| HTTP/1.1 # field.transfer-encoding |