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') {