comparison src/http/ngx_http_parse.c @ 508:68c0ae0a4959 NGINX_0_7_66

nginx 0.7.66 *) Security: now nginx/Windows ignores default file stream name. Thanks to Jose Antonio Vazquez Gonzalez. *) Change: now the charset filter runs before the SSI filter. *) Change: now no message is written in an error log if a variable is not found by $r->variable() method. *) Change: now keepalive connections after POST requests are not disabled for MSIE 7.0+. Thanks to Adam Lounds. *) 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. *) Feature: the "chunked_transfer_encoding" directive. *) Feature: the $geoip_city_continent_code, $geoip_latitude, and $geoip_longitude variables. Thanks to Arvind Sundararajan. *) Feature: now the ngx_http_image_filter_module deletes always EXIF and other application specific data if the data consume more than 5% of a JPEG file. *) Feature: now the "msie_padding" directive works for Chrome too. *) Workaround: now keepalive connections are disabled for Safari. Thanks to Joshua Sierles. *) Bugfix: nginx ignored the "private" and "no-store" values in the "Cache-Control" backend response header line. *) Bugfix: an "&" character was not escaped when it was copied in arguments part in a rewrite rule. *) Bugfix: nginx might be terminated abnormally while a signal processing or if the directive "timer_resolution" was used on platforms which do not support kqueue or eventport notification methods. Thanks to George Xie and Maxim Dounin. *) Bugfix: if temporary files and permanent storage area resided at different file systems, then permanent file modification times were incorrect. Thanks to Maxim Dounin. *) Bugfix: ngx_http_memcached_module might issue the error message "memcached sent invalid trailer". Thanks to Maxim Dounin. *) Bugfix: nginx could not built zlib-1.2.4 library using the library sources. Thanks to Maxim Dounin. *) Bugfix: values of the $query_string, $arg_..., etc. variables cached in main request were used by the SSI module in subrequests. *) Bugfix: nginx did not support HTTPS referrers. *) Bugfix: nginx/Windows might not find file if path in configuration was given in other character case; the bug had appeared in 0.7.65. *) Bugfix: the $date_local variable has an incorrect value, if the "%s" format was used. Thanks to Maxim Dounin. *) Bugfix: nginx did not support all ciphers and digests used in client certificates. Thanks to Innocenty Enikeew. *) Bugfix: if ssl_session_cache was not set or was set to "none", then during client certificate verify the error "session id context uninitialized" might occur; the bug had appeared in 0.7.1. *) Bugfix: OpenSSL-1.0.0 compatibility on 64-bit Linux. Thanks to Maxim Dounin. *) Bugfix: a geo range returned default value if the range included two or more /16 networks and did not begin at /16 network boundary. *) Bugfix: the $uid_got variable might not be used in the SSI and perl modules. *) Bugfix: a worker process hung if a FIFO file was requested. Thanks to Vicente Aguilar and Maxim Dounin. *) Bugfix: a variable value was repeatedly encoded after each an "echo" SSI-command output; the bug had appeared in 0.6.14. *) Bugfix: a "stub" parameter of an "include" SSI directive was not used, if empty response has 200 status code. *) Bugfix: a block used in a "stub" parameter of an "include" SSI directive was output with "text/plain" MIME type. *) Bugfix: if a proxied or FastCGI request was internally redirected to another proxied or FastCGI location, then a segmentation fault might occur in a worker process; the bug had appeared in 0.7.65. Thanks to Yichun Zhang. *) Bugfix: IMAP connections may hang until they timed out while talking to Zimbra server. Thanks to Alan Batie. *) Bugfix: nginx did not support chunked transfer encoding for 201 responses. Thanks to Julian Reich.
author Igor Sysoev <http://sysoev.ru>
date Mon, 07 Jun 2010 00:00:00 +0400
parents 89dc5654117c
children
comparison
equal deleted inserted replaced
507:bfc170196f52 508:68c0ae0a4959
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 }