Mercurial > hg > nginx
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 } |