[504] [DFN[[RUBYB[[[転送符号化]]]@en[transfer coding]]]]は、
[[ネットワーク]]上の「[RUBYB[安全な輸送路]@en[safe transport]]」
を確保するために [[payload body]] に適用される、
されることがある、あるいは必要であるかもしれない[RUBYB[符号化変形]@en[encoding transformation]]です
[SRC[>>502]]。

;; [505] [[HTTP]] には[[転送符号化]]の他に[[内容符号化]]がありますが、
[[内容符号化]]が[[表現]]の特性であるのに対し、[[転送符号化]]は[[メッセージ]]の特性です
[SRC[>>502]]。

;; [3] [[HTTP/2]] では[[転送符号化]]を使いません。

* 仕様書

[REFS[
- [502] '''[CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-4>'''
- [520] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#page-50>
- [524] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-8.4>
- [1] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-08-07 05:54:02 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-8.4>
- [523] [CITE[Hypertext Transfer Protocol (HTTP) Parameters]] ([TIME[2014-06-13 18:52:05 +09:00]] 版) <http://www.iana.org/assignments/http-parameters/http-parameters.xhtml#transfer-coding>
]REFS]

* 転送符号化の指定

[510] [[転送符号化]]は、名前で識別します。名前に加えて零個以上の[[引数]]を指定することができます。
[SRC[>>502]]

[511] この指定は、 [CODE(HTTP)@en[[[Transfer-Encoding:]]]] [[ヘッダー]]や、
[CODE(HTTP)@en[[[TE:]]]] [[ヘッダー]]で使われます。

[512] 名前は、[[字句]]です。[[大文字・小文字不区別]]です。
[[IANA登録簿]]に登録する[RUBYB[べき]@en[ought to]]です。 [SRC[>>502]]

[515] [[引数]]の前には、 [CODE(HTTP)[[[;]]]] が必要です [SRC[>>502]]。
[CODE(HTTP)[[[;]]]] の前後には、 [CODE(HTTP)[[[OWS]]]] を挿入できます [SRC[>>502]]。

[513] [[引数]]は、名前か名前と値の組とされています [SRC[>>502]] が、構文上値は必須となっています。名前と値の間には
[CODE(HTTP)[[[=]]]] が必要です [SRC[>>502]]。名前は[[字句]]、
値は[[字句]]または[[引用文字列]]です [SRC[>>502]]。

[514] [CODE[=]] の前後には [[BWS]] を挿入できます [SRC[>>502]]。

[516] [[引数]]の順序や重複、大文字と小文字、未対応の場合の対処などは言及がありません。
また [[HTTP]] 本体仕様および関連仕様や、実際の用例で、[[引数]]を用いた例はありません。

;; [519] [CODE(HTTP)@en[[[TE:]]]] [[ヘッダー]]には特別な [CODE(HTTP)[[[q]]]]
[[引数]]を指定することができますが、定義上は[[転送符号化]]の[[引数]]とはされていません。
また、他の[[引数]]より後に置かなければならない構文となっています。
[CODE(HTTP)[[[q]]]] [[引数]]では [[BWS]] や[[引用文字列]]は認められていません。

[FIG(railroad)[
= [[字句]]
= *
== [[OWS]]
== [CODE[[[;]]]]
== [[OWS]]
== [[字句]]
== [CODE[[[=]]]]
== |
=== [[字句]]
=== [[引用文字列]]
]FIG]

* 転送符号化名の一覧

[517] [[転送符号化]]の名前には、次のものがあります。

[FIG(short list)[
-[CODE(HTTP)@en[[[chunked]]]]
-[CODE(HTTP)@en[[[compress]]]]
-[CODE(HTTP)@en[[[x-compress]]]]
-[CODE(HTTP)@en[[[deflate]]]]
-[CODE(HTTP)@en[[[gzip]]]]
-[CODE(HTTP)@en[[[x-gzip]]]]
-[CODE(HTTP)@en[[[identity]]]]
-[CODE(HTTP)@en[[[trailers]]]]
]FIG]

[518] [CODE(HTTP)@en[[[chunked]]]] は特別な[[転送符号化]]で、 [[HTTP/1.1]]
で実装が義務付けられている他、他の[[転送符号化]]とは異なる要件が色々あります。
[[HTTP/2]] では利用が禁止されています。

[506] [CODE(HTTP)@en[[[trailers]]]] は[[転送符号化]]ではなく、
[CODE(HTTP)@en[[[chunked]]]] のオプションのようなものですが、
[CODE(HTTP)@en[[[TE:]]]] [[ヘッダー]]では[[転送符号化]]と共に指定できます。
([CODE(HTTP)@en[[[Transfer-Encoding:]]]] [[ヘッダー]]には指定できません。)

