comparison src/http/ngx_http_parse.c @ 572:ff463db0be31 NGINX_0_8_38

nginx 0.8.38 *) Feature: the "proxy_no_cache" and "fastcgi_no_cache" directives. *) Feature: now the "rewrite" directive does a redirect automatically if the $scheme variable is used. Thanks to Piotr Sikora. *) Bugfix: now "limit_req" delay directive conforms to the described algorithm. Thanks to Maxim Dounin. *) Bugfix: the $uid_got variable might not be used in the SSI and perl modules.
author Igor Sysoev <http://sysoev.ru>
date Mon, 24 May 2010 00:00:00 +0400
parents 4c5d2c627a6c
children 01f2313e34f1
comparison
equal deleted inserted replaced
571:5b59e716792b 572:ff463db0be31
436 break; 436 break;
437 case '+': 437 case '+':
438 r->plus_in_uri = 1; 438 r->plus_in_uri = 1;
439 break; 439 break;
440 case '\0': 440 case '\0':
441 r->zero_in_uri = 1; 441 return NGX_HTTP_PARSE_INVALID_REQUEST;
442 break;
443 default: 442 default:
444 state = sw_check_uri; 443 state = sw_check_uri;
445 break; 444 break;
446 } 445 }
447 break; 446 break;
494 break; 493 break;
495 case '+': 494 case '+':
496 r->plus_in_uri = 1; 495 r->plus_in_uri = 1;
497 break; 496 break;
498 case '\0': 497 case '\0':
499 r->zero_in_uri = 1; 498 return NGX_HTTP_PARSE_INVALID_REQUEST;
500 break;
501 } 499 }
502 break; 500 break;
503 501
504 /* URI */ 502 /* URI */
505 case sw_uri: 503 case sw_uri:
524 goto done; 522 goto done;
525 case '#': 523 case '#':
526 r->complex_uri = 1; 524 r->complex_uri = 1;
527 break; 525 break;
528 case '\0': 526 case '\0':
529 r->zero_in_uri = 1; 527 return NGX_HTTP_PARSE_INVALID_REQUEST;
530 break;
531 } 528 }
532 break; 529 break;
533 530
534 /* space+ after URI */ 531 /* space+ after URI */
535 case sw_http_09: 532 case sw_http_09:
1200 if (ch == '#') { 1197 if (ch == '#') {
1201 *u++ = ch; 1198 *u++ = ch;
1202 ch = *p++; 1199 ch = *p++;
1203 1200
1204 } else if (ch == '\0') { 1201 } else if (ch == '\0') {
1205 r->zero_in_uri = 1; 1202 return NGX_HTTP_PARSE_INVALID_REQUEST;
1206 } 1203 }
1207 1204
1208 state = quoted_state; 1205 state = quoted_state;
1209 break; 1206 break;
1210 } 1207 }
1302 1299
1303 return NGX_OK; 1300 return NGX_OK;
1304 } 1301 }
1305 1302
1306 if (ch == '\0') { 1303 if (ch == '\0') {
1307 *flags |= NGX_HTTP_ZERO_IN_URI; 1304 goto unsafe;
1308 continue;
1309 } 1305 }
1310 1306
1311 if (ngx_path_separator(ch) && len > 2) { 1307 if (ngx_path_separator(ch) && len > 2) {
1312 1308
1313 /* detect "/../" */ 1309 /* detect "/../" */
1447 1443
1448 1444
1449 void 1445 void
1450 ngx_http_split_args(ngx_http_request_t *r, ngx_str_t *uri, ngx_str_t *args) 1446 ngx_http_split_args(ngx_http_request_t *r, ngx_str_t *uri, ngx_str_t *args)
1451 { 1447 {
1452 u_char ch, *p, *last; 1448 u_char *p, *last;
1453 1449
1454 p = uri->data; 1450 last = uri->data + uri->len;
1455 1451
1456 last = p + uri->len; 1452 p = ngx_strlchr(uri->data, last, '?');
1457 1453
1458 args->len = 0; 1454 if (p) {
1459 1455 uri->len = p - uri->data;
1460 while (p < last) { 1456 p++;
1461 1457 args->len = last - p;
1462 ch = *p++; 1458 args->data = p;
1463 1459
1464 if (ch == '?') { 1460 } else {
1465 args->len = last - p; 1461 args->len = 0;
1466 args->data = p;
1467
1468 uri->len = p - 1 - uri->data;
1469
1470 if (ngx_strlchr(p, last, '\0') != NULL) {
1471 r->zero_in_uri = 1;
1472 }
1473
1474 return;
1475 }
1476
1477 if (ch == '\0') {
1478 r->zero_in_uri = 1;
1479 continue;
1480 }
1481 } 1462 }
1482 } 1463 }