comparison src/http/ngx_http_variables.c @ 320:1e9e2c5e7c14 NGINX_0_5_30

nginx 0.5.30 *) Feature: the $args variable can be set with the "set" directive. *) Feature: the $is_args variable. *) Bugfix: if a client has closed connection to mail proxy then nginx might not close connection to backend. *) Bugfix: now nginx escapes space in $memcached_key variable. *) Bugfix: a segmentation fault might occur in worker process when the HTTPS protocol was used in the "proxy_pass" directive. *) Bugfix: the perl $$ variable value in ngx_http_perl_module was equal to the master process identification number. *) Bugfix: fix building on Solaris/amd64 by Sun Studio 11 and early versions; bug appeared in 0.5.29.
author Igor Sysoev <http://sysoev.ru>
date Mon, 30 Jul 2007 00:00:00 +0400
parents 3021f899881a
children 26ff8d6b618d
comparison
equal deleted inserted replaced
319:10d5a311cc5e 320:1e9e2c5e7c14
11 #include <nginx.h> 11 #include <nginx.h>
12 12
13 13
14 static ngx_int_t ngx_http_variable_request(ngx_http_request_t *r, 14 static ngx_int_t ngx_http_variable_request(ngx_http_request_t *r,
15 ngx_http_variable_value_t *v, uintptr_t data); 15 ngx_http_variable_value_t *v, uintptr_t data);
16 static void ngx_http_variable_request_set(ngx_http_request_t *r,
17 ngx_http_variable_value_t *v, uintptr_t data);
16 static void ngx_http_variable_request_set_size(ngx_http_request_t *r, 18 static void ngx_http_variable_request_set_size(ngx_http_request_t *r,
17 ngx_http_variable_value_t *v, uintptr_t data); 19 ngx_http_variable_value_t *v, uintptr_t data);
18 static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r, 20 static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r,
19 ngx_http_variable_value_t *v, uintptr_t data); 21 ngx_http_variable_value_t *v, uintptr_t data);
20 static ngx_int_t ngx_http_variable_headers(ngx_http_request_t *r, 22 static ngx_int_t ngx_http_variable_headers(ngx_http_request_t *r,
36 static ngx_int_t ngx_http_variable_server_addr(ngx_http_request_t *r, 38 static ngx_int_t ngx_http_variable_server_addr(ngx_http_request_t *r,
37 ngx_http_variable_value_t *v, uintptr_t data); 39 ngx_http_variable_value_t *v, uintptr_t data);
38 static ngx_int_t ngx_http_variable_server_port(ngx_http_request_t *r, 40 static ngx_int_t ngx_http_variable_server_port(ngx_http_request_t *r,
39 ngx_http_variable_value_t *v, uintptr_t data); 41 ngx_http_variable_value_t *v, uintptr_t data);
40 static ngx_int_t ngx_http_variable_scheme(ngx_http_request_t *r, 42 static ngx_int_t ngx_http_variable_scheme(ngx_http_request_t *r,
43 ngx_http_variable_value_t *v, uintptr_t data);
44 static ngx_int_t ngx_http_variable_is_args(ngx_http_request_t *r,
41 ngx_http_variable_value_t *v, uintptr_t data); 45 ngx_http_variable_value_t *v, uintptr_t data);
42 static ngx_int_t ngx_http_variable_document_root(ngx_http_request_t *r, 46 static ngx_int_t ngx_http_variable_document_root(ngx_http_request_t *r,
43 ngx_http_variable_value_t *v, uintptr_t data); 47 ngx_http_variable_value_t *v, uintptr_t data);
44 static ngx_int_t ngx_http_variable_request_filename(ngx_http_request_t *r, 48 static ngx_int_t ngx_http_variable_request_filename(ngx_http_request_t *r,
45 ngx_http_variable_value_t *v, uintptr_t data); 49 ngx_http_variable_value_t *v, uintptr_t data);
153 157
154 { ngx_string("query_string"), NULL, ngx_http_variable_request, 158 { ngx_string("query_string"), NULL, ngx_http_variable_request,
155 offsetof(ngx_http_request_t, args), 159 offsetof(ngx_http_request_t, args),
156 NGX_HTTP_VAR_NOCACHABLE, 0 }, 160 NGX_HTTP_VAR_NOCACHABLE, 0 },
157 161
158 { ngx_string("args"), NULL, ngx_http_variable_request, 162 { ngx_string("args"),
163 ngx_http_variable_request_set,
164 ngx_http_variable_request,
159 offsetof(ngx_http_request_t, args), 165 offsetof(ngx_http_request_t, args),
160 NGX_HTTP_VAR_NOCACHABLE, 0 }, 166 NGX_HTTP_VAR_CHANGABLE|NGX_HTTP_VAR_NOCACHABLE, 0 },
167
168 { ngx_string("is_args"), NULL, ngx_http_variable_is_args,
169 0, NGX_HTTP_VAR_NOCACHABLE, 0 },
161 170
162 { ngx_string("request_filename"), NULL, 171 { ngx_string("request_filename"), NULL,
163 ngx_http_variable_request_filename, 0, 172 ngx_http_variable_request_filename, 0,
164 NGX_HTTP_VAR_NOCACHABLE, 0 }, 173 NGX_HTTP_VAR_NOCACHABLE, 0 },
165 174
499 return NGX_OK; 508 return NGX_OK;
500 } 509 }
501 510
502 511
503 static void 512 static void
513 ngx_http_variable_request_set(ngx_http_request_t *r,
514 ngx_http_variable_value_t *v, uintptr_t data)
515 {
516 ngx_str_t *s;
517
518 s = (ngx_str_t *) ((char *) r + data);
519
520 s->len = v->len;
521 s->data = v->data;
522 }
523
524
525 static void
504 ngx_http_variable_request_set_size(ngx_http_request_t *r, 526 ngx_http_variable_request_set_size(ngx_http_request_t *r,
505 ngx_http_variable_value_t *v, uintptr_t data) 527 ngx_http_variable_value_t *v, uintptr_t data)
506 { 528 {
507 ssize_t s, *sp; 529 ssize_t s, *sp;
508 ngx_str_t val; 530 ngx_str_t val;
852 v->len = sizeof("http") - 1; 874 v->len = sizeof("http") - 1;
853 v->valid = 1; 875 v->valid = 1;
854 v->no_cachable = 0; 876 v->no_cachable = 0;
855 v->not_found = 0; 877 v->not_found = 0;
856 v->data = (u_char *) "http"; 878 v->data = (u_char *) "http";
879
880 return NGX_OK;
881 }
882
883
884 static ngx_int_t
885 ngx_http_variable_is_args(ngx_http_request_t *r,
886 ngx_http_variable_value_t *v, uintptr_t data)
887 {
888 v->valid = 1;
889 v->no_cachable = 0;
890 v->not_found = 0;
891
892 if (r->args.len == 0) {
893 v->len = 0;
894 v->data = NULL;
895 return NGX_OK;
896 }
897
898 v->len = 1;
899 v->data = (u_char *) "?";
857 900
858 return NGX_OK; 901 return NGX_OK;
859 } 902 }
860 903
861 904