/
465.txt
180 lines (131 loc) · 9.13 KB
/
465.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
[9] [DFN[[RUBYB[[[トレーラー部]]]@en[trailer part]]]]は、[CODE(HTTP)@en[[[chunked]]]]
[[符号化]]されている[[メッセージ本体]]の末尾の[[ヘッダー]]を記述できる箇所です。
[10] [[トレーラー部]]を使うと、[[メッセージ本体]]の送信時に動的に生成される[[一貫性]]のデータや[[デジタル署名]]などを[[メッセージ]]の末尾に記述することができます
[SRC[>>8]]。
* 仕様書
[REFS[
- [8] '''[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.1.2>'''
- [26] [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.3>
- [28] [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.4>
- [36] [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#page-79>
]REFS]
* 文脈
[23] [[トレーラー部]]は、[CODE(HTTP)@en[[[chunked]]]] [[符号化]]されている場合に[[メッセージ本体]]の末尾近くに存在しています。
[25] [[利用者エージェント]]は[[要求]]の [CODE(HTTP)@en[[[TE:]]]]
[[ヘッダー]]に [DFN[[CODE(HTTP)@en[[[trailers]]]]]] [SRC[>>26]] という値を指定することで、
[[トレーラー部]]に対応していると明示できます。
;; [27] [[中間器]]が[[送信]]する場合、[[下流]]すべてが[[トレーラー部]]に対応しているか、
[[中間器]]が[[バッファリング]]してから[[下流]]に渡すかのいずれかを表します [SRC[>>26]]。
[21] [[鯖]]は、 [CODE(HTTP)@en[[[TE:]]]] に [CODE(HTTP)[[[trailers]]]] が指定されている場合を除き、
[[利用者エージェント]]が必要とかんがえられる[[ヘッダー]]を[[トレーラー部]]で[[生成]]する[['''べきではありません''']]。
[[鯖]]は、 [CODE(HTTP)@en[[[TE:]]]] に [CODE(HTTP)[[[trailers]]]] が指定されていない場合には、
[[トレーラー部]]の[[ヘッダー]]は[[利用者エージェント]]への経路中で黙って捨てられるかもしれないとかんがえる[RUBYB[べき]@en[ought to]]です。
[SRC[>>8]]
;; [22] [[中間器]]は [CODE(HTTP)@en[[[chunked]]]] [[符号化]]を[[復号]]して
[[HTTP/1.0]] [[受信者]]に[[転送]]するかもしれませんが、
その際に[[応答]]全体をバッファリングする必要はありません [SRC[>>8]]。
;; [24] [CODE(HTTP)@en[[[TE:]] [[trailers]]]] が指定されていなくても、
[[トレーラー部]]の利用が禁止されているわけではないようです。
しかし指定されていない場合には、[[トレーラー部]]が理解される保証は全くありません。
* 構文
[11] [[トレーラー部]]は、0個以上の[[ヘッダー]]で構成されます。
各[[ヘッダー]]の後には、 [[CRLF]] が来ます。 [SRC[>>8]]
[FIG(railroad)[
= *
== [[ヘッダー]]
== [[CRLF]]
]FIG]
* ヘッダーの種類
[12] [[送信者]]は、次のような[[ヘッダー]]を[[生成]]しては[['''なりません''']]。
[[受信者]]は、これらを無視するか、[[誤り]]とみなすかしなければ[['''なりません''']]。
[SRC[>>8]]
[FIG(list)[
- [13] [[メッセージ]]の[[フレーム付け]]に関するもの ([CODE(HTTP)@en[[[Transfer-Encoding:]]]]、
[CODE(HTTP)@en[[[Content-Length:]]]] など)
- [14] [[経路制御]]に関するもの ([CODE(HTTP)[[[Host:]]]] など)
- [15] [[要求修飾子]]
- [16] [[認証]]
- [17] [[応答制御データ]]
- [18] [[payload]] の処理方法に関するもの ([CODE(HTTP)@en[[[Content-Encoding:]]]]、
[CODE(HTTP)@en[[[Content-Type:]]]]、[CODE(HTTP)@en[[[Content-Range:]]]]、
[CODE(HTTP)@en[[[Trailer:]]]] など)
]FIG]
;; [19] なぜか完全なリストはなく、例示に留まっています。
[37] [[RFC 7231]] は[[ヘッダー]]の仕様書に対し、 [[トレーラー部]]で使用することを認めるかどうか、
便利かどうかを明記することを検討するよう求めています [SRC[>>36]]。
;; [35] 該当すると思われる[[ヘッダー]]の一覧は >>6 に [[JSON]]
形式で収録されています。
[REFS[
- [6] [CITE@en[data-web-defs/headers.txt at master · manakai/data-web-defs]] ([TIME[2014-09-03 10:02:34 +09:00]] 版) <https://github.com/manakai/data-web-defs/blob/master/doc/headers.txt>
]REFS]
[20] 禁止されているものを除いた[[ヘッダー]]は、[[頭部]]に現れた場合と同じように処理して構いません。
[SRC[>>8]]
* [CODE(HTTP)@en[Trailer:]] ヘッダー (HTTP)
[2] [DFN[[CODE(HTTP)@en[[[Trailer:]]]]]] [[ヘッダー]]は、
[[トレーラー部]]に含まれる[[ヘッダー名]]を表しています。
** 文脈
[30] この[[ヘッダー]]は複数指定できます。
[31] [[送信者]]は[[トレーラー部]]で[[ヘッダー]]を送りたいときは、
[[頭部]]に [CODE(HTTP)@en[[[Trailer:]]]] [[ヘッダー]]を[[生成]]して当該[[ヘッダー名]]を含める[['''べきです''']]
[SRC[>>29]]。
** 構文
[29] [[欄名]]の1つ以上の[[リスト]]です [SRC[>>29]]。
** 処理モデル
[32] [[受信者]]に対するヒントとして用いることが想定されているようで、
具体的にどのように処理するかは規定がありません。また、
[[トレーラー部]]を使用する時に指定することが[['''推奨''']]はされていますが、
実態と一致していない可能性は排除されていませんし、
その場合のエラー処理も特に規定されていません。
* 歴史
[FIG(quote)[
[FIGCAPTION[
[4] RFC 2616 (HTTP/1.1) 14.40 Trailer
]FIGCAPTION]
> The Trailer general field value indicates that the given set of
header fields is present in the trailer of a message encoded with
chunked transfer-coding.
Trailer (尻尾) 全般領域値は、指定された頭領域の集合が
chunked (塊) 転送符号化で符号化されたメッセージの尻尾に
あることを示します。
- [CODE(ABNF)[ Trailer = "Trailer" ":" 1#field-name]]
> An HTTP/1.1 message SHOULD include a Trailer header field in a
message using chunked transfer-coding with a non-empty trailer. Doing
so allows the recipient to know which header fields to expect in the trailer.
HTTP/1.1 メッセージは、空でない尻尾の塊転送符号化を使うメッセージには、
Trailer 頭領域を含める'''べき'''です。そうすることで、受信者は
どの頭領域が尻尾に巻かれて来ようかを知ることが出来ます。
> If no Trailer header field is present, the trailer SHOULD NOT include
any header fields. See section 3.6.1 for restrictions on the use of
trailer fields in a "chunked" transfer-coding.
Trailer 頭領域が無い場合、尻尾にはどんな頭領域も含める'''べきではありません'''。
「chunked」転送符号化で尻尾領域を使う際の制限については、
3.6.1節を参照して下さい。
> Message header fields listed in the Trailer header field MUST NOT
include the following header fields:
Trailer 頭欄に列せられるメッセージ頭欄には、
次に挙げる頭欄を含めては'''いけません'''。
>
- Transfer-Encoding
- Content-Length
- Trailer
]FIG]
** [CODE(HTTP)@en[[[Trailers:]]]] ヘッダー
[3] [[RFC 2616]] は [CODE(HTTP)[[[Trailer:]]]] [[ヘッダー]]のことを
[DFN[[CODE(HTTP)@en[[[Trailers:]]]]]] としているところがあり、
[[正誤表]]で訂正されています。
[REFS[
- [5] ''HTTP/1.1 Specification Errata'' <http://purl.org/NET/http-errata#trailer-hop>)
]REFS]
* メモ
[1] [CODE(HTTP)[Trailer:]] 欄に挙げてはみたけど、やっぱりや〜めた、ってのはありなのかな? どうなのかな?
[7] [[CGI]] や [[PHP]] のようなサーバー側の処理で[[応答]]を出力する時に、内容を送りつつ最後に確定した追加の欄を送る、という使い方が想定されているのでしょうが、実際のところ、この欄とその機能のちゃんとした実装があるのかすら不明です。
現状では実質使えない機能だと考えても良いでしょう。
更に、計算機や回線の性能はよくなってきていますから、
内容と欄を全て生成してから一気に送るというやり方でもほとんど問題がなくなってきています。
ですからこの欄もこのまま使われずに完全に忘れられるかもしれません。
[33] [CITE@en[HTTP Chunking peculiarities]]
( ([[Martin Holst Swende]] 著, [TIME[2014-04-03 17:07:05 +09:00]] 版))
<http://martin.swende.se/blog/HTTPChunked.html>
[34] [CITE@en[RFC 3507 - Internet Content Adaptation Protocol (ICAP)]]
( ([TIME[2014-06-08 07:17:07 +09:00]] 版))
<http://tools.ietf.org/html/rfc3507#section-4.3.1>