;; [528] [[IANAREG]] にはありません。

[507] [CODE(HTTP)@en[[[identity]]]] は [[RFC 2616]] にありましたが、
その[[正誤表]]で削除されています。

;; [529] [[内容符号化]]と一部名前が共通していますが、
[[内容符号化]]と[[転送符号化]]は別のものとされていますから、
片方で使えるからといって他方でも使えるとは限りません。

[4] [CODE(HTTP)@en[[[chunked]]]] 以外の[[転送符号化]]は、現在では実装されていません。
[CODE(HTTP)@en[[[chunked]]]] と [CODE(HTTP)@en[[[trailers]]]] 以外の値は、
[[相互運用性]]のため、使うべきではありません。

[533] [[転送符号化]]の名前の一覧が >>532 に [[JSON]] 形式で含まれています。

[REFS[
- [532] [CITE@en[data-web-defs/headers.txt at master · manakai/data-web-defs]] ([TIME[2014-09-01 16:23:55 +09:00]] 版) <https://github.com/manakai/data-web-defs/blob/master/doc/headers.txt>
]REFS]

* IANA 登録簿

[508] [[転送符号化]]の名前は [[IANA登録簿]] [SRC[>>523]] があります [SRC[>>524]]。

[509] 元は根拠不詳であり、登録手続きは
> Registration Procedures: First Come First Served with specification recommended

([[先来先給]]、仕様書推奨) とされていました。

[525] その後 [[RFC 7230]] が定義するようになり、登録手続きは [[IETF Review]]
に変更されています。

[526] [[内容符号化]]と同じ名前は、同じ[[符号化]]でないと使ってはいけないことになっています
[SRC[>>524, >>1]]。

* 処理

[521] [[串]]は、[[転送符号化]]を適用したり、除去したりしてから[[転送]]して構いません
[SRC[>>520]]。

;; [522] 特に [[HTTP/1.1]] から [[HTTP/1.0]] へと[[転送]]する時には、
すべての[[転送符号化]]を除去することになります。

[6] [CODE(HTTP)@en[[[TE:]]]] や [CODE(HTTP)@en[[[Transfer-Encoding:]]]]
や [CODE(HTTP)@en[[[chunked]]]] や[[メッセージ本体]]も参照。

* 要求での利用

[8] 仕様上は[[要求]]でも[[転送符号化]]を使えることになっていますが、
実際には使われることはありません。

;; [9] [[要求]]では [CODE(HTTP)@en[[[TE:]]]] [[ヘッダー]]に相当するもので[[折衝]]することもできません。

* セキュリティー

[2] [[圧縮]]を用いると、 [[BREACH]] 攻撃に使われる危険性があります。
[[内容符号化]]とは違って[[転送符号化]]は送信者が完全に制御することはできませんから、
特に注意が必要かもしれません。実装は[[圧縮]]を使わないべきかもしれません。
[[利用者]]や[[著者]]は[[圧縮]]を使う可能性がある[[プロキシ]]に接続しないよう注意するべきかもしれません。

;; [[内容符号化]]のセキュリティーの項も参照。

[5] 一般的な[[利用者エージェント]]は [CODE(HTTP)@en[[[TE:]]]]
[[ヘッダー]]を指定しないので、普通の[[サーバー]]は [CODE(HTTP)@en[[[chunked]]]]
以外の[[転送符号化]]を使いませんから、問題にはならなそうです。

* 歴史

