/
919.txt
220 lines (159 loc) · 11.6 KB
/
919.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
[20] [DFN[[[HTTP/0.9]]]] は、1991年以来使われている [[HTTP]] の最初の版です。
極めて単純ですが、あまりに低機能なので、現在ではほとんど使われなくなっています。
それでも [[HTTP]] [[プロトコル]]の一部として依然として広く実装されています。
* 仕様書
[REFS[
- [10] [CITE@en[RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0]] ([TIME[2014-09-07 13:12:32 +09:00]] 版) <http://tools.ietf.org/html/rfc1945#section-3.1>
- [13] [CITE@en[RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0]] ([TIME[2014-09-07 13:12:32 +09:00]] 版) <http://tools.ietf.org/html/rfc1945#section-4.1>
- [15] [CITE@en[RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0]] ([TIME[2014-09-07 13:12:32 +09:00]] 版) <http://tools.ietf.org/html/rfc1945#section-5>
- [18] [CITE@en[RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0]] ([TIME[2014-09-07 13:12:32 +09:00]] 版) <http://tools.ietf.org/html/rfc1945#section-6.1>
- [21] [CITE@en[RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0]] ([TIME[2014-09-07 13:12:32 +09:00]] 版) <http://tools.ietf.org/html/rfc1945#section-7.2.1>
]REFS]
* 呼称
[47] 元々は単に「[[HTTP]]」と呼んでいましたが、新しい版 ([[HTTP2]] と呼ばれたり、
[[HTTP/1.0]] と呼ばれたりしたもの) が開発された時、区別するために
[[HTTP/0.9]] と呼ばれるようになりました。
[48] 0.9 は 1.0 より前という程度の意味なので、 0.8 や 0.5 や 0.1 はありません。
* プロトコル
[22] [[HTTP/0.9]] の詳細については [[HTTP]] や、各[[プロトコル要素]]の項を参照してください。
[FIG(short list)[
- [[HTTP接続]]
- [[HTTPメッセージ]]
- [[要求]]
-- [[要求行]]
-- [CODE(HTTP)@en[[[GET]]]]
- [[応答]]
]FIG]
[14] [[HTTP/0.9]] [[応答]]は [[MIME型]]を示せないため、
[[HTTP/0.9]] [[要求]]は[[非推奨]] [SRC[>>13]] とされています。
[25] [[HTTP/0.9]] には[[ヘッダー]]はありません。 [CODE(HTTP)@en[[[Host:]]]]
[[ヘッダー]]も含められないため、 ([[要求URL]]に[[絶対URL]]を指定して無理に明示するのでなければ)
[[仮想ホスト]]に対応できません。この意味で [[HTTP/0.9]] は最早 [[Web互換]]とはいえません。
[23] [[MIME型]]は [CODE(HTTP)@en[[[Content-Type:]]]] [[ヘッダー]]が無い場合のように
[[Content-Type sniffing]] によって決定されるものと思われます。
元々は [[HTML]] のみが使われることが想定されていました。
;; [37] [[平文]]の転送のために [[HTML]] の [CODE(HTMLre)@en[[[plaintext]]]]
[[タグ]]が用意されています。
;; [29] [[Chrome]] と [[IE]] は [[sniffing]] しているようですが、
[[Firefox]] は [CODE(MIME)@en[[[text/plain]]]] として扱っているようです。 [TIME[2015-06-13T14:23:50.00Z]]
[24] [[状態符号]]はありません。
;; [30] [[Chrome]] で [[XHR]] で取得すると、 [CODE(HTTP)[[[200]]]] 扱いになっているようです。
[26] [[HTTP/0.9]] [[応答]]は[[キャッシュ不可能]]なものとして処理するべきと思われます。
;; [38] [[IE]] は[[キャッシュ]]するようです。 [TIME[2015-06-14T09:10:28.700Z]]
* HTTP/1.0 との関係
[12] [[HTTP/1.0]] [[鯖]]は [[HTTP/0.9]] [[要求]]を処理できなければなりません [SRC[>>10]]。
[[HTTP/1.0]] [[鯖]]は [[HTTP/0.9]] [[要求]]を受信したら、
[[HTTP/0.9]] [[応答]]を返さなければなりません [SRC[>>10, >>15]]。
[11] [[HTTP/1.0]] [[クライアント]]は [[HTTP/0.9]] [[応答]]を処理できなければなりません [SRC[>>10]]。
;; [17] [[HTTP/0.9]] [[鯖]]だった場合、 [[HTTP/1.0]] [[要求]]に [[HTTP/0.9]]
[[応答]]が返されることとなります [SRC[>>18]] から、 [[HTTP/0.9]] [[要求]]でなくても
[[HTTP/0.9]] [[応答]]に対応できる必要があるようです。
[16] [[HTTP/1.0]] [[応答]]を処理できる[[クライアント]]は [[HTTP/0.9]] [[要求]]を送信するべきではありません [SRC[>>15]]。
* 要求の解釈
[32] [[nginx]] は、[CODE(HTTP)@en[[[GET]]]]、1文字[[以上]]の[[空白]]、
[[絶対パス]]か[[絶対URL]]、[[改行]]となっていなければ、 [CODE(HTTP)[[[400]]]]
[[応答]]に相当する[[応答本体]]を返します。[[要求メソッド]]は[[大文字]]でなければなりません。
[TIME[2015-06-14T08:52:57.800Z]]
[49] [[nginx]] は、 [CODE[HEAD]] や [CODE[POST]] や未知の[[要求メソッド]]のときも、
[CODE[400]] を返します。 [TIME[2016-08-26T15:40:45.300Z]]
[33] [[Apache]] は、任意の[[要求メソッド]]を認めています。 (もちろん当該[[資源]]で対応していなければ、
[CODE(HTTP)[[[405]]]] や [CODE(HTTP)[[[501]]]] が返されたり
(ただし[[応答本体]]のみ)、 [CODE(HTTP)@en[[[GET]]]] にフォールバックしたりします。
[CODE(HTTP)@en[[[HEAD]]]] では [CODE(HTTP)[[[400]]]] となります。
[TIME[2015-06-14T08:55:02.000Z]]
;; [34] [[Apache]] は [CODE(HTTP)@en[[[TRACE]]]] にも対応しているので、
[CODE(HTTP)@en[[[TRACE]]]] CRLF と書くと [CODE(HTTP)[[[TRACE]]]] が帰ってきます。
* 応答の解釈
[19] [[HTTP/1.0]] や [[HTTP/1.1]] の[[要求]]であっても、[[応答]]の先頭を[[状態行]]として解釈できなければ、
[[HTTP/0.9]] [[応答]]と解釈することとなります。
[28] [[応答]]の最初の行に、 [[Chrome]] と [[IE]] は [CODE[HTTP]]、
[[Firefox]] は [CODE[HTTP/1.]] が含まれていれば、 [[HTTP/0.9]] では無いとみなすようです。
[[HTTP]] は大文字でも小文字でも構いません。行頭でなくても構いません。
[[行]]は、 [[LF]] までです。 [TIME[2015-06-13T14:21:44.300Z]]
[39] 正確には、 [[Chrome]] と [[Firefox]] は最初の8バイトに [CODE[HTTP]]
が含まれていなければなりません。 ([[Firefox]] はその後に更に [CODE[/1.]] が必要ですが、
そこまで最初の8バイトに無くても良いようです。) その8バイトに[[改行]]が含まれていても構いません。
[[IE]] はもっと緩くて十数バイトあっても良いようですが (どこまでいけるかは不明)、
[CODE[HTTP]] の直後が[[改行]]であってはならないようです。 [TIME[2015-06-14T12:21:45.500Z]]
[7] [[Firefox]] と [[Chrome]] は [CODE(HTTP)@en[[[PUT]]]] への[[応答]]が
[[HTTP/0.9]] だと、エラーとみなすようです。
[[IE]] は通常の[[応答]]として扱うようです。
それ以外の[[要求メソッド]]は通常の[[応答]]として扱うようです。 [TIME[2015-08-01T12:15:28.700Z]]
[45] [[Firefox]] と [[Chrome]] は [CODE(HTTP)@en[[[CONNECT]]]] への[[応答]]が
[[HTTP/0.9]] だと、エラーとみなすようです。 [[IE]]
は正しく扱えず[[応答]]を待つように見えます。 [TIME[2015-09-14T02:30:12.400Z]]
[31] [[応答]]として何も返さないと (長さが0だと) [[ネットワークエラー]]とみなされるようです。
[[Firefox]] と [[Chrome]] では ([[XHR]] の) [[状態符号]] 0、
[[理由句]]が[[空文字列]]となります。 [[IE]] では [CODE[[[12152]]]]、
[CODE[[[Unknown]]]] となります。 [TIME[2015-06-14T08:46:47.800Z]]
[43] [[Chrome]] も [[Firefox]] も [[IE]] も、 [[プロキシ]]として指定された[[サーバー]]が
[[HTTP/0.9]] [[応答]]を返すと、それを通常通り[[応答]]として使います。 [TIME[2015-08-04T10:35:01.800Z]]
[44] [[Chrome]] は [[HTTP/0.9]] over [[TLS]] を[[ネットワークエラー]]とみなすようです。
[[Firefox]] と [[IE]] では通常通り扱われます。 [TIME[2015-08-13T14:26:17.300Z]]
[REFS[
- [5] [CITE@en[193921 – unable to http publish because not prompted for a password]]
( ([TIME[2014-07-15 07:03:01 +09:00]] 版))
<https://bugzilla.mozilla.org/show_bug.cgi?id=193921>
- [6] [CITE[chromium chromium/src/net/http/http_network_transaction.cc]]
( ([TIME[2014-07-14 05:04:37 +09:00]] 版))
<http://mxr.mozilla.org/chromium/source/src/net/http/http_network_transaction.cc#1028>
]REFS]
* 実装
[1] [[Apache]] に [KBD[[[GET]] / HTTP/0.9]] とかやってみたら、ほんとに HTTP/0.9 になりましたよ:−)
[8] >>1 現在の [[Apache]] は[[プロトコルの版]]に [[HTTP/0.9]]
を指定しても、 [[HTTP/1.0]] のように処理するようです。
[TIME[2014-08-28T12:55:31.400Z]]
[9] [[nginx]] は[[プロトコルの版]]に [[HTTP/0.9]] を指定すると、
[[要求行]]を受信した段階で [CODE(HTTP)[[[400]]]] を返します。
[27] [[nginx]] は [[HTTP/0.9]] [[応答]]に対して[[状態符号]]によらず[[応答本体]]のみ返しますが、
[[リダイレクト]]の場合 [[URL]] を[[応答本体]]には含めないため、
[[HTTP/0.9]] [[クライアント]]は[[リダイレクト]]先 [[URL]] を知ることができません。
[2] [CITE[HTTP0.9 Summary -- /DesignIssues]]
([TIME[2009-08-28 06:38:06 +09:00]] 版)
<http://www.w3.org/DesignIssues/HTTP0.9Summary.html>
[3] [CITE[IRC logs: freenode / #whatwg / 20140107]]
( ([TIME[2014-01-08 20:47:22 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20140107#l-537>
[4] [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-82>
[FIG(quote)[
[FIGCAPTION[
[35] [CITE@ja[HTTP/0.9にハマル | Livingdeadの日記 | スラド]]
([TIME[2015-06-14 18:02:16 +09:00]] 版)
<http://srad.jp/~Livingdead/journal/492941/>
]FIGCAPTION]
> ライブドア・データホテル・パトロールというサービスを使っている.これはなかなかのすぐれもので,ウェブサーバの監視をはじめ証明書の期限切れ検知などにも使えるのだが,最近lighttpdを使っているウェブサービスの死活監視に使ってみてHTTP/0.9のリクエストになっているのかなと思った.
> というのはlighttpdにtelnetで接続して「GET / 」と打つと400 Bad Requestになるのだが,データホテル・パトロールでも確かに400を検出して異常が検知されたことになる.
]FIG]
[36] [CITE[The HTTP Protocol As Implemented In W3]]
([TIME[1999-10-27 03:45:32 +09:00]] 版)
<http://www.w3.org/Protocols/HTTP/AsImplemented.html>
[40] [CITE[HTTP0.9 Summary -- /DesignIssues]]
([TIME[2009-08-28 06:38:06 +09:00]] 版)
<http://www.w3.org/DesignIssues/HTTP0.9Summary.html>
[41] [CITE[ProtocolVersions -- Design Issues]]
([TIME[2009-08-28 06:38:06 +09:00]] 版)
<http://www.w3.org/DesignIssues/ProtocolVersions.html>
[42] [CITE[CompatibleProof -- /DesignIssues]]
([TIME[2009-08-28 06:38:06 +09:00]] 版)
<http://www.w3.org/DesignIssues/CompatibleProof>
[FIG(quote)[
[FIGCAPTION[
[46] [CITE[Issue 517106 - chromium - Chrome refuses to accept HTTP/0.9 responses over SSL that are less than 8 bytes long. - An open-source project to help move the web forward. - Google Project Hosting]]
([TIME[2015-09-26 20:34:29 +09:00]] 版)
<https://code.google.com/p/chromium/issues/detail?id=517106>
]FIGCAPTION]
> Re-disable support for HTTP/0.9 responses < 8 bytes over SSL.
> This allows an MITM to make the firs byte of a valid HTTP/1.x response
> look like a valid HTTP/0.9 reponses, so best to be safe.
>
]FIG]
[FIG(quote)[
[FIGCAPTION[
[50] [CITE@en[Chromium Blog: Chrome 53 Beta: Shadow DOM, PaymentRequest, and Android autoplay]]
( ([TIME[2016-09-17 08:54:54 +09:00]]))
<http://blog.chromium.org/2016/08/chrome-53-beta-shadow-dom.html>
]FIGCAPTION]
> HTTP/0.9 has been deprecated in favor of HTTP/1.0, which adds response header support.
]FIG]