Mercurial > hg > nginx-quic
comparison src/http/ngx_http_parse.c @ 44:0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 09 Jan 2003 05:36:00 +0000 |
parents | 53cb81681040 |
children | a499e0d1f16e |
comparison
equal
deleted
inserted
replaced
43:53cd05892261 | 44:0e81ac0bb3e2 |
---|---|
41 | 41 |
42 /* HTTP methods: GET, HEAD, POST */ | 42 /* HTTP methods: GET, HEAD, POST */ |
43 case sw_start: | 43 case sw_start: |
44 switch (ch) { | 44 switch (ch) { |
45 case 'G': | 45 case 'G': |
46 if (p + 1 >= r->header_in->last.mem) | 46 if (p + 1 >= r->header_in->last.mem) { |
47 return NGX_AGAIN; | 47 return NGX_AGAIN; |
48 | 48 } |
49 if (*p != 'E' || *(p + 1) != 'T') | 49 |
50 if (*p != 'E' || *(p + 1) != 'T') { | |
50 return NGX_HTTP_PARSE_INVALID_METHOD; | 51 return NGX_HTTP_PARSE_INVALID_METHOD; |
52 } | |
51 | 53 |
52 r->method = NGX_HTTP_GET; | 54 r->method = NGX_HTTP_GET; |
53 p += 2; | 55 p += 2; |
54 break; | 56 break; |
55 | 57 |
56 case 'H': | 58 case 'H': |
57 if (p + 2 >= r->header_in->last.mem) | 59 if (p + 2 >= r->header_in->last.mem) { |
58 return NGX_AGAIN; | 60 return NGX_AGAIN; |
59 | 61 } |
60 if (*p != 'E' || *(p + 1) != 'A' || *(p + 2) != 'D') | 62 |
63 if (*p != 'E' || *(p + 1) != 'A' || *(p + 2) != 'D') { | |
61 return NGX_HTTP_PARSE_INVALID_METHOD; | 64 return NGX_HTTP_PARSE_INVALID_METHOD; |
65 } | |
62 | 66 |
63 r->method = NGX_HTTP_HEAD; | 67 r->method = NGX_HTTP_HEAD; |
64 p += 3; | 68 p += 3; |
65 break; | 69 break; |
66 | 70 |
67 case 'P': | 71 case 'P': |
68 if (p + 2 >= r->header_in->last.mem) | 72 if (p + 2 >= r->header_in->last.mem) { |
69 return NGX_AGAIN; | 73 return NGX_AGAIN; |
70 | 74 } |
71 if (*p != 'O' || *(p + 1) != 'S' || *(p + 2) != 'T') | 75 |
76 if (*p != 'O' || *(p + 1) != 'S' || *(p + 2) != 'T') { | |
72 return NGX_HTTP_PARSE_INVALID_METHOD; | 77 return NGX_HTTP_PARSE_INVALID_METHOD; |
78 } | |
73 | 79 |
74 r->method = NGX_HTTP_POST; | 80 r->method = NGX_HTTP_POST; |
75 p += 3; | 81 p += 3; |
76 break; | 82 break; |
77 | 83 |
224 r->state = sw_http_version; | 230 r->state = sw_http_version; |
225 r->header_in->pos.mem = p - 1; | 231 r->header_in->pos.mem = p - 1; |
226 return NGX_AGAIN; | 232 return NGX_AGAIN; |
227 } | 233 } |
228 | 234 |
229 if (ch != 'T' || *p != 'T' || *(p + 1) != 'P' || *(p + 2) != '/') | 235 if (ch != 'T' || *p != 'T' || *(p + 1) != 'P' || *(p + 2) != '/') { |
230 return NGX_HTTP_PARSE_INVALID_REQUEST; | 236 return NGX_HTTP_PARSE_INVALID_REQUEST; |
237 } | |
231 | 238 |
232 p += 3; | 239 p += 3; |
233 state = sw_first_major_digit; | 240 state = sw_first_major_digit; |
234 break; | 241 break; |
235 | 242 |
236 /* first digit of major HTTP version */ | 243 /* first digit of major HTTP version */ |
237 case sw_first_major_digit: | 244 case sw_first_major_digit: |
238 if (ch < '1' || ch > '9') | 245 if (ch < '1' || ch > '9') { |
239 return NGX_HTTP_PARSE_INVALID_REQUEST; | 246 return NGX_HTTP_PARSE_INVALID_REQUEST; |
247 } | |
240 | 248 |
241 r->http_major = ch - '0'; | 249 r->http_major = ch - '0'; |
242 state = sw_major_digit; | 250 state = sw_major_digit; |
243 break; | 251 break; |
244 | 252 |
247 if (ch == '.') { | 255 if (ch == '.') { |
248 state = sw_first_minor_digit; | 256 state = sw_first_minor_digit; |
249 break; | 257 break; |
250 } | 258 } |
251 | 259 |
252 if (ch < '0' || ch > '9') | 260 if (ch < '0' || ch > '9') { |
253 return NGX_HTTP_PARSE_INVALID_REQUEST; | 261 return NGX_HTTP_PARSE_INVALID_REQUEST; |
262 } | |
254 | 263 |
255 r->http_major = r->http_major * 10 + ch - '0'; | 264 r->http_major = r->http_major * 10 + ch - '0'; |
256 break; | 265 break; |
257 | 266 |
258 /* first digit of minor HTTP version */ | 267 /* first digit of minor HTTP version */ |
259 case sw_first_minor_digit: | 268 case sw_first_minor_digit: |
260 if (ch < '0' || ch > '9') | 269 if (ch < '0' || ch > '9') { |
261 return NGX_HTTP_PARSE_INVALID_REQUEST; | 270 return NGX_HTTP_PARSE_INVALID_REQUEST; |
271 } | |
262 | 272 |
263 r->http_minor = ch - '0'; | 273 r->http_minor = ch - '0'; |
264 state = sw_minor_digit; | 274 state = sw_minor_digit; |
265 break; | 275 break; |
266 | 276 |
274 if (ch == LF) { | 284 if (ch == LF) { |
275 state = sw_done; | 285 state = sw_done; |
276 break; | 286 break; |
277 } | 287 } |
278 | 288 |
279 if (ch < '0' || ch > '9') | 289 if (ch < '0' || ch > '9') { |
280 return NGX_HTTP_PARSE_INVALID_REQUEST; | 290 return NGX_HTTP_PARSE_INVALID_REQUEST; |
291 } | |
281 | 292 |
282 r->http_minor = r->http_minor * 10 + ch - '0'; | 293 r->http_minor = r->http_minor * 10 + ch - '0'; |
283 break; | 294 break; |
284 | 295 |
285 /* end of request line */ | 296 /* end of request line */ |
297 } | 308 } |
298 | 309 |
299 r->header_in->pos.mem = p; | 310 r->header_in->pos.mem = p; |
300 | 311 |
301 if (state == sw_done) { | 312 if (state == sw_done) { |
302 if (r->request_end == NULL) | 313 if (r->request_end == NULL) { |
303 r->request_end = p - 1; | 314 r->request_end = p - 1; |
315 } | |
316 | |
304 r->http_version = r->http_major * 1000 + r->http_minor; | 317 r->http_version = r->http_major * 1000 + r->http_minor; |
305 r->state = sw_start; | 318 r->state = sw_start; |
306 if (r->http_version == 9 && r->method == NGX_HTTP_HEAD) | 319 |
320 if (r->http_version == 9 && r->method == NGX_HTTP_HEAD) { | |
307 return NGX_HTTP_PARSE_INVALID_HEAD; | 321 return NGX_HTTP_PARSE_INVALID_HEAD; |
308 else | 322 } else { |
309 return NGX_OK; | 323 return NGX_OK; |
324 } | |
325 | |
310 } else { | 326 } else { |
311 r->state = state; | 327 r->state = state; |
312 return NGX_AGAIN; | 328 return NGX_AGAIN; |
313 } | 329 } |
314 } | 330 } |
356 default: | 372 default: |
357 state = sw_name; | 373 state = sw_name; |
358 r->header_name_start = p - 1; | 374 r->header_name_start = p - 1; |
359 | 375 |
360 c = ch | 0x20; | 376 c = ch | 0x20; |
361 if (c >= 'a' && c <= 'z') | 377 if (c >= 'a' && c <= 'z') { |
362 break; | 378 break; |
363 | 379 } |
364 if (ch == '-') | 380 |
381 if (ch == '-') { | |
365 break; | 382 break; |
366 | 383 } |
367 if (ch >= '0' && ch <= '9') | 384 |
385 if (ch >= '0' && ch <= '9') { | |
368 break; | 386 break; |
387 } | |
369 | 388 |
370 return NGX_HTTP_PARSE_INVALID_HEADER; | 389 return NGX_HTTP_PARSE_INVALID_HEADER; |
371 | 390 |
372 } | 391 } |
373 break; | 392 break; |
374 | 393 |
375 /* header name */ | 394 /* header name */ |
376 case sw_name: | 395 case sw_name: |
377 c = ch | 0x20; | 396 c = ch | 0x20; |
378 if (c >= 'a' && c <= 'z') | 397 if (c >= 'a' && c <= 'z') { |
379 break; | 398 break; |
399 } | |
380 | 400 |
381 if (ch == ':') { | 401 if (ch == ':') { |
382 r->header_name_end = p - 1; | 402 r->header_name_end = p - 1; |
383 state = sw_space_before_value; | 403 state = sw_space_before_value; |
384 break; | 404 break; |
385 } | 405 } |
386 | 406 |
387 if (ch == '-') | 407 if (ch == '-') { |
388 break; | 408 break; |
389 | 409 } |
390 if (ch >= '0' && ch <= '9') | 410 |
391 break; | 411 if (ch >= '0' && ch <= '9') { |
412 break; | |
413 } | |
392 | 414 |
393 return NGX_HTTP_PARSE_INVALID_HEADER; | 415 return NGX_HTTP_PARSE_INVALID_HEADER; |
394 | 416 |
395 /* space* before header value */ | 417 /* space* before header value */ |
396 case sw_space_before_value: | 418 case sw_space_before_value: |
474 h->pos.mem = p; | 496 h->pos.mem = p; |
475 | 497 |
476 if (state == sw_done) { | 498 if (state == sw_done) { |
477 r->state = sw_start; | 499 r->state = sw_start; |
478 return NGX_OK; | 500 return NGX_OK; |
501 | |
479 } else if (state == sw_header_done) { | 502 } else if (state == sw_header_done) { |
480 r->state = sw_start; | 503 r->state = sw_start; |
481 return NGX_HTTP_PARSE_HEADER_DONE; | 504 return NGX_HTTP_PARSE_HEADER_DONE; |
505 | |
482 } else { | 506 } else { |
483 r->state = state; | 507 r->state = state; |
484 return NGX_AGAIN; | 508 return NGX_AGAIN; |
485 } | 509 } |
486 } | 510 } |