-
Notifications
You must be signed in to change notification settings - Fork 4
/
495.txt
87 lines (57 loc) · 3.85 KB
/
495.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
* 処理
[2] 初期状態では、[VAR[状態]]を、「応答前」に設定します。
[13] [[TCP]] [CODE[[[RST]]]] を受信したら、[VAR[状態]]に関わらず、[[ネットワークエラー]]を返します。
[14] [[緊急ポインター]]は無視し、[[緊急データ]]も他のデータと変わらずに扱います。
** 状態遷移
*** 「応答前」状態
[25] この状態に遷移してきたら、[VAR[一時バッファー]]を、[[空文字列]]に設定します。
[24] バイトを受信したら、
[FIG(steps)[
= [26] 受信したバイトを、[VAR[一時バッファー]]の末尾に連結します。
= [27] [VAR[一時バッファー]]の末尾4バイトが [CODE(HTTP)[HTTP]]
([[ASCII大文字・小文字不区別]]) なら、
== [[応答]]の[[プロトコルの版]]を 1.0 に設定します。
== [VAR[状態]]を、「応答1前」に設定します。
= [28] それ以外で、[VAR[一時バッファー]]が8バイトになったら、
== [[応答]]の[[本体]]を、[VAR[一時バッファー]]の値に設定します。
== [VAR[状態]]を、「応答本体」に設定します。
]FIG]
[8] [[EOF]] を受信したら、
[FIG(steps)[
= [VAR[一時バッファー]]が[[空文字列]]なら、[[ネットワークエラー]]を返します。
= それ以外なら、
== [[応答]]の[[本体]]を、[VAR[一時バッファー]]の値に設定します。
== [VAR[状態]]を、「応答本体」に設定します。
]FIG]
*** 「応答1前」状態
[11] LF LF または LF CR LF が見つかるまで受信を続けます。
[12] 見つからなければ、[[ネットワークエラー]]を返します。
[15] 見つかった場合、受信したデータをヘッダー群として構文解析します。「応答前」状態で受信した先頭8バイトも含めます。
末尾の LF と、あればその直前の CR は、無視します。その直前まで含めます。
[16] その後、状態を、「応答本体」に設定します。
*** 「応答本体前」状態
[4] バイトを受信したら、応答の本体バイト列の末尾に、受信したバイトを追加します。
状態を、「応答本体」に設定します。
[5] [[EOF]] を受信したら、[[ネットワークエラー]]を返します。
*** 「応答本体」状態
[6] バイトを受信したら、応答の本体バイト列の末尾に、受信したバイトを追加します。
状態を、「応答本体」に設定します。
[7] [[EOF]] を受信したら、停止します。
** ヘッダー群として構文解析
[17] 入力を、省略可能な CR とその直後の LF によって区切られる[[行]]に分割します。
[18] 最初の[[行]]に [CODE[HTTP]] ([[ASCII大文字・小文字不区別]])、 [CODE[/]]、
[[ASCII数字]]列、[CODE[.]]、[[ASCII数字]]列、0個以上の[[空白]]の列があれば、そのような最初の部分まで除去します。
[19] 最初の[[ASCII数字]]列を[[十進整数]]として解釈すると2[[以上]]か、
1と等しく次の[[ASCII数字]]列が[[十進整数]]として解釈すると1[[以上]]なら、
[[応答]]の[[プロトコルの版]]を、 1.1 に設定します。
[20] それ以外なら、[[応答]]の[[プロトコルの版]]を、 1.0 に設定します。
[21] 3桁の[[ASCII整数]]列があれば、[[応答]]の[[状態符号]]をその値に設定します。
その後の0個以上の[[空白]]の列まで除去します。
[22] [[応答]]の[[理由句]]を、最初の[[行]]の残りに設定します。(行末の [[CR]] と [[LF]]
は含めません。)
[23] 残りの[[行]]を順番に、
@@ ...
* 歴史
[1]
[CITE@en[Tolerant HTTP Parsing]] ([TIME[2007-09-05 04:32:55 +09:00]] 版) <http://geoffers.uni.cc/draft-sneddon-http-parsing-00.html>
([[名無しさん]])