[FIG(quote)[
[FIGCAPTION[
[503] RFC 2068・2616 (HTTP/1.1) 3.6 Transfer Codings
]FIGCAPTION]

> Transfer[INS[-]]coding values are used to indicate an encoding
transformation that has been, can be, or may need to be applied to an
entity-body in order to ensure "safe transport" through the network.
This differs from a content coding in that the transfer[INS[-]]coding is a
property of the message, not of the original entity.

[CODE(ABNF)[transfer-coding]] 値は、ネットワークを通した「安全な輸送」
を確保するために [CODE(ABNF)[entity-body]] に適用している、
適用することができる、あるいは適用する必要がある符号化変形を示すのに使います。
転送符号化はメッセージの特性であってもとの実体の特性ではないという点において、
転送符号化は[[内容符号化]]と異なります。

>
- transfer-coding         = "chunked" | transfer-extension
- transfer-extension      = [INS[token *( ";" parameter )]]

[INS[

> Parameters are in  the form of attribute/value pairs.

引数は属性・値の組の形です。

>
- parameter               = attribute "=" value
- attribute               = token
- value                   = token | quoted-string
]INS]

> All transfer-coding values are case-insensitive. HTTP/1.1 uses
transfer[INS[-]]coding values [INS[in the TE header field (section 14.39) and]]
in the Transfer-Encoding header field (section [DEL[14.40]] [INS[14.41]]).

すべての [CODE(ABNF)[transfer-coding]] 値は大文字・小文字を区別しません。
HTTP/1.1 は [INS[[CODE(HTTP)[[[TE]]]] 頭欄と]] [CODE(HTTP)[[[Transfer-Encoding]]]]
頭欄で [CODE(ABNF)[transfer-coding]] 値を使います。

[INS[

> Whenever a transfer-coding is applied to a message-body, the set of
transfer-codings MUST include "chunked", unless the message is
terminated by closing the connection. When the "chunked" transfer-coding is used, it MUST be the last transfer-coding applied to the
message-body. The "chunked" transfer-coding MUST NOT be applied more
than once to a message-body. These rules allow the recipient to
determine the transfer-length of the message (section 4.4).

[CODE(ABNF)[[[message-body]]]] が [CODE(ABNF)[transfer-coding]]
に適用する時は常に、 [CODE(ABNF)[transfer-coding]]
の集合はメッセージを[[接続]]を閉じることによって終端する場合を除き、
[CODE(HTTP)[[[chunked]]]] を含まなければ'''なりません'''。
[CODE(HTTP)[chunked]] を使うときは、 [CODE(ABNF)[message-body]]
に適用する最後の [CODE(ABNF)[transfer-coding]]
でなければ'''なりません'''。
[CODE(HJTTP)[chunked]] [CODE(ABNF)[transfer-coding]] は、一つの
[CODE(ABNF)[message-body]] に複数回適用しては'''なりません'''。
これらの規則は受信者がメッセージの [CODE(ABNF)[[[transfer-length]]]]
を決定することを可能とします。
]INS]

> Transfer[INS[-]]codings are analogous to the Content-Transfer-Encoding
values of MIME [INS[ [7] ]], which were designed to enable safe transport of
binary data over a 7-bit transport service. However, safe transport
has a different focus for an 8bit-clean transfer protocol. In HTTP,
the only unsafe characteristic of message-bodies is the difficulty in
determining the exact body length (section 7.2.2), or the desire to
encrypt data over a shared transport.

[CODE(ABNF)[transfer-coding]] は 7ビット輸送サービス上でバイナリ・データを安全に輸送することを可能とするために設計された
[[MIME]] の [CODE(MIME)[[[Content-Transfer-Encoding]]]] に相当するものです。
しかし、安全な輸送は8ビット安全転送プロトコルでは違った焦点があります。
HTTP では、 [CODE(ABNF)[message-body]] の唯一の非安全な性質は正確な本体の長さを決定することの困難性や共有輸送路上でデータを暗号化したいという希望です。

[INS[

> The Internet Assigned Numbers Authority (IANA) acts as a registry for
transfer-coding value tokens. Initially, the registry contains the
following tokens: "chunked" (section 3.6.1), [DEL[[INS[{2616; Errata で削除}]] "identity" (section 3.6.2),]] "gzip" (section 3.5), "compress" (section 3.5), and "deflate" (section 3.5).

IANA が [CODE(ABNF)[transfer-coding]] 値字句の登録簿として機能します。
最初に、登録簿は次の字句を含みます :
[CODE(HTTP)[chunked]], [DEL[[CODE(HTTP)[[[identity]],]]]]
[CODE(HTTP)[[[gzip]]]], [CODE(HTTP)[[[compress]]]],
[CODE(HTTP)[[[deflate]]]]。

> New transfer-coding value tokens SHOULD be registered in the same way
as new content-coding value tokens (section 3.5).

新しい [CODE(ABNF)[transfer-coding]] 値字句は新しい
[CODE(ABNF)[content-coding]] 値字句と同じ方法で登録する'''べきです'''。

> A server which receives an entity-body with a transfer-coding it does
not understand SHOULD return 501 (Unimplemented), and close the
connection. A server MUST NOT send transfer-codings to an HTTP/1.0 client.

理解しない [CODE(ABNF)[transfer-coding]] の [CODE(ABNF)[entity-body]]
を受信したサーバーは、 [CODE(HTTP)[[[501]] (mijissou)]]
を返し、接続を閉じる'''べきです'''。サーバーは HTTP/1.0
クライアントに [CODE(ABNF)[transfer-coding]] を送っては'''なりません'''。
]INS]


* 3.6.1 Chunked Transfer Coding

→[CODE(WikiPage)[[[chunked]]]]
]FIG]

* 実装

[531] [[転送符号化]]の名前の大文字と小文字を区別する実装もありました [SRC[>>530]]。

[REFS[
- [530] [CITE@en[HTTP Chunking peculiarities]] ([[Martin Holst Swende]] 著, [TIME[2014-04-03 17:07:05 +09:00]] 版) <http://martin.swende.se/blog/HTTPChunked.html>
]REFS]