/
471.txt
363 lines (275 loc) · 18.2 KB
/
471.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
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
[88] [DFN[[CODE(HTTP)@en[[[Connection:]]]]]] [[ヘッダー]]は、
現在の[[HTTP接続]]に関する制御オプションを指定するものです [SRC[>>87]]。
* 仕様書
[REFS[
- [87] '''[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-6.1>'''
- [83] [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-2.6>
- [85] [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-5.7>
- [8] [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>
- [11] [CITE@en[RFC 7240 - Prefer Header for HTTP]] ([TIME[2014-07-26 04:24:01 +09:00]] 版) <https://tools.ietf.org/html/rfc7240#section-2>
- [14] [CITE@en[RFC 2227 - Simple Hit-Metering and Usage-Limiting for HTTP]] ([TIME[2014-08-24 16:54:52 +09:00]] 版) <http://tools.ietf.org/html/rfc2227#section-3.1>
- [21] [CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-8.1.2.2>
]REFS]
* 構文
[92] [[欄値]]は、1つ以上の接続オプションの[[リスト]] ([CODE[#]]) です。
接続オプションは、[[字句]]で、[[大文字・小文字不区別]]です。 [SRC[>>87]]
[FIG(railroad)[
= [[字句]]
= *
== [[OWS]]
== [CODE[[[,]]]]
== [[OWS]]
== [[字句]]
]FIG]
* 文脈
[84] この[[ヘッダー]]は [[HTTP/1.1]] 仕様書で規定されていますが、すべての
[[HTTP/1.x]] に対して定義されています [SRC[>>83]]。 [[HTTP/1.1]]
に適合するかに関わらず、すべての [[HTTP/1.x]] の実装はこの[[ヘッダー]]を実装するべきです
[SRC[>>83]]。
[22] [[HTTP/2]] では使用しません。[[エンドポイント]]は
[[connection-specific header field]] を[[生成]]しては[['''なりません''']]。
[SRC[>>21]]
[90] [[送信者]]は、 [CODE(HTTP)@en[[[Connection:]]]] 以外の[[ヘッダー]]を使って現在の[[接続]]についてのオプションを指定するときは、
その[[ヘッダー名]]を [CODE(HTTP)@en[[[Connection:]]]] [[ヘッダー]]に含めなければ[['''なりません''']]
[SRC[>>87]]。
[91] この[[ヘッダー]]は複数指定できます。
* 処理
[86] [[串]]や[[関門]]は、[CODE(HTTP)@en[[[Connection:]]]]
を実装しなければ[['''なりません''']] [SRC[>>85]]。
[89] [[串]]や[[関門]]は、[[メッセージ]]を[[転送]]する前に、
[CODE(HTTP)@en[[[Connection:]]]] に名前が指定されている[[ヘッダー]]と
[CODE(HTTP)@en[[[Connection:]]]] [[ヘッダー]]を削除するか、
[[メッセージ]]を[[転送]]する[[接続]]のオプションを示すものに置換するかしなければ[['''なりません''']] [SRC[>>87]]。
;; [13] [[持続接続]]も参照。
[23] [[HTTP/2]] [[エンドポイント]]は、 [CODE(HTTP)@en[[[TE:]]]] 以外の
[[connection-specific header field]]
を含む[[メッセージ]]を[[奇形]]としなければ[['''なりません''']] [SRC[>>21]]。
[32] 実際には [[Chrome]] や [[Firefox]] では [CODE(HTTP)@en[[[Content-Length:]]]] と
[CODE(HTTP)@en[[[Transfer-Encoding:]]]] 以外は[[奇形]]とみなされないようです。
これらについては各項を参照。
[TIME[2015-10-11T09:36:35.00Z]]
[24] [[HTTP/1.0]]/[[HTTP/1.1]] から [[HTTP/2]] へ変換する[[中間器]]は、
[CODE(HTTP)@en[[[Connection:]]]] [[ヘッダー]]とそこで示された[[ヘッダー]]を削除する必要があります
[SRC[>>21]]。
更に [CODE(HTTP)@en[[[Keep-Alive:]]]], [CODE(HTTP)@en[[[Proxy-Connection:]]]],
[CODE(HTTP)@en[[[Transfer-Encoding:]]]], [CODE(HTTP)@en[[[Upgrade:]]]]
その他の [[connection-specific header field]] は、 [CODE(HTTP)@en[[[Connection:]]]]
に明示されていなくても削除する[['''べきです''']]。 [SRC[>>21]]
;; [25] [CODE(HTTP)@en[[[TE:]] [[trailers]]]] は残し、それ以外の値は削除するべきようにも思えますが、
明記されていません。
[30] 複数の[[ヘッダー]]で、または[[リスト]]の項目として [CODE(HTTP)@en[[[close]]]]
が指定されていれば、 [[Firefox]] は[[接続]]を閉じます。
[[Chrome]] や [[IE]] は、 [CODE(HTTP)@en[[[close]]]] が [CODE(HTTP)@en[[[keep-alive]]]]
より先に指定されていれば、[[接続]]を閉じます。 [TIME[2015-08-04T05:47:07.300Z]]
;; [31] [CODE(HTTP)@en[[[Connection: close]]]] も参照。
[33] [[nginx]] も [[Apache]] も、指定順序に関わらず [CODE[keep-alive]]
より [CODE[close]] を優先します。 [TIME[2016-09-11T05:13:21.300Z]]
[34] [[Apache]] は [CODE[,]] (前後に任意個の[[空白]]) で区切った時
[CODE[keep-alive]] や [CODE[close]] が [[ASCII大文字・小文字不区別]]で含まれるかどうかを調べます。
[[nginx]] は部分一致で [CODE[keep-alive]] や [CODE[close]] が
[[ASCII大文字・小文字不区別]]で含まれるかどうかを調べます。
[TIME[2016-09-11T05:14:52.900Z]]
[35] [[nginx]] は、[[接続][HTTP接続]]を閉じない場合には、
[CODE(HTTP)@en[[[Connection:]] [[keep-alive]]]] を送信します。
[TIME[2016-09-11T08:42:07.400Z]]
[36] [[Apache]] は、 [[HTTP/1.1]] で[[接続][HTTP接続]]を閉じない[[応答]]では、
[CODE(HTTP)@en[Connection:]] を特に送信しません。
[[HTTP/1.0]] で[[要求]]に [CODE(HTTP)@en[[[Connection:]] [[keep-alive]]]]
が指定されていれば、[[応答]]に [CODE(HTTP)@en[[[Connection:]] [[Keep-Alive]]]]
と [CODE(HTTP)@en[Keep-Alive:]] [[ヘッダー]]を含めます。
[TIME[2016-09-11T08:43:12.500Z]]
[37] [[ChromeDriver]] は、[[要求]]に [CODE[Connection: close]] があっても、
無視します。[[応答]]に [CODE[Connection: close]] を指定しますが、
自身のその指定も意味がなく、[[接続][HTTP接続]]は閉じられません。
その状態で次の[[要求]]を送信すると、また [CODE[Connection: close]]
の[[応答]]が送られてきますが、やはり閉じられません。 [TIME[2017-03-19T11:01:56.700Z]]
* 接続オプション
[96] [CODE(HTTP)@en[[[Connection:]]]] [[ヘッダー]]のリストの値である接続オプションは、
[[ヘッダー名]]と名前空間を共有しています。値を指定することで、
当該[[接続]]についてのオプションを指定することとなり、
同名の[[ヘッダー]]があればそれに関する更なるオプションとして扱われます。
[EG[
[15] [CODE(HTTP)@en[[[Connection:]] [[keep-alive]]]] は単独でも指定できますが、更に
[CODE(HTTP)@en[[[Keep-Alive:]]]] [[ヘッダー]]にオプションを指定することもできます。
]EG]
[99] 接続オプションは、特に引数がない場合には、 [CODE(HTTP)@en[[[Connection:]]]]
[[ヘッダー]]にだけ現れて実際の[[ヘッダー]]が存在しないこともあります [SRC[>>87]]。
[EG[
[16] [CODE(HTTP)@en[[[Connection:]] [[close]]]] に対応する[[ヘッダー]]は用意されていません。
]EG]
[EG[
[17] [CODE(HTTP)@en[[[Connection:]] [[meter]]]] は [CODE(HTTP)@en[[[Meter:]]]]
[[ヘッダー]]が特に指定されていない場合、 [CODE(HTTP)@en[[[Meter:]]]]
(値は[[空文字列]]。) が指定されたのと同じ意味と定義されています。
]EG]
[100] 接続オプションが [CODE(HTTP)@en[[[Connection:]]]] [[ヘッダー]]に現れずに対応する[[ヘッダー]]だけがある場合、
その[[ヘッダー]]は誤って[[転送]]されてきたものかもしれず、
[[受信者]]が無視する[RUBYB[べき]@en[ought to]]です [SRC[>>87]]。
[101] 新しい接続オプションを定義しようとする仕様書の著者は、
既存の[[ヘッダー名]]を調査して、衝突しないように注意する[RUBYB[べき]@en[ought to]]です。
新しい接続オプションを定義すると、それと同じ[[ヘッダー名]]を別の目的に使うのはよくありませんから、
実質的に[[ヘッダー名]]を予約することとなります。 [SRC[>>87]]
[26] [[RFC 7230]] は[[接続オプション]]と同名の[[ヘッダー]]のことを表す用語を明示的に定義はしていませんが、
[DFN[[[connection-specific header field]]]] という語を2回使っています。
[[RFC 7540]] はこの語を採用しています。
[93] [[送信者]]は、[[payload]] の[[受信者]]すべてに向けた[[ヘッダー]]を
[CODE(HTTP)@en[[[Connection:]]]] に指定しては[['''なりません''']] [SRC[>>87]]。
[EG[
[94] 例えば [CODE(HTTP)@en[[[Cache-Control:]]]] は不適切です [SRC[>>87]]。
]EG]
;; [95] すべてのリストがほしいところですね。
[9] [[RFC 7231]] は[[ヘッダー]]の仕様書に対し、 [CODE(HTTP)@en[[[Connection:]]]]
[[ヘッダー]]に指定するのが適当かどうか明記することを検討するよう求めています
[SRC[>>8]]。
[97] 次のような値が[[接続オプション]]や [[connection-specific header field]]
として使われています。
[FIG(list short)[
-[CODE(HTTP)[[[C-Ext]]]]
-[CODE(HTTP)[[[C-Man]]]]
-[CODE(HTTP)[[[C-Opt]]]]
-[CODE(HTTP)@en[[[C-PEP]]]]
-[CODE(HTTP)@en[[[C-PEP-Info]]]]
-[CODE(HTTP)[[[close]]]]
-[CODE(HTTP)@en[[[HTTP2-Settings]]]]
-[CODE(HTTP)[[[keep-alive]]]]
-[CODE(HTTP)[[[Meter]]]]
-[CODE(HTTP)@en[[[Prefer]]]]
-[CODE(HTTP)@en[[[Proxy-Connection]]]]
-[CODE(HTTP)[[[TE]]]]
-[CODE(HTTP)@en[[[Transfer-Encoding]]]]
-[CODE(HTTP)@en[[[Upgrade]]]]
]FIG]
;; [19] [CODE(HTTP)@en[[[close]]]] 以外は対応する[[ヘッダー]]があります。
[CODE(HTTP)@en[[[keep-alive]]]] と [CODE(HTTP)@en[[[Meter]]]]
は[[ヘッダー]]もありますが、[[ヘッダー]]無しでも使えます。
;; [7] [[接続オプション]]の値の一覧は >>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] >>97 に挙げたものの他、 [CODE(HTTP)@en[[[C-Man:]]]] や
[CODE(HTTP)@en[[[C-Opt:]]]] で宣言された[[ヘッダー接頭辞]]を使った[[ヘッダー]]も
[CODE(HTTP)@en[[[Connection:]]]] に指定しなければ[['''なりません''']]。
;; [[拡張宣言]]を参照。
[4] [CODE(HTTP)@en[[[Upgrade:]]]] や [CODE(HTTP)[[[TE:]]]] や [CODE(HTTP)@en[[[Meter:]]]]
[SRC[>>14]] は、使用する場合必ず [CODE(HTTP)@en[[[Connection:]]]]
に指定しなければならないと規定されています。
;; [103] [CODE(HTTP)@en[[[Content-Length]]]] や [CODE(HTTP)[[[Transfer-Encoding]]]] や
[CODE(HTTP)@en[[[Trailer]]]] は、[[接続オプション]]として使われることはないようです。
([[串]]が書き換えることもできますが、基本的にはそのまま[[転送]]して良いものだからでしょう。)
ただし [[RFC 7540]] は [CODE(HTTP)@en[[[Transfer-Encoding]]]] も
[[connection-specific header field]] だと述べています [SRC[>>21]]。
;; [10] [CODE(HTTP)@en[[[Proxy-Authenticate:]]]] や
[CODE(HTTP)@en[[[Proxy-Authorization:]]]] は[[接続オプション]]として使われるわけでは無いようです。
[12] [CODE(HTTP)@en[[[Prefer:]]]] は、 [CODE(HTTP)@en[[[Connection:]]]] に指定して当該[[接続]]のみに適用させられることが仕様書で敢えて言及されています [SRC[>>11]]。
;; [18] [CODE(HTTP)@en[[[Prefer:]]]] は通常は[[起源鯖]]に対して指定するので
[CODE(HTTP)@en[[[Connection:]]]] には指定しません。 (当該[[接続]]にのみ適用したいことが本当にあるのか謎ですが。。。)
;; [38] [[クライアント]]が [CODE[Prefer:]] を指定して、途中の[[プロキシ]]が更に
[CODE[Prefer:]] を指定したいとき、両者を区別する方法がないので、
[CODE[Prefer:]] を[[プロキシ]]用に転用することの有用性は謎です。
[27] [CODE(HTTP)@en[[[Proxy-Connection:]]]] は [[RFC 7540]] で
[[connection-specific header field]] に分類されています [SRC[>>21]]。
[[接続オプション]]として使われることはないかもしれません。
[39] [CODE[Host:]] は特に [[connection-specific header field]]
に分類されているわけではありませんが、 [[HTTP/1]] で[[転送]]するときは適切に付加し、
[[HTTP/2]] で[[転送]]するときは除去する必要があり、同種のものと捉えられます。
* セキュリティー
[28] [CODE(HTTP)@en[[[Connection:]]]] [[ヘッダー]]の値は、
[[fingerprinting vector]] かもしれません。
* 歴史
[FIG(quote)[
[FIGCAPTION[
[98] RFC 2068・2616 (HTTP/1.1) 14.10 Connection
]FIGCAPTION]
> The Connection general-header field allows the sender to specify
options that are desired for that particular connection and MUST NOT
be communicated by proxies over further connections.
[CODE(HTTP)[Connection]] 一般頭欄によって、
送信者がその特定の接続における望まれる選択子を指定することが出来ます。
この頭欄は、串により更なる接続において通信しては'''なりません'''。
> The Connection header has the following grammar:
[CODE(HTTP)[Connection]] 頭は次の文法を持ちます :
>
- Connection = "Connection" ":" 1#(connection-token)
- connection-token = token
> HTTP/1.1 proxies MUST parse the Connection header field before a
message is forwarded and, for each connection-token in this field,
remove any header field(s) from the message with the same name as the
connection-token. Connection options are signaled by the presence of
a connection-token in the Connection header field, not by any
corresponding additional header field(s), since the additional header
field may not be sent if there are no parameters associated with that
connection option.
HTTP/1.1 串は、メッセージが転送される前に [CODE(HTTP)[Connection]] 頭欄を解析しなければ'''ならず'''、
この欄中の各 [CODE(ABNF)[connection-token]] について、
[CODE(ABNF)[connection-token]] と同じ名前の全ての頭欄をメッセージから削除します。
接続選択子は、 [CODE(HTTP)[Connection]] 頭欄中の
[CODE(ABNF)[connection-token]] の出現により通知されます。
それに対応する追加の頭欄によってではありません。
その接続選択子に関連付けられた引数がないときに追加の頭欄は送信されないかもしれないからです。
[INS[
> Message headers listed in the Connection header MUST NOT include
end-to-end headers, such as Cache-Control.
[CODE(HTTP)[Connection]] 頭に列挙されたメッセージ頭並びは、
[CODE(HTTP)[[[Cache-Control]]]] などの末端対末端頭を含んでは'''なりません'''。
]INS]
> HTTP/1.1 defines the "close" connection option for the sender to
signal that the connection will be closed after completion of the
response. For example,
HTTP.1,1 は、その応答の完了後に接続を閉じることを送信者が通知する
[CODE(HTTP)[close]] 接続選択子を定義します。例えば、
要求頭欄並び中であれ応答頭欄並び中であれ、
>
- Connection: close
> in either the request or the response header fields indicates that
the connection [DEL[should not]] [INS[SHOULD NOT]] be considered `persistent' (section 8.1)
after the current request/response is complete.
は現在の要求・応答が完了した後に接続が「[[永続]]」
とみなされる'''べきではない'''ことを示します。
> HTTP/1.1 applications that do not support persistent connections MUST
include the "close" connection option in every message.
永続接続に対応していない HTTP/1.1 応用は各メッセージ中に [CODE(HTTP)[close]]
接続選択子を含めなければ'''なりません'''。
[INS[
> A system receiving an HTTP/1.0 (or lower-version) message that
includes a Connection header MUST, for each connection-token in this
field, remove and ignore any header field(s) from the message with
the same name as the connection-token. This protects against mistaken
forwarding of such header fields by pre-HTTP/1.1 proxies. See section 19.6.2.
[CODE(HTTP)[Connection]] 頭を含んだ
HTTP/1.0 (又はそれ以下の版) のメッセージを受信したシステムは、
この欄中の各 [CODE(ABNF)[connection-token]] について、メッセージ中の
[CODE(ABNF)[connection-token]] と同じ名前の全ての頭欄を削除・無視しなければ'''なりません'''。
これによってそれらの頭欄が HTTP/1.1 以前の串によって誤って転送されることを防ぎます。
]INS]
]FIG]
[REFS[
- [5] [CITE@en[RFC 2660 - The Secure HyperText Transfer Protocol]]
( ([TIME[2013-07-20 22:21:48 +09:00]] 版))
<http://tools.ietf.org/html/rfc2660#section-2.6.3.3>
]REFS]
* 関連
[102] [[接続]]、[[持続的接続]]の項も参照してください。
[1] [[串]]に関係して使われる同種の頭欄には、
- [CODE(HTTP)[[[Cneonction]]]]
- [CODE(HTTP)[[[Proxy-Connection]]]]
- [CODE(HTTP)[[[Xonnection]]]]
- [CODE(HTTP)[[[Xroxy-Connection]]]]
が見つかっています。
[2]
[CODE(HTTP)[[[HTTP-Connection]]]], [CODE(HTTP)[[[Nncoection]]]] も同類っぽ。
[3]
[CODE(HTTP)[[[Proxy-----------]]]] もそうかも。
[104] [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>
[105] [CITE@en[RFC 2660 - The Secure HyperText Transfer Protocol]]
( ([TIME[2014-11-09 14:12:37 +09:00]] 版))
<http://tools.ietf.org/html/rfc2660#section-2.6.3.3>
[FIG(quote)[
[FIGCAPTION[
[29] ([TIME[2014-07-03 18:27:57 +09:00]] 版)
<http://storage.sakura.ad.jp/pdf/base_storage_api_reference.pdf>
]FIGCAPTION]
> Connection サーバへの接続が開いているか閉じているかの状態となります
> 型:列挙型 (open / close)
]FIG]