-
Notifications
You must be signed in to change notification settings - Fork 4
/
495.txt
75 lines (44 loc) · 3.3 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
* 処理
[2] [[要求]]の[[プロトコルの版]]が 0.9 なら、状態を、「応答本体前」に設定します。
[[応答]]の[[プロトコルの版]]を、 0.9 に設定します。
[3] [[要求]]の[[プロトコルの版]]が 1.1 なら、状態を、「応答前」に設定します。
[13] [[TCP]] [CODE[[[RST]]]] を受信したら、状態に関わらず、[[ネットワークエラー]]を返します。
[14] [[緊急ポインター]]は無視し、[[緊急データ]]も他のデータと変わらずに扱います。
** 状態遷移
*** 「応答前」状態
[8] 先頭8バイトを受信するまで待ちます。この先頭8バイトはまだ[[消費]]しません。
[9] [CODE[HTTP]] ([[ASCII大文字・小文字不区別]]) が含まれていれば、
状態を、「応答1前」に設定します。
[10] それ以外なら、状態を、「応答本体前」に設定します。
*** 「応答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>
([[名無しさん]])