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 }