comparison src/http/ngx_http_parse.c @ 12:055ed05235ae

nginx-0.0.1-2002-09-13-18:47:42 import
author Igor Sysoev <igor@sysoev.ru>
date Fri, 13 Sep 2002 14:47:42 +0000
parents 6f58641241bb
children 72ad26c77d2d
comparison
equal deleted inserted replaced
11:f323b4f74e4a 12:055ed05235ae
30 /* 30 /*
31 printf("\nstate: %d, pos: %x, end: %x, char: '%c' buf: %s", 31 printf("\nstate: %d, pos: %x, end: %x, char: '%c' buf: %s",
32 state, p, r->header_in->last, ch, p); 32 state, p, r->header_in->last, ch, p);
33 */ 33 */
34 34
35 /* GCC 2.95.2 and VC 6.0 compiles switch as jump table */ 35 /* GCC 2.95.2 and VC 6.0 compiles this switch as jump table */
36 36
37 switch (state) { 37 switch (state) {
38 38
39 /* HTTP methods: GET, HEAD, POST */ 39 /* HTTP methods: GET, HEAD, POST */
40 case sw_start: 40 case sw_start:
42 case 'G': 42 case 'G':
43 if (p + 1 >= r->header_in->last.mem) 43 if (p + 1 >= r->header_in->last.mem)
44 return NGX_AGAIN; 44 return NGX_AGAIN;
45 45
46 if (*p != 'E' || *(p + 1) != 'T') 46 if (*p != 'E' || *(p + 1) != 'T')
47 return NGX_HTTP_INVALID_METHOD; 47 return NGX_HTTP_PARSE_INVALID_METHOD;
48 48
49 r->method = NGX_HTTP_GET; 49 r->method = NGX_HTTP_GET;
50 p += 2; 50 p += 2;
51 break; 51 break;
52 52
53 case 'H': 53 case 'H':
54 if (p + 2 >= r->header_in->last.mem) 54 if (p + 2 >= r->header_in->last.mem)
55 return NGX_AGAIN; 55 return NGX_AGAIN;
56 56
57 if (*p != 'E' || *(p + 1) != 'A' || *(p + 2) != 'D') 57 if (*p != 'E' || *(p + 1) != 'A' || *(p + 2) != 'D')
58 return NGX_HTTP_INVALID_METHOD; 58 return NGX_HTTP_PARSE_INVALID_METHOD;
59 59
60 r->method = NGX_HTTP_HEAD; 60 r->method = NGX_HTTP_HEAD;
61 p += 3; 61 p += 3;
62 break; 62 break;
63 63
64 case 'P': 64 case 'P':
65 if (p + 2 >= r->header_in->last.mem) 65 if (p + 2 >= r->header_in->last.mem)
66 return NGX_AGAIN; 66 return NGX_AGAIN;
67 67
68 if (*p != 'O' || *(p + 1) != 'S' || *(p + 2) != 'T') 68 if (*p != 'O' || *(p + 1) != 'S' || *(p + 2) != 'T')
69 return NGX_HTTP_INVALID_METHOD; 69 return NGX_HTTP_PARSE_INVALID_METHOD;
70 70
71 r->method = NGX_HTTP_POST; 71 r->method = NGX_HTTP_POST;
72 p += 3; 72 p += 3;
73 break; 73 break;
74 74
75 default: 75 default:
76 return NGX_HTTP_INVALID_METHOD; 76 return NGX_HTTP_PARSE_INVALID_METHOD;
77 } 77 }
78 78
79 state = sw_space_after_method; 79 state = sw_space_after_method;
80 break; 80 break;
81 81
84 switch (ch) { 84 switch (ch) {
85 case ' ': 85 case ' ':
86 state = sw_spaces_before_uri; 86 state = sw_spaces_before_uri;
87 break; 87 break;
88 default: 88 default:
89 return NGX_HTTP_INVALID_METHOD; 89 return NGX_HTTP_PARSE_INVALID_METHOD;
90 } 90 }
91 break; 91 break;
92 92
93 /* space* before URI */ 93 /* space* before URI */
94 case sw_spaces_before_uri: 94 case sw_spaces_before_uri:
208 break; 208 break;
209 case 'H': 209 case 'H':
210 state = sw_http_version; 210 state = sw_http_version;
211 break; 211 break;
212 default: 212 default:
213 return NGX_HTTP_INVALID_REQUEST; 213 return NGX_HTTP_PARSE_INVALID_REQUEST;
214 } 214 }
215 break; 215 break;
216 216
217 /* TTP/ */ 217 /* TTP/ */
218 case sw_http_version: 218 case sw_http_version:
221 r->header_in->pos.mem = p - 1; 221 r->header_in->pos.mem = p - 1;
222 return NGX_AGAIN; 222 return NGX_AGAIN;
223 } 223 }
224 224
225 if (ch != 'T' || *p != 'T' || *(p + 1) != 'P' || *(p + 2) != '/') 225 if (ch != 'T' || *p != 'T' || *(p + 1) != 'P' || *(p + 2) != '/')
226 return NGX_HTTP_INVALID_REQUEST; 226 return NGX_HTTP_PARSE_INVALID_REQUEST;
227 227
228 p += 3; 228 p += 3;
229 state = sw_first_major_digit; 229 state = sw_first_major_digit;
230 break; 230 break;
231 231
232 /* first digit of major HTTP version */ 232 /* first digit of major HTTP version */
233 case sw_first_major_digit: 233 case sw_first_major_digit:
234 if (ch < '1' || ch > '9') 234 if (ch < '1' || ch > '9')
235 return NGX_HTTP_INVALID_REQUEST; 235 return NGX_HTTP_PARSE_INVALID_REQUEST;
236 236
237 r->http_major = ch - '0'; 237 r->http_major = ch - '0';
238 state = sw_major_digit; 238 state = sw_major_digit;
239 break; 239 break;
240 240
244 state = sw_first_minor_digit; 244 state = sw_first_minor_digit;
245 break; 245 break;
246 } 246 }
247 247
248 if (ch < '0' || ch > '9') 248 if (ch < '0' || ch > '9')
249 return NGX_HTTP_INVALID_REQUEST; 249 return NGX_HTTP_PARSE_INVALID_REQUEST;
250 250
251 r->http_major = r->http_major * 10 + ch - '0'; 251 r->http_major = r->http_major * 10 + ch - '0';
252 break; 252 break;
253 253
254 /* first digit of minor HTTP version */ 254 /* first digit of minor HTTP version */
255 case sw_first_minor_digit: 255 case sw_first_minor_digit:
256 if (ch < '0' || ch > '9') 256 if (ch < '0' || ch > '9')
257 return NGX_HTTP_INVALID_REQUEST; 257 return NGX_HTTP_PARSE_INVALID_REQUEST;
258 258
259 r->http_minor = ch - '0'; 259 r->http_minor = ch - '0';
260 260
261 state = sw_minor_digit; 261 state = sw_minor_digit;
262 break; 262 break;
272 state = sw_done; 272 state = sw_done;
273 break; 273 break;
274 } 274 }
275 275
276 if (ch < '0' || ch > '9') 276 if (ch < '0' || ch > '9')
277 return NGX_HTTP_INVALID_REQUEST; 277 return NGX_HTTP_PARSE_INVALID_REQUEST;
278 278
279 r->http_minor = r->http_minor * 10 + ch - '0'; 279 r->http_minor = r->http_minor * 10 + ch - '0';
280 break; 280 break;
281 281
282 /* end of request line */ 282 /* end of request line */
284 switch (ch) { 284 switch (ch) {
285 case LF: 285 case LF:
286 state = sw_done; 286 state = sw_done;
287 break; 287 break;
288 default: 288 default:
289 return NGX_HTTP_INVALID_REQUEST; 289 return NGX_HTTP_PARSE_INVALID_REQUEST;
290 } 290 }
291 break; 291 break;
292 } 292 }
293 } 293 }
294 294
296 296
297 if (state == sw_done) { 297 if (state == sw_done) {
298 r->http_version = r->http_major * 1000 + r->http_minor; 298 r->http_version = r->http_major * 1000 + r->http_minor;
299 r->state = sw_start; 299 r->state = sw_start;
300 if (r->http_version == 9 && r->method == NGX_HTTP_HEAD) 300 if (r->http_version == 9 && r->method == NGX_HTTP_HEAD)
301 return NGX_HTTP_INVALID_HEAD; 301 return NGX_HTTP_PARSE_INVALID_HEAD;
302 else 302 else
303 return NGX_OK; 303 return NGX_OK;
304 } else { 304 } else {
305 r->state = state; 305 r->state = state;
306 return NGX_AGAIN; 306 return NGX_AGAIN;
356 break; 356 break;
357 357
358 if (ch >= '0' && ch <= '9') 358 if (ch >= '0' && ch <= '9')
359 break; 359 break;
360 360
361 return NGX_HTTP_INVALID_HEADER; 361 return NGX_HTTP_PARSE_INVALID_HEADER;
362 362
363 } 363 }
364 break; 364 break;
365 365
366 /* header name */ 366 /* header name */
379 break; 379 break;
380 380
381 if (ch >= '0' && ch <= '9') 381 if (ch >= '0' && ch <= '9')
382 break; 382 break;
383 383
384 return NGX_HTTP_INVALID_HEADER; 384 return NGX_HTTP_PARSE_INVALID_HEADER;
385 385
386 /* space* before header value */ 386 /* space* before header value */
387 case sw_space_before_value: 387 case sw_space_before_value:
388 switch (ch) { 388 switch (ch) {
389 case ' ': 389 case ' ':
443 switch (ch) { 443 switch (ch) {
444 case LF: 444 case LF:
445 state = sw_done; 445 state = sw_done;
446 break; 446 break;
447 default: 447 default:
448 return NGX_HTTP_INVALID_HEADER; 448 return NGX_HTTP_PARSE_INVALID_HEADER;
449 } 449 }
450 break; 450 break;
451 451
452 /* end of header */ 452 /* end of header */
453 case sw_header_almost_done: 453 case sw_header_almost_done:
454 switch (ch) { 454 switch (ch) {
455 case LF: 455 case LF:
456 state = sw_header_done; 456 state = sw_header_done;
457 break; 457 break;
458 default: 458 default:
459 return NGX_HTTP_INVALID_HEADER; 459 return NGX_HTTP_PARSE_INVALID_HEADER;
460 } 460 }
461 break; 461 break;
462 } 462 }
463 } 463 }
464 464
467 if (state == sw_done) { 467 if (state == sw_done) {
468 r->state = sw_start; 468 r->state = sw_start;
469 return NGX_OK; 469 return NGX_OK;
470 } else if (state == sw_header_done) { 470 } else if (state == sw_header_done) {
471 r->state = sw_start; 471 r->state = sw_start;
472 return NGX_HTTP_HEADER_DONE; 472 return NGX_HTTP_PARSE_HEADER_DONE;
473 } else { 473 } else {
474 r->state = state; 474 r->state = state;
475 return NGX_AGAIN; 475 return NGX_AGAIN;
476 } 476 }
477 } 477 }