comparison src/http/ngx_http_variables.c @ 506:b9fdcaf2062b NGINX_0_7_65

nginx 0.7.65 *) Security: now nginx/Windows ignores trailing spaces in URI. Thanks to Dan Crowley, Core Security Technologies. *) Security: now nginx/Windows ignores short files names. Thanks to Dan Crowley, Core Security Technologies. *) Change: now the "009" status code is written to an access log for proxied HTTP/0.9 responses. *) Change: now the default buffer size of the "large_client_header_buffers" directive is 8K. Thanks to Andrew Cholakian. *) Change: now default SSL ciphers are "HIGH:!ADH:!MD5". *) Change: now SSLv2 protocol is disabled by default. *) Change: now $host variable value is always low case. *) Feature: the conf/fastcgi.conf for simple FastCGI configurations. *) Feature: now URI part is not required a "proxy_pass" directive if variables are used. *) Feature: the $ssl_session_id variable. *) Bugfix: if a proxied or FastCGI request was internally redirected to another proxied or FastCGI location, then $upstream_response_time variable may have abnormally large value; the bug had appeared in 0.7.63. *) Bugfix: if the "expires modified" set date in the past, then a negative number was set in the "Cache-Control" response header line. Thanks to Alex Kapranoff. *) Bugfix: nginx closed a connection if a cached response had an empty body. Thanks to Piotr Sikora. *) Bugfix: nginx cached a 304 response if there was the "If-None-Match" header line in a proxied request. Thanks to Tim Dettrick and David Kostal. *) Bugfix: nginx did not treat a comma as separator in the "Cache-Control" backend response header line. *) Bugfix: cached HTTP/0.9 responses were handled incorrectly. *) Bugfix: nginx sent gzipped responses to clients those do not support gzip, if "gzip_static on" and "gzip_vary off"; the bug had appeared in 0.8.16. *) Bugfix: nginx always added "Content-Encoding: gzip" response header line in 304 responses sent by ngx_http_gzip_static_module. *) Bugfix: the "!-x" operator did not work. Thanks to Maxim Dounin. *) Bugfix: a segmentation fault might occur in a worker process, if limit_rate was used in HTTPS server. Thanks to Maxim Dounin. *) Bugfix: a segmentation fault might occur in a worker process while $limit_rate logging. Thanks to Maxim Dounin. *) Bugfix: nginx did not support dates in 2038 year on 32-bit platforms; *) Bugfix: nginx/Windows tried to delete a temporary file twice if the file should replace an already existent file. *) Bugfix: nginx/Windows tried to rename a temporary file twice if the file should replace an already existent file. *) Bugfix: nginx/Windows might not create temporary file, a cache file, or "proxy/fastcgi_store"d file if a worker had no enough access rights for top level directories. *) Bugfix: in UTF-8 encoding support by "try_files" directive in nginx/Windows. *) Bugfix: UTF-8 encoding usage in the ngx_http_autoindex_module. Thanks to Maxim Dounin. *) Bugfix: the ngx_http_autoindex_module did not show the trailing slash in links to a directory; the bug had appeared in 0.7.15. *) Bugfix: nginx did not close a log file set by the --error-log-path configuration option; the bug had appeared in 0.7.53. *) Bugfix: "addition_types" directive was incorrectly named "addtion_types". *) Bugfix: invalid request line in $request variable was written in access_log only if error_log was set to "info" or "debug" level.
author Igor Sysoev <http://sysoev.ru>
date Mon, 01 Feb 2010 00:00:00 +0000
parents 499474178a11
children 68c0ae0a4959
comparison
equal deleted inserted replaced
505:c62da3dcc544 506:b9fdcaf2062b
12 12
13 static ngx_int_t ngx_http_variable_request(ngx_http_request_t *r, 13 static ngx_int_t ngx_http_variable_request(ngx_http_request_t *r,
14 ngx_http_variable_value_t *v, uintptr_t data); 14 ngx_http_variable_value_t *v, uintptr_t data);
15 static void ngx_http_variable_request_set(ngx_http_request_t *r, 15 static void ngx_http_variable_request_set(ngx_http_request_t *r,
16 ngx_http_variable_value_t *v, uintptr_t data); 16 ngx_http_variable_value_t *v, uintptr_t data);
17 static ngx_int_t ngx_http_variable_request_get_size(ngx_http_request_t *r,
18 ngx_http_variable_value_t *v, uintptr_t data);
17 static void ngx_http_variable_request_set_size(ngx_http_request_t *r, 19 static void ngx_http_variable_request_set_size(ngx_http_request_t *r,
18 ngx_http_variable_value_t *v, uintptr_t data); 20 ngx_http_variable_value_t *v, uintptr_t data);
19 static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r, 21 static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r,
20 ngx_http_variable_value_t *v, uintptr_t data); 22 ngx_http_variable_value_t *v, uintptr_t data);
21 static ngx_int_t ngx_http_variable_headers(ngx_http_request_t *r, 23 static ngx_int_t ngx_http_variable_headers(ngx_http_request_t *r,
22 ngx_http_variable_value_t *v, uintptr_t data); 24 ngx_http_variable_value_t *v, uintptr_t data);
23 25
24 static ngx_int_t ngx_http_variable_unknown_header_in(ngx_http_request_t *r, 26 static ngx_int_t ngx_http_variable_unknown_header_in(ngx_http_request_t *r,
25 ngx_http_variable_value_t *v, uintptr_t data); 27 ngx_http_variable_value_t *v, uintptr_t data);
26 static ngx_int_t ngx_http_variable_unknown_header_out(ngx_http_request_t *r, 28 static ngx_int_t ngx_http_variable_unknown_header_out(ngx_http_request_t *r,
29 ngx_http_variable_value_t *v, uintptr_t data);
30 static ngx_int_t ngx_http_variable_request_line(ngx_http_request_t *r,
27 ngx_http_variable_value_t *v, uintptr_t data); 31 ngx_http_variable_value_t *v, uintptr_t data);
28 static ngx_int_t ngx_http_variable_cookie(ngx_http_request_t *r, 32 static ngx_int_t ngx_http_variable_cookie(ngx_http_request_t *r,
29 ngx_http_variable_value_t *v, uintptr_t data); 33 ngx_http_variable_value_t *v, uintptr_t data);
30 static ngx_int_t ngx_http_variable_argument(ngx_http_request_t *r, 34 static ngx_int_t ngx_http_variable_argument(ngx_http_request_t *r,
31 ngx_http_variable_value_t *v, uintptr_t data); 35 ngx_http_variable_value_t *v, uintptr_t data);
162 166
163 { ngx_string("document_uri"), NULL, ngx_http_variable_request, 167 { ngx_string("document_uri"), NULL, ngx_http_variable_request,
164 offsetof(ngx_http_request_t, uri), 168 offsetof(ngx_http_request_t, uri),
165 NGX_HTTP_VAR_NOCACHEABLE, 0 }, 169 NGX_HTTP_VAR_NOCACHEABLE, 0 },
166 170
167 { ngx_string("request"), NULL, ngx_http_variable_request, 171 { ngx_string("request"), NULL, ngx_http_variable_request_line, 0, 0, 0 },
168 offsetof(ngx_http_request_t, request_line), 0, 0 },
169 172
170 { ngx_string("document_root"), NULL, 173 { ngx_string("document_root"), NULL,
171 ngx_http_variable_document_root, 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, 174 ngx_http_variable_document_root, 0, NGX_HTTP_VAR_NOCACHEABLE, 0 },
172 175
173 { ngx_string("realpath_root"), NULL, 176 { ngx_string("realpath_root"), NULL,
235 238
236 { ngx_string("sent_http_cache_control"), NULL, ngx_http_variable_headers, 239 { ngx_string("sent_http_cache_control"), NULL, ngx_http_variable_headers,
237 offsetof(ngx_http_request_t, headers_out.cache_control), 0, 0 }, 240 offsetof(ngx_http_request_t, headers_out.cache_control), 0, 0 },
238 241
239 { ngx_string("limit_rate"), ngx_http_variable_request_set_size, 242 { ngx_string("limit_rate"), ngx_http_variable_request_set_size,
240 ngx_http_variable_request, 243 ngx_http_variable_request_get_size,
241 offsetof(ngx_http_request_t, limit_rate), 244 offsetof(ngx_http_request_t, limit_rate),
242 NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 }, 245 NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 },
243 246
244 { ngx_string("nginx_version"), NULL, ngx_http_variable_nginx_version, 247 { ngx_string("nginx_version"), NULL, ngx_http_variable_nginx_version,
245 0, 0, 0 }, 248 0, 0, 0 },
565 s->len = v->len; 568 s->len = v->len;
566 s->data = v->data; 569 s->data = v->data;
567 } 570 }
568 571
569 572
573 static ngx_int_t
574 ngx_http_variable_request_get_size(ngx_http_request_t *r,
575 ngx_http_variable_value_t *v, uintptr_t data)
576 {
577 size_t *sp;
578
579 sp = (size_t *) ((char *) r + data);
580
581 v->data = ngx_pnalloc(r->pool, NGX_SIZE_T_LEN);
582 if (v->data == NULL) {
583 return NGX_ERROR;
584 }
585
586 v->len = ngx_sprintf(v->data, "%uz", *sp) - v->data;
587 v->valid = 1;
588 v->no_cacheable = 0;
589 v->not_found = 0;
590
591 return NGX_OK;
592 }
593
594
570 static void 595 static void
571 ngx_http_variable_request_set_size(ngx_http_request_t *r, 596 ngx_http_variable_request_set_size(ngx_http_request_t *r,
572 ngx_http_variable_value_t *v, uintptr_t data) 597 ngx_http_variable_value_t *v, uintptr_t data)
573 { 598 {
574 ssize_t s, *sp; 599 ssize_t s, *sp;
743 return NGX_OK; 768 return NGX_OK;
744 } 769 }
745 } 770 }
746 771
747 v->not_found = 1; 772 v->not_found = 1;
773
774 return NGX_OK;
775 }
776
777
778 static ngx_int_t
779 ngx_http_variable_request_line(ngx_http_request_t *r,
780 ngx_http_variable_value_t *v, uintptr_t data)
781 {
782 u_char *p, *s;
783
784 s = r->request_line.data;
785
786 if (s == NULL) {
787 s = r->request_start;
788
789 if (s == NULL) {
790 v->not_found = 1;
791 return NGX_OK;
792 }
793
794 for (p = s; p < r->header_in->last; p++) {
795 if (*p == CR || *p == LF) {
796 break;
797 }
798 }
799
800 r->request_line.len = p - s;
801 r->request_line.data = s;
802 }
803
804 v->len = r->request_line.len;
805 v->valid = 1;
806 v->no_cacheable = 0;
807 v->not_found = 0;
808 v->data = s;
748 809
749 return NGX_OK; 810 return NGX_OK;
750 } 811 }
751 812
752 813