Mercurial > hg > nginx-quic
comparison src/http/ngx_http_parse.c @ 91:637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 19 May 2003 16:39:14 +0000 |
parents | 29bf798b583f |
children | a059e1aa65d4 |
comparison
equal
deleted
inserted
replaced
90:37530da31268 | 91:637625a2acdb |
---|---|
7 { | 7 { |
8 char ch; | 8 char ch; |
9 char *p; | 9 char *p; |
10 enum { | 10 enum { |
11 sw_start = 0, | 11 sw_start = 0, |
12 sw_G, | |
13 sw_GE, | |
14 sw_H, | |
15 sw_HE, | |
16 sw_HEA, | |
17 sw_P, | |
18 sw_PO, | |
19 sw_POS, | |
12 sw_space_after_method, | 20 sw_space_after_method, |
13 sw_spaces_before_uri, | 21 sw_spaces_before_uri, |
14 sw_after_slash_in_uri, | 22 sw_after_slash_in_uri, |
15 sw_check_uri, | 23 sw_check_uri, |
16 sw_uri, | 24 sw_uri, |
17 sw_http_09, | 25 sw_http_09, |
18 sw_http_version, | 26 sw_http_H, |
27 sw_http_HT, | |
28 sw_http_HTT, | |
29 sw_http_HTTP, | |
19 sw_first_major_digit, | 30 sw_first_major_digit, |
20 sw_major_digit, | 31 sw_major_digit, |
21 sw_first_minor_digit, | 32 sw_first_minor_digit, |
22 sw_minor_digit, | 33 sw_minor_digit, |
23 sw_almost_done, | 34 sw_almost_done, |
28 p = r->header_in->pos; | 39 p = r->header_in->pos; |
29 | 40 |
30 while (p < r->header_in->last && state < sw_done) { | 41 while (p < r->header_in->last && state < sw_done) { |
31 ch = *p++; | 42 ch = *p++; |
32 | 43 |
33 /* GCC 2.95.2 and VC 6.0 compile this switch as jump table */ | 44 /* gcc 2.95.2 and vc 6.0 compile this switch as an jump table */ |
34 | 45 |
35 switch (state) { | 46 switch (state) { |
36 | 47 |
37 /* HTTP methods: GET, HEAD, POST */ | 48 /* HTTP methods: GET, HEAD, POST */ |
38 case sw_start: | 49 case sw_start: |
39 r->request_start = p - 1; | 50 r->request_start = p - 1; |
40 | 51 |
41 switch (ch) { | 52 switch (ch) { |
42 case 'G': | 53 case 'G': |
43 if (p + 1 >= r->header_in->last) { | 54 state = sw_G; |
44 return NGX_AGAIN; | 55 break; |
45 } | 56 case 'H': |
46 | 57 state = sw_H; |
47 if (*p != 'E' || *(p + 1) != 'T') { | 58 break; |
48 return NGX_HTTP_PARSE_INVALID_METHOD; | 59 case 'P': |
49 } | 60 state = sw_P; |
50 | 61 break; |
62 default: | |
63 return NGX_HTTP_PARSE_INVALID_METHOD; | |
64 } | |
65 break; | |
66 | |
67 case sw_G: | |
68 switch (ch) { | |
69 case 'E': | |
70 state = sw_GE; | |
71 break; | |
72 default: | |
73 return NGX_HTTP_PARSE_INVALID_METHOD; | |
74 } | |
75 break; | |
76 | |
77 case sw_GE: | |
78 switch (ch) { | |
79 case 'T': | |
51 r->method = NGX_HTTP_GET; | 80 r->method = NGX_HTTP_GET; |
52 p += 2; | 81 state = sw_space_after_method; |
53 break; | 82 break; |
54 | 83 default: |
55 case 'H': | 84 return NGX_HTTP_PARSE_INVALID_METHOD; |
56 if (p + 2 >= r->header_in->last) { | 85 } |
57 return NGX_AGAIN; | 86 break; |
58 } | 87 |
59 | 88 case sw_H: |
60 if (*p != 'E' || *(p + 1) != 'A' || *(p + 2) != 'D') { | 89 switch (ch) { |
61 return NGX_HTTP_PARSE_INVALID_METHOD; | 90 case 'E': |
62 } | 91 state = sw_HE; |
63 | 92 break; |
93 default: | |
94 return NGX_HTTP_PARSE_INVALID_METHOD; | |
95 } | |
96 break; | |
97 | |
98 case sw_HE: | |
99 switch (ch) { | |
100 case 'A': | |
101 state = sw_HEA; | |
102 break; | |
103 default: | |
104 return NGX_HTTP_PARSE_INVALID_METHOD; | |
105 } | |
106 break; | |
107 | |
108 case sw_HEA: | |
109 switch (ch) { | |
110 case 'D': | |
64 r->method = NGX_HTTP_HEAD; | 111 r->method = NGX_HTTP_HEAD; |
65 p += 3; | 112 state = sw_space_after_method; |
66 break; | 113 break; |
67 | 114 default: |
68 case 'P': | 115 return NGX_HTTP_PARSE_INVALID_METHOD; |
69 if (p + 2 >= r->header_in->last) { | 116 } |
70 return NGX_AGAIN; | 117 break; |
71 } | 118 |
72 | 119 case sw_P: |
73 if (*p != 'O' || *(p + 1) != 'S' || *(p + 2) != 'T') { | 120 switch (ch) { |
74 return NGX_HTTP_PARSE_INVALID_METHOD; | 121 case 'O': |
75 } | 122 state = sw_PO; |
76 | 123 break; |
124 default: | |
125 return NGX_HTTP_PARSE_INVALID_METHOD; | |
126 } | |
127 break; | |
128 | |
129 case sw_PO: | |
130 switch (ch) { | |
131 case 'S': | |
132 state = sw_POS; | |
133 break; | |
134 default: | |
135 return NGX_HTTP_PARSE_INVALID_METHOD; | |
136 } | |
137 break; | |
138 | |
139 case sw_POS: | |
140 switch (ch) { | |
141 case 'T': | |
77 r->method = NGX_HTTP_POST; | 142 r->method = NGX_HTTP_POST; |
78 p += 3; | 143 state = sw_space_after_method; |
79 break; | 144 break; |
80 | 145 default: |
81 default: | 146 return NGX_HTTP_PARSE_INVALID_METHOD; |
82 return NGX_HTTP_PARSE_INVALID_METHOD; | 147 } |
83 } | |
84 | |
85 state = sw_space_after_method; | |
86 break; | 148 break; |
87 | 149 |
88 /* single space after method */ | 150 /* single space after method */ |
89 case sw_space_after_method: | 151 case sw_space_after_method: |
90 switch (ch) { | 152 switch (ch) { |
212 case LF: | 274 case LF: |
213 r->http_minor = 9; | 275 r->http_minor = 9; |
214 state = sw_done; | 276 state = sw_done; |
215 break; | 277 break; |
216 case 'H': | 278 case 'H': |
217 state = sw_http_version; | 279 state = sw_http_H; |
218 break; | 280 break; |
219 default: | 281 default: |
220 return NGX_HTTP_PARSE_INVALID_REQUEST; | 282 return NGX_HTTP_PARSE_INVALID_REQUEST; |
221 } | 283 } |
222 break; | 284 break; |
223 | 285 |
224 /* "TTP/" */ | 286 case sw_http_H: |
225 case sw_http_version: | 287 switch (ch) { |
226 if (p + 2 >= r->header_in->last) { | 288 case 'T': |
227 r->state = sw_http_version; | 289 state = sw_http_HT; |
228 r->header_in->pos = p - 1; | 290 break; |
229 return NGX_AGAIN; | 291 default: |
230 } | 292 return NGX_HTTP_PARSE_INVALID_REQUEST; |
231 | 293 } |
232 if (ch != 'T' || *p != 'T' || *(p + 1) != 'P' || *(p + 2) != '/') { | 294 break; |
233 return NGX_HTTP_PARSE_INVALID_REQUEST; | 295 |
234 } | 296 case sw_http_HT: |
235 | 297 switch (ch) { |
236 p += 3; | 298 case 'T': |
237 state = sw_first_major_digit; | 299 state = sw_http_HTT; |
300 break; | |
301 default: | |
302 return NGX_HTTP_PARSE_INVALID_REQUEST; | |
303 } | |
304 break; | |
305 | |
306 case sw_http_HTT: | |
307 switch (ch) { | |
308 case 'P': | |
309 state = sw_http_HTTP; | |
310 break; | |
311 default: | |
312 return NGX_HTTP_PARSE_INVALID_REQUEST; | |
313 } | |
314 break; | |
315 | |
316 case sw_http_HTTP: | |
317 switch (ch) { | |
318 case '/': | |
319 state = sw_first_major_digit; | |
320 break; | |
321 default: | |
322 return NGX_HTTP_PARSE_INVALID_REQUEST; | |
323 } | |
238 break; | 324 break; |
239 | 325 |
240 /* first digit of major HTTP version */ | 326 /* first digit of major HTTP version */ |
241 case sw_first_major_digit: | 327 case sw_first_major_digit: |
242 if (ch < '1' || ch > '9') { | 328 if (ch < '1' || ch > '9') { |