Mercurial > hg > nginx
annotate src/http/ngx_http_variables.c @ 4893:e89bd9896fea
Variables $connection and $connection_requests.
Log module counterparts are removed as they aren't used often and
there is no need to preserve them for efficiency.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 29 Oct 2012 17:17:59 +0000 |
parents | b7f6f097d95e |
children | 002f2c783d7c |
rev | line source |
---|---|
499 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4412 | 4 * Copyright (C) Nginx, Inc. |
499 | 5 */ |
6 | |
7 | |
8 #include <ngx_config.h> | |
9 #include <ngx_core.h> | |
10 #include <ngx_http.h> | |
1329 | 11 #include <nginx.h> |
499 | 12 |
13 | |
573 | 14 static ngx_int_t ngx_http_variable_request(ngx_http_request_t *r, |
15 ngx_http_variable_value_t *v, uintptr_t data); | |
1350 | 16 static void ngx_http_variable_request_set(ngx_http_request_t *r, |
17 ngx_http_variable_value_t *v, uintptr_t data); | |
3282
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
18 static ngx_int_t ngx_http_variable_request_get_size(ngx_http_request_t *r, |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
19 ngx_http_variable_value_t *v, uintptr_t data); |
637 | 20 static void ngx_http_variable_request_set_size(ngx_http_request_t *r, |
21 ngx_http_variable_value_t *v, uintptr_t data); | |
573 | 22 static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r, |
23 ngx_http_variable_value_t *v, uintptr_t data); | |
24 static ngx_int_t ngx_http_variable_headers(ngx_http_request_t *r, | |
25 ngx_http_variable_value_t *v, uintptr_t data); | |
577 | 26 |
27 static ngx_int_t ngx_http_variable_unknown_header_in(ngx_http_request_t *r, | |
573 | 28 ngx_http_variable_value_t *v, uintptr_t data); |
577 | 29 static ngx_int_t ngx_http_variable_unknown_header_out(ngx_http_request_t *r, |
30 ngx_http_variable_value_t *v, uintptr_t data); | |
3144
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
31 static ngx_int_t ngx_http_variable_request_line(ngx_http_request_t *r, |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
32 ngx_http_variable_value_t *v, uintptr_t data); |
2359
4fee4ebbfb0b
$cookie_... variable did not for SSI and perl
Igor Sysoev <igor@sysoev.ru>
parents:
2333
diff
changeset
|
33 static ngx_int_t ngx_http_variable_cookie(ngx_http_request_t *r, |
4fee4ebbfb0b
$cookie_... variable did not for SSI and perl
Igor Sysoev <igor@sysoev.ru>
parents:
2333
diff
changeset
|
34 ngx_http_variable_value_t *v, uintptr_t data); |
2137 | 35 static ngx_int_t ngx_http_variable_argument(ngx_http_request_t *r, |
36 ngx_http_variable_value_t *v, uintptr_t data); | |
4545
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
37 #if (NGX_HAVE_TCP_INFO) |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
38 static ngx_int_t ngx_http_variable_tcpinfo(ngx_http_request_t *r, |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
39 ngx_http_variable_value_t *v, uintptr_t data); |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
40 #endif |
577 | 41 |
573 | 42 static ngx_int_t ngx_http_variable_host(ngx_http_request_t *r, |
43 ngx_http_variable_value_t *v, uintptr_t data); | |
983
7a8ca436d611
ngx_http_variable_binary_remote_addr()
Igor Sysoev <igor@sysoev.ru>
parents:
982
diff
changeset
|
44 static ngx_int_t ngx_http_variable_binary_remote_addr(ngx_http_request_t *r, |
7a8ca436d611
ngx_http_variable_binary_remote_addr()
Igor Sysoev <igor@sysoev.ru>
parents:
982
diff
changeset
|
45 ngx_http_variable_value_t *v, uintptr_t data); |
573 | 46 static ngx_int_t ngx_http_variable_remote_addr(ngx_http_request_t *r, |
47 ngx_http_variable_value_t *v, uintptr_t data); | |
48 static ngx_int_t ngx_http_variable_remote_port(ngx_http_request_t *r, | |
49 ngx_http_variable_value_t *v, uintptr_t data); | |
50 static ngx_int_t ngx_http_variable_server_addr(ngx_http_request_t *r, | |
51 ngx_http_variable_value_t *v, uintptr_t data); | |
52 static ngx_int_t ngx_http_variable_server_port(ngx_http_request_t *r, | |
53 ngx_http_variable_value_t *v, uintptr_t data); | |
731 | 54 static ngx_int_t ngx_http_variable_scheme(ngx_http_request_t *r, |
55 ngx_http_variable_value_t *v, uintptr_t data); | |
4332
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
56 static ngx_int_t ngx_http_variable_https(ngx_http_request_t *r, |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
57 ngx_http_variable_value_t *v, uintptr_t data); |
1351 | 58 static ngx_int_t ngx_http_variable_is_args(ngx_http_request_t *r, |
59 ngx_http_variable_value_t *v, uintptr_t data); | |
573 | 60 static ngx_int_t ngx_http_variable_document_root(ngx_http_request_t *r, |
61 ngx_http_variable_value_t *v, uintptr_t data); | |
2259 | 62 static ngx_int_t ngx_http_variable_realpath_root(ngx_http_request_t *r, |
63 ngx_http_variable_value_t *v, uintptr_t data); | |
573 | 64 static ngx_int_t ngx_http_variable_request_filename(ngx_http_request_t *r, |
65 ngx_http_variable_value_t *v, uintptr_t data); | |
1811 | 66 static ngx_int_t ngx_http_variable_server_name(ngx_http_request_t *r, |
67 ngx_http_variable_value_t *v, uintptr_t data); | |
573 | 68 static ngx_int_t ngx_http_variable_request_method(ngx_http_request_t *r, |
69 ngx_http_variable_value_t *v, uintptr_t data); | |
70 static ngx_int_t ngx_http_variable_remote_user(ngx_http_request_t *r, | |
71 ngx_http_variable_value_t *v, uintptr_t data); | |
4886 | 72 static ngx_int_t ngx_http_variable_bytes_sent(ngx_http_request_t *r, |
73 ngx_http_variable_value_t *v, uintptr_t data); | |
611 | 74 static ngx_int_t ngx_http_variable_body_bytes_sent(ngx_http_request_t *r, |
75 ngx_http_variable_value_t *v, uintptr_t data); | |
629 | 76 static ngx_int_t ngx_http_variable_request_completion(ngx_http_request_t *r, |
77 ngx_http_variable_value_t *v, uintptr_t data); | |
2844 | 78 static ngx_int_t ngx_http_variable_request_body(ngx_http_request_t *r, |
79 ngx_http_variable_value_t *v, uintptr_t data); | |
759 | 80 static ngx_int_t ngx_http_variable_request_body_file(ngx_http_request_t *r, |
81 ngx_http_variable_value_t *v, uintptr_t data); | |
4685
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
82 static ngx_int_t ngx_http_variable_status(ngx_http_request_t *r, |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
83 ngx_http_variable_value_t *v, uintptr_t data); |
4686 | 84 |
641 | 85 static ngx_int_t ngx_http_variable_sent_content_type(ngx_http_request_t *r, |
86 ngx_http_variable_value_t *v, uintptr_t data); | |
87 static ngx_int_t ngx_http_variable_sent_content_length(ngx_http_request_t *r, | |
88 ngx_http_variable_value_t *v, uintptr_t data); | |
2485
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
89 static ngx_int_t ngx_http_variable_sent_location(ngx_http_request_t *r, |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
90 ngx_http_variable_value_t *v, uintptr_t data); |
641 | 91 static ngx_int_t ngx_http_variable_sent_last_modified(ngx_http_request_t *r, |
92 ngx_http_variable_value_t *v, uintptr_t data); | |
93 static ngx_int_t ngx_http_variable_sent_connection(ngx_http_request_t *r, | |
94 ngx_http_variable_value_t *v, uintptr_t data); | |
95 static ngx_int_t ngx_http_variable_sent_keep_alive(ngx_http_request_t *r, | |
96 ngx_http_variable_value_t *v, uintptr_t data); | |
97 static ngx_int_t ngx_http_variable_sent_transfer_encoding(ngx_http_request_t *r, | |
98 ngx_http_variable_value_t *v, uintptr_t data); | |
99 | |
4893
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
100 static ngx_int_t ngx_http_variable_connection(ngx_http_request_t *r, |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
101 ngx_http_variable_value_t *v, uintptr_t data); |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
102 static ngx_int_t ngx_http_variable_connection_requests(ngx_http_request_t *r, |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
103 ngx_http_variable_value_t *v, uintptr_t data); |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
104 |
1329 | 105 static ngx_int_t ngx_http_variable_nginx_version(ngx_http_request_t *r, |
106 ngx_http_variable_value_t *v, uintptr_t data); | |
2011 | 107 static ngx_int_t ngx_http_variable_hostname(ngx_http_request_t *r, |
108 ngx_http_variable_value_t *v, uintptr_t data); | |
2249 | 109 static ngx_int_t ngx_http_variable_pid(ngx_http_request_t *r, |
110 ngx_http_variable_value_t *v, uintptr_t data); | |
499 | 111 |
509 | 112 /* |
113 * TODO: | |
114 * Apache CGI: AUTH_TYPE, PATH_INFO (null), PATH_TRANSLATED | |
115 * REMOTE_HOST (null), REMOTE_IDENT (null), | |
116 * SERVER_SOFTWARE | |
117 * | |
571 | 118 * Apache SSI: DOCUMENT_NAME, LAST_MODIFIED, USER_NAME (file owner) |
509 | 119 */ |
499 | 120 |
641 | 121 /* |
122 * the $http_host, $http_user_agent, $http_referer, $http_via, | |
123 * and $http_x_forwarded_for variables may be handled by generic | |
4572
67653855682e
Fixed spelling in multiline C comments.
Ruslan Ermilov <ru@nginx.com>
parents:
4558
diff
changeset
|
124 * ngx_http_variable_unknown_header_in(), but for performance reasons |
641 | 125 * they are handled using dedicated entries |
126 */ | |
127 | |
509 | 128 static ngx_http_variable_t ngx_http_core_variables[] = { |
129 | |
637 | 130 { ngx_string("http_host"), NULL, ngx_http_variable_header, |
533 | 131 offsetof(ngx_http_request_t, headers_in.host), 0, 0 }, |
499 | 132 |
637 | 133 { ngx_string("http_user_agent"), NULL, ngx_http_variable_header, |
533 | 134 offsetof(ngx_http_request_t, headers_in.user_agent), 0, 0 }, |
509 | 135 |
637 | 136 { ngx_string("http_referer"), NULL, ngx_http_variable_header, |
533 | 137 offsetof(ngx_http_request_t, headers_in.referer), 0, 0 }, |
499 | 138 |
139 #if (NGX_HTTP_GZIP) | |
637 | 140 { ngx_string("http_via"), NULL, ngx_http_variable_header, |
533 | 141 offsetof(ngx_http_request_t, headers_in.via), 0, 0 }, |
499 | 142 #endif |
143 | |
4697
09187f9b0950
Fixed compile-time conditionals used to detect if X-Forwarded-For support
Ruslan Ermilov <ru@nginx.com>
parents:
4686
diff
changeset
|
144 #if (NGX_HTTP_X_FORWARDED_FOR) |
637 | 145 { ngx_string("http_x_forwarded_for"), NULL, ngx_http_variable_header, |
533 | 146 offsetof(ngx_http_request_t, headers_in.x_forwarded_for), 0, 0 }, |
499 | 147 #endif |
148 | |
637 | 149 { ngx_string("http_cookie"), NULL, ngx_http_variable_headers, |
533 | 150 offsetof(ngx_http_request_t, headers_in.cookies), 0, 0 }, |
515 | 151 |
637 | 152 { ngx_string("content_length"), NULL, ngx_http_variable_header, |
533 | 153 offsetof(ngx_http_request_t, headers_in.content_length), 0, 0 }, |
509 | 154 |
637 | 155 { ngx_string("content_type"), NULL, ngx_http_variable_header, |
533 | 156 offsetof(ngx_http_request_t, headers_in.content_type), 0, 0 }, |
509 | 157 |
637 | 158 { ngx_string("host"), NULL, ngx_http_variable_host, 0, 0, 0 }, |
509 | 159 |
982 | 160 { ngx_string("binary_remote_addr"), NULL, |
983
7a8ca436d611
ngx_http_variable_binary_remote_addr()
Igor Sysoev <igor@sysoev.ru>
parents:
982
diff
changeset
|
161 ngx_http_variable_binary_remote_addr, 0, 0, 0 }, |
982 | 162 |
637 | 163 { ngx_string("remote_addr"), NULL, ngx_http_variable_remote_addr, 0, 0, 0 }, |
499 | 164 |
637 | 165 { ngx_string("remote_port"), NULL, ngx_http_variable_remote_port, 0, 0, 0 }, |
509 | 166 |
637 | 167 { ngx_string("server_addr"), NULL, ngx_http_variable_server_addr, 0, 0, 0 }, |
509 | 168 |
637 | 169 { ngx_string("server_port"), NULL, ngx_http_variable_server_port, 0, 0, 0 }, |
509 | 170 |
637 | 171 { ngx_string("server_protocol"), NULL, ngx_http_variable_request, |
533 | 172 offsetof(ngx_http_request_t, http_protocol), 0, 0 }, |
509 | 173 |
731 | 174 { ngx_string("scheme"), NULL, ngx_http_variable_scheme, 0, 0, 0 }, |
175 | |
4332
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
176 { ngx_string("https"), NULL, ngx_http_variable_https, 0, 0, 0 }, |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
177 |
637 | 178 { ngx_string("request_uri"), NULL, ngx_http_variable_request, |
533 | 179 offsetof(ngx_http_request_t, unparsed_uri), 0, 0 }, |
499 | 180 |
637 | 181 { ngx_string("uri"), NULL, ngx_http_variable_request, |
182 offsetof(ngx_http_request_t, uri), | |
1565 | 183 NGX_HTTP_VAR_NOCACHEABLE, 0 }, |
637 | 184 |
185 { ngx_string("document_uri"), NULL, ngx_http_variable_request, | |
573 | 186 offsetof(ngx_http_request_t, uri), |
1565 | 187 NGX_HTTP_VAR_NOCACHEABLE, 0 }, |
573 | 188 |
3144
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
189 { ngx_string("request"), NULL, ngx_http_variable_request_line, 0, 0, 0 }, |
569 | 190 |
637 | 191 { ngx_string("document_root"), NULL, |
1565 | 192 ngx_http_variable_document_root, 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, |
509 | 193 |
2259 | 194 { ngx_string("realpath_root"), NULL, |
195 ngx_http_variable_realpath_root, 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, | |
196 | |
637 | 197 { ngx_string("query_string"), NULL, ngx_http_variable_request, |
509 | 198 offsetof(ngx_http_request_t, args), |
1565 | 199 NGX_HTTP_VAR_NOCACHEABLE, 0 }, |
499 | 200 |
1350 | 201 { ngx_string("args"), |
202 ngx_http_variable_request_set, | |
203 ngx_http_variable_request, | |
589 | 204 offsetof(ngx_http_request_t, args), |
1565 | 205 NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 }, |
589 | 206 |
1351 | 207 { ngx_string("is_args"), NULL, ngx_http_variable_is_args, |
1565 | 208 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, |
1351 | 209 |
637 | 210 { ngx_string("request_filename"), NULL, |
211 ngx_http_variable_request_filename, 0, | |
1565 | 212 NGX_HTTP_VAR_NOCACHEABLE, 0 }, |
509 | 213 |
1811 | 214 { ngx_string("server_name"), NULL, ngx_http_variable_server_name, 0, 0, 0 }, |
509 | 215 |
637 | 216 { ngx_string("request_method"), NULL, |
3463
0904bd7d5b37
make $request_method non-cacheable
Igor Sysoev <igor@sysoev.ru>
parents:
3451
diff
changeset
|
217 ngx_http_variable_request_method, 0, |
0904bd7d5b37
make $request_method non-cacheable
Igor Sysoev <igor@sysoev.ru>
parents:
3451
diff
changeset
|
218 NGX_HTTP_VAR_NOCACHEABLE, 0 }, |
509 | 219 |
637 | 220 { ngx_string("remote_user"), NULL, ngx_http_variable_remote_user, 0, 0, 0 }, |
509 | 221 |
4886 | 222 { ngx_string("bytes_sent"), NULL, ngx_http_variable_bytes_sent, |
223 0, 0, 0 }, | |
224 | |
637 | 225 { ngx_string("body_bytes_sent"), NULL, ngx_http_variable_body_bytes_sent, |
611 | 226 0, 0, 0 }, |
227 | |
637 | 228 { ngx_string("request_completion"), NULL, |
229 ngx_http_variable_request_completion, | |
629 | 230 0, 0, 0 }, |
231 | |
2844 | 232 { ngx_string("request_body"), NULL, |
233 ngx_http_variable_request_body, | |
234 0, 0, 0 }, | |
235 | |
759 | 236 { ngx_string("request_body_file"), NULL, |
237 ngx_http_variable_request_body_file, | |
238 0, 0, 0 }, | |
239 | |
4685
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
240 { ngx_string("status"), NULL, |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
241 ngx_http_variable_status, 0, |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
242 NGX_HTTP_VAR_NOCACHEABLE, 0 }, |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
243 |
641 | 244 { ngx_string("sent_http_content_type"), NULL, |
245 ngx_http_variable_sent_content_type, 0, 0, 0 }, | |
246 | |
247 { ngx_string("sent_http_content_length"), NULL, | |
248 ngx_http_variable_sent_content_length, 0, 0, 0 }, | |
249 | |
2485
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
250 { ngx_string("sent_http_location"), NULL, |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
251 ngx_http_variable_sent_location, 0, 0, 0 }, |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
252 |
641 | 253 { ngx_string("sent_http_last_modified"), NULL, |
254 ngx_http_variable_sent_last_modified, 0, 0, 0 }, | |
255 | |
256 { ngx_string("sent_http_connection"), NULL, | |
257 ngx_http_variable_sent_connection, 0, 0, 0 }, | |
258 | |
259 { ngx_string("sent_http_keep_alive"), NULL, | |
260 ngx_http_variable_sent_keep_alive, 0, 0, 0 }, | |
261 | |
262 { ngx_string("sent_http_transfer_encoding"), NULL, | |
263 ngx_http_variable_sent_transfer_encoding, 0, 0, 0 }, | |
264 | |
265 { ngx_string("sent_http_cache_control"), NULL, ngx_http_variable_headers, | |
266 offsetof(ngx_http_request_t, headers_out.cache_control), 0, 0 }, | |
267 | |
637 | 268 { ngx_string("limit_rate"), ngx_http_variable_request_set_size, |
3282
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
269 ngx_http_variable_request_get_size, |
637 | 270 offsetof(ngx_http_request_t, limit_rate), |
1565 | 271 NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 }, |
637 | 272 |
4893
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
273 { ngx_string("connection"), NULL, |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
274 ngx_http_variable_connection, 0, 0, 0 }, |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
275 |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
276 { ngx_string("connection_requests"), NULL, |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
277 ngx_http_variable_connection_requests, 0, 0, 0 }, |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
278 |
1329 | 279 { ngx_string("nginx_version"), NULL, ngx_http_variable_nginx_version, |
280 0, 0, 0 }, | |
281 | |
2011 | 282 { ngx_string("hostname"), NULL, ngx_http_variable_hostname, |
283 0, 0, 0 }, | |
284 | |
2249 | 285 { ngx_string("pid"), NULL, ngx_http_variable_pid, |
286 0, 0, 0 }, | |
287 | |
4545
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
288 #if (NGX_HAVE_TCP_INFO) |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
289 { ngx_string("tcpinfo_rtt"), NULL, ngx_http_variable_tcpinfo, |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
290 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
291 |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
292 { ngx_string("tcpinfo_rttvar"), NULL, ngx_http_variable_tcpinfo, |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
293 1, NGX_HTTP_VAR_NOCACHEABLE, 0 }, |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
294 |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
295 { ngx_string("tcpinfo_snd_cwnd"), NULL, ngx_http_variable_tcpinfo, |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
296 2, NGX_HTTP_VAR_NOCACHEABLE, 0 }, |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
297 |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
298 { ngx_string("tcpinfo_rcv_space"), NULL, ngx_http_variable_tcpinfo, |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
299 3, NGX_HTTP_VAR_NOCACHEABLE, 0 }, |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
300 #endif |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
301 |
637 | 302 { ngx_null_string, NULL, NULL, 0, 0, 0 } |
499 | 303 }; |
304 | |
305 | |
577 | 306 ngx_http_variable_value_t ngx_http_variable_null_value = |
307 ngx_http_variable(""); | |
308 ngx_http_variable_value_t ngx_http_variable_true_value = | |
309 ngx_http_variable("1"); | |
310 | |
311 | |
499 | 312 ngx_http_variable_t * |
509 | 313 ngx_http_add_variable(ngx_conf_t *cf, ngx_str_t *name, ngx_uint_t flags) |
314 { | |
611 | 315 ngx_int_t rc; |
509 | 316 ngx_uint_t i; |
611 | 317 ngx_hash_key_t *key; |
509 | 318 ngx_http_variable_t *v; |
319 ngx_http_core_main_conf_t *cmcf; | |
320 | |
321 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); | |
322 | |
611 | 323 key = cmcf->variables_keys->keys.elts; |
324 for (i = 0; i < cmcf->variables_keys->keys.nelts; i++) { | |
325 if (name->len != key[i].key.len | |
326 || ngx_strncasecmp(name->data, key[i].key.data, name->len) != 0) | |
509 | 327 { |
328 continue; | |
329 } | |
330 | |
611 | 331 v = key[i].value; |
332 | |
1565 | 333 if (!(v->flags & NGX_HTTP_VAR_CHANGEABLE)) { |
509 | 334 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
335 "the duplicate \"%V\" variable", name); | |
336 return NULL; | |
337 } | |
338 | |
611 | 339 return v; |
509 | 340 } |
341 | |
611 | 342 v = ngx_palloc(cf->pool, sizeof(ngx_http_variable_t)); |
509 | 343 if (v == NULL) { |
344 return NULL; | |
345 } | |
346 | |
347 v->name.len = name->len; | |
2049 | 348 v->name.data = ngx_pnalloc(cf->pool, name->len); |
509 | 349 if (v->name.data == NULL) { |
350 return NULL; | |
351 } | |
352 | |
2135 | 353 ngx_strlow(v->name.data, name->data, name->len); |
509 | 354 |
637 | 355 v->set_handler = NULL; |
356 v->get_handler = NULL; | |
509 | 357 v->data = 0; |
358 v->flags = flags; | |
533 | 359 v->index = 0; |
509 | 360 |
611 | 361 rc = ngx_hash_add_key(cmcf->variables_keys, &v->name, v, 0); |
362 | |
363 if (rc == NGX_ERROR) { | |
364 return NULL; | |
365 } | |
366 | |
367 if (rc == NGX_BUSY) { | |
368 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
369 "conflicting variable name \"%V\"", name); | |
370 return NULL; | |
371 } | |
372 | |
509 | 373 return v; |
374 } | |
375 | |
376 | |
377 ngx_int_t | |
378 ngx_http_get_variable_index(ngx_conf_t *cf, ngx_str_t *name) | |
499 | 379 { |
501 | 380 ngx_uint_t i; |
381 ngx_http_variable_t *v; | |
499 | 382 ngx_http_core_main_conf_t *cmcf; |
383 | |
384 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); | |
385 | |
501 | 386 v = cmcf->variables.elts; |
387 | |
388 if (v == NULL) { | |
499 | 389 if (ngx_array_init(&cmcf->variables, cf->pool, 4, |
2536
a6d6d762c554
small optimization: " == NGX_ERROR" > " != NGX_OK"
Igor Sysoev <igor@sysoev.ru>
parents:
2533
diff
changeset
|
390 sizeof(ngx_http_variable_t)) |
a6d6d762c554
small optimization: " == NGX_ERROR" > " != NGX_OK"
Igor Sysoev <igor@sysoev.ru>
parents:
2533
diff
changeset
|
391 != NGX_OK) |
499 | 392 { |
509 | 393 return NGX_ERROR; |
499 | 394 } |
501 | 395 |
396 } else { | |
397 for (i = 0; i < cmcf->variables.nelts; i++) { | |
398 if (name->len != v[i].name.len | |
399 || ngx_strncasecmp(name->data, v[i].name.data, name->len) != 0) | |
400 { | |
401 continue; | |
402 } | |
403 | |
509 | 404 return i; |
501 | 405 } |
499 | 406 } |
407 | |
501 | 408 v = ngx_array_push(&cmcf->variables); |
409 if (v == NULL) { | |
509 | 410 return NGX_ERROR; |
499 | 411 } |
412 | |
501 | 413 v->name.len = name->len; |
2049 | 414 v->name.data = ngx_pnalloc(cf->pool, name->len); |
501 | 415 if (v->name.data == NULL) { |
509 | 416 return NGX_ERROR; |
501 | 417 } |
499 | 418 |
2135 | 419 ngx_strlow(v->name.data, name->data, name->len); |
501 | 420 |
637 | 421 v->set_handler = NULL; |
422 v->get_handler = NULL; | |
501 | 423 v->data = 0; |
509 | 424 v->flags = 0; |
533 | 425 v->index = cmcf->variables.nelts - 1; |
501 | 426 |
4540
cab9aa79256c
Slight optimization in ngx_http_get_variable_index().
Ruslan Ermilov <ru@nginx.com>
parents:
4470
diff
changeset
|
427 return v->index; |
499 | 428 } |
429 | |
430 | |
431 ngx_http_variable_value_t * | |
432 ngx_http_get_indexed_variable(ngx_http_request_t *r, ngx_uint_t index) | |
433 { | |
501 | 434 ngx_http_variable_t *v; |
499 | 435 ngx_http_core_main_conf_t *cmcf; |
436 | |
437 cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); | |
438 | |
553 | 439 if (cmcf->variables.nelts <= index) { |
499 | 440 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, |
441 "unknown variable index: %d", index); | |
442 return NULL; | |
443 } | |
444 | |
573 | 445 if (r->variables[index].not_found || r->variables[index].valid) { |
446 return &r->variables[index]; | |
501 | 447 } |
499 | 448 |
501 | 449 v = cmcf->variables.elts; |
499 | 450 |
637 | 451 if (v[index].get_handler(r, &r->variables[index], v[index].data) |
452 == NGX_OK) | |
453 { | |
1565 | 454 if (v[index].flags & NGX_HTTP_VAR_NOCACHEABLE) { |
455 r->variables[index].no_cacheable = 1; | |
499 | 456 } |
573 | 457 |
458 return &r->variables[index]; | |
499 | 459 } |
460 | |
657 | 461 r->variables[index].valid = 0; |
462 r->variables[index].not_found = 1; | |
463 | |
798 | 464 return NULL; |
573 | 465 } |
466 | |
467 | |
468 ngx_http_variable_value_t * | |
469 ngx_http_get_flushed_variable(ngx_http_request_t *r, ngx_uint_t index) | |
470 { | |
1150 | 471 ngx_http_variable_value_t *v; |
573 | 472 |
473 v = &r->variables[index]; | |
474 | |
4470
d9bf6caf0371
Variables: honor no_cacheable for not_found variables.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
475 if (v->valid || v->not_found) { |
1565 | 476 if (!v->no_cacheable) { |
573 | 477 return v; |
478 } | |
479 | |
480 v->valid = 0; | |
481 v->not_found = 0; | |
509 | 482 } |
501 | 483 |
573 | 484 return ngx_http_get_indexed_variable(r, index); |
499 | 485 } |
486 | |
487 | |
488 ngx_http_variable_value_t * | |
3500
0eb46e3c5c02
change processing variables accessed by SSI and perl module:
Igor Sysoev <igor@sysoev.ru>
parents:
3499
diff
changeset
|
489 ngx_http_get_variable(ngx_http_request_t *r, ngx_str_t *name, ngx_uint_t key) |
499 | 490 { |
501 | 491 ngx_http_variable_t *v; |
573 | 492 ngx_http_variable_value_t *vv; |
499 | 493 ngx_http_core_main_conf_t *cmcf; |
494 | |
495 cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); | |
496 | |
611 | 497 v = ngx_hash_find(&cmcf->variables_hash, key, name->data, name->len); |
499 | 498 |
611 | 499 if (v) { |
500 if (v->flags & NGX_HTTP_VAR_INDEXED) { | |
3500
0eb46e3c5c02
change processing variables accessed by SSI and perl module:
Igor Sysoev <igor@sysoev.ru>
parents:
3499
diff
changeset
|
501 return ngx_http_get_flushed_variable(r, v->index); |
519 | 502 |
503 } else { | |
499 | 504 |
573 | 505 vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t)); |
501 | 506 |
637 | 507 if (vv && v->get_handler(r, vv, v->data) == NGX_OK) { |
573 | 508 return vv; |
509 } | |
509 | 510 |
573 | 511 return NULL; |
512 } | |
509 | 513 } |
514 | |
515 vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t)); | |
516 if (vv == NULL) { | |
517 return NULL; | |
518 } | |
519 | |
573 | 520 if (ngx_strncmp(name->data, "http_", 5) == 0) { |
499 | 521 |
577 | 522 if (ngx_http_variable_unknown_header_in(r, vv, (uintptr_t) name) |
523 == NGX_OK) | |
524 { | |
525 return vv; | |
526 } | |
527 | |
528 return NULL; | |
529 } | |
530 | |
531 if (ngx_strncmp(name->data, "sent_http_", 10) == 0) { | |
532 | |
533 if (ngx_http_variable_unknown_header_out(r, vv, (uintptr_t) name) | |
534 == NGX_OK) | |
573 | 535 { |
536 return vv; | |
537 } | |
499 | 538 |
539 return NULL; | |
540 } | |
541 | |
3451
7a1958778351
fix $upstream_http_ variable prefix length
Igor Sysoev <igor@sysoev.ru>
parents:
3409
diff
changeset
|
542 if (ngx_strncmp(name->data, "upstream_http_", 14) == 0) { |
1162 | 543 |
544 if (ngx_http_upstream_header_variable(r, vv, (uintptr_t) name) | |
545 == NGX_OK) | |
546 { | |
547 return vv; | |
548 } | |
549 | |
550 return NULL; | |
551 } | |
552 | |
2307 | 553 if (ngx_strncmp(name->data, "cookie_", 7) == 0) { |
554 | |
2359
4fee4ebbfb0b
$cookie_... variable did not for SSI and perl
Igor Sysoev <igor@sysoev.ru>
parents:
2333
diff
changeset
|
555 if (ngx_http_variable_cookie(r, vv, (uintptr_t) name) == NGX_OK) { |
2307 | 556 return vv; |
557 } | |
558 | |
559 return NULL; | |
560 } | |
561 | |
2137 | 562 if (ngx_strncmp(name->data, "arg_", 4) == 0) { |
563 | |
564 if (ngx_http_variable_argument(r, vv, (uintptr_t) name) == NGX_OK) { | |
565 return vv; | |
566 } | |
567 | |
568 return NULL; | |
569 } | |
570 | |
635 | 571 vv->not_found = 1; |
573 | 572 |
501 | 573 return vv; |
499 | 574 } |
575 | |
576 | |
573 | 577 static ngx_int_t |
578 ngx_http_variable_request(ngx_http_request_t *r, ngx_http_variable_value_t *v, | |
579 uintptr_t data) | |
580 { | |
581 ngx_str_t *s; | |
582 | |
583 s = (ngx_str_t *) ((char *) r + data); | |
584 | |
585 if (s->data) { | |
586 v->len = s->len; | |
587 v->valid = 1; | |
1565 | 588 v->no_cacheable = 0; |
573 | 589 v->not_found = 0; |
590 v->data = s->data; | |
591 | |
592 } else { | |
593 v->not_found = 1; | |
594 } | |
595 | |
596 return NGX_OK; | |
597 } | |
598 | |
599 | |
637 | 600 static void |
1350 | 601 ngx_http_variable_request_set(ngx_http_request_t *r, |
602 ngx_http_variable_value_t *v, uintptr_t data) | |
603 { | |
604 ngx_str_t *s; | |
605 | |
606 s = (ngx_str_t *) ((char *) r + data); | |
607 | |
608 s->len = v->len; | |
609 s->data = v->data; | |
610 } | |
611 | |
612 | |
3282
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
613 static ngx_int_t |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
614 ngx_http_variable_request_get_size(ngx_http_request_t *r, |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
615 ngx_http_variable_value_t *v, uintptr_t data) |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
616 { |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
617 size_t *sp; |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
618 |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
619 sp = (size_t *) ((char *) r + data); |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
620 |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
621 v->data = ngx_pnalloc(r->pool, NGX_SIZE_T_LEN); |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
622 if (v->data == NULL) { |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
623 return NGX_ERROR; |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
624 } |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
625 |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
626 v->len = ngx_sprintf(v->data, "%uz", *sp) - v->data; |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
627 v->valid = 1; |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
628 v->no_cacheable = 0; |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
629 v->not_found = 0; |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
630 |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
631 return NGX_OK; |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
632 } |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
633 |
c76b7a7959d5
fix segfault if $limit_rate was logged
Igor Sysoev <igor@sysoev.ru>
parents:
3268
diff
changeset
|
634 |
1350 | 635 static void |
637 | 636 ngx_http_variable_request_set_size(ngx_http_request_t *r, |
637 ngx_http_variable_value_t *v, uintptr_t data) | |
638 { | |
639 ssize_t s, *sp; | |
640 ngx_str_t val; | |
641 | |
1310
33d6c994a0b2
Sun Studio on sparc uses different bit order
Igor Sysoev <igor@sysoev.ru>
parents:
1191
diff
changeset
|
642 val.len = v->len; |
637 | 643 val.data = v->data; |
644 | |
645 s = ngx_parse_size(&val); | |
646 | |
647 if (s == NGX_ERROR) { | |
648 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
649 "invalid size \"%V\"", &val); | |
650 return; | |
651 } | |
652 | |
653 sp = (ssize_t *) ((char *) r + data); | |
654 | |
655 *sp = s; | |
656 | |
657 return; | |
658 } | |
659 | |
660 | |
573 | 661 static ngx_int_t |
662 ngx_http_variable_header(ngx_http_request_t *r, ngx_http_variable_value_t *v, | |
663 uintptr_t data) | |
515 | 664 { |
573 | 665 ngx_table_elt_t *h; |
666 | |
667 h = *(ngx_table_elt_t **) ((char *) r + data); | |
668 | |
669 if (h) { | |
670 v->len = h->value.len; | |
671 v->valid = 1; | |
1565 | 672 v->no_cacheable = 0; |
573 | 673 v->not_found = 0; |
674 v->data = h->value.data; | |
675 | |
676 } else { | |
677 v->not_found = 1; | |
678 } | |
679 | |
680 return NGX_OK; | |
681 } | |
682 | |
683 | |
684 static ngx_int_t | |
685 ngx_http_variable_headers(ngx_http_request_t *r, ngx_http_variable_value_t *v, | |
686 uintptr_t data) | |
687 { | |
4334
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
688 size_t len; |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
689 u_char *p, *end; |
667 | 690 ngx_uint_t i, n; |
573 | 691 ngx_array_t *a; |
692 ngx_table_elt_t **h; | |
515 | 693 |
694 a = (ngx_array_t *) ((char *) r + data); | |
695 | |
667 | 696 n = a->nelts; |
4334
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
697 h = a->elts; |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
698 |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
699 len = 0; |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
700 |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
701 for (i = 0; i < n; i++) { |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
702 |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
703 if (h[i]->hash == 0) { |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
704 continue; |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
705 } |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
706 |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
707 len += h[i]->value.len + sizeof("; ") - 1; |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
708 } |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
709 |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
710 if (len == 0) { |
573 | 711 v->not_found = 1; |
712 return NGX_OK; | |
515 | 713 } |
714 | |
4334
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
715 len -= sizeof("; ") - 1; |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
716 |
573 | 717 v->valid = 1; |
1565 | 718 v->no_cacheable = 0; |
573 | 719 v->not_found = 0; |
515 | 720 |
667 | 721 if (n == 1) { |
573 | 722 v->len = (*h)->value.len; |
723 v->data = (*h)->value.data; | |
515 | 724 |
573 | 725 return NGX_OK; |
515 | 726 } |
727 | |
2049 | 728 p = ngx_pnalloc(r->pool, len); |
573 | 729 if (p == NULL) { |
730 return NGX_ERROR; | |
731 } | |
732 | |
733 v->len = len; | |
734 v->data = p; | |
515 | 735 |
4334
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
736 end = p + len; |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
737 |
515 | 738 for (i = 0; /* void */ ; i++) { |
4334
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
739 |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
740 if (h[i]->hash == 0) { |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
741 continue; |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
742 } |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
743 |
573 | 744 p = ngx_copy(p, h[i]->value.data, h[i]->value.len); |
515 | 745 |
4334
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
746 if (p == end) { |
515 | 747 break; |
748 } | |
749 | |
750 *p++ = ';'; *p++ = ' '; | |
751 } | |
752 | |
573 | 753 return NGX_OK; |
515 | 754 } |
755 | |
756 | |
573 | 757 static ngx_int_t |
577 | 758 ngx_http_variable_unknown_header_in(ngx_http_request_t *r, |
759 ngx_http_variable_value_t *v, uintptr_t data) | |
760 { | |
761 return ngx_http_variable_unknown_header(v, (ngx_str_t *) data, | |
762 &r->headers_in.headers.part, | |
763 sizeof("http_") - 1); | |
764 } | |
765 | |
766 | |
767 static ngx_int_t | |
768 ngx_http_variable_unknown_header_out(ngx_http_request_t *r, | |
573 | 769 ngx_http_variable_value_t *v, uintptr_t data) |
499 | 770 { |
577 | 771 return ngx_http_variable_unknown_header(v, (ngx_str_t *) data, |
772 &r->headers_out.headers.part, | |
773 sizeof("sent_http_") - 1); | |
774 } | |
501 | 775 |
577 | 776 |
1162 | 777 ngx_int_t |
577 | 778 ngx_http_variable_unknown_header(ngx_http_variable_value_t *v, ngx_str_t *var, |
779 ngx_list_part_t *part, size_t prefix) | |
780 { | |
573 | 781 u_char ch; |
782 ngx_uint_t i, n; | |
783 ngx_table_elt_t *header; | |
499 | 784 |
785 header = part->elts; | |
786 | |
787 for (i = 0; /* void */ ; i++) { | |
788 | |
789 if (i >= part->nelts) { | |
790 if (part->next == NULL) { | |
791 break; | |
792 } | |
793 | |
794 part = part->next; | |
795 header = part->elts; | |
796 i = 0; | |
797 } | |
798 | |
4334
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
799 if (header[i].hash == 0) { |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
800 continue; |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
801 } |
f8881d301d62
Fixed: some of $sent_http_* variables may contain header entries that actually
Valentin Bartenev <vbart@nginx.com>
parents:
4332
diff
changeset
|
802 |
577 | 803 for (n = 0; n + prefix < var->len && n < header[i].key.len; n++) { |
499 | 804 ch = header[i].key.data[n]; |
805 | |
509 | 806 if (ch >= 'A' && ch <= 'Z') { |
807 ch |= 0x20; | |
499 | 808 |
809 } else if (ch == '-') { | |
810 ch = '_'; | |
811 } | |
812 | |
577 | 813 if (var->data[n + prefix] != ch) { |
499 | 814 break; |
815 } | |
816 } | |
817 | |
742
75d767d32624
nonexistent $sent_http_content has value of $sent_http_content_length or so
Igor Sysoev <igor@sysoev.ru>
parents:
732
diff
changeset
|
818 if (n + prefix == var->len && n == header[i].key.len) { |
573 | 819 v->len = header[i].value.len; |
820 v->valid = 1; | |
1565 | 821 v->no_cacheable = 0; |
573 | 822 v->not_found = 0; |
823 v->data = header[i].value.data; | |
499 | 824 |
573 | 825 return NGX_OK; |
499 | 826 } |
827 } | |
828 | |
573 | 829 v->not_found = 1; |
830 | |
831 return NGX_OK; | |
509 | 832 } |
833 | |
834 | |
573 | 835 static ngx_int_t |
3144
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
836 ngx_http_variable_request_line(ngx_http_request_t *r, |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
837 ngx_http_variable_value_t *v, uintptr_t data) |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
838 { |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
839 u_char *p, *s; |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
840 |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
841 s = r->request_line.data; |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
842 |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
843 if (s == NULL) { |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
844 s = r->request_start; |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
845 |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
846 if (s == NULL) { |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
847 v->not_found = 1; |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
848 return NGX_OK; |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
849 } |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
850 |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
851 for (p = s; p < r->header_in->last; p++) { |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
852 if (*p == CR || *p == LF) { |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
853 break; |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
854 } |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
855 } |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
856 |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
857 r->request_line.len = p - s; |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
858 r->request_line.data = s; |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
859 } |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
860 |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
861 v->len = r->request_line.len; |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
862 v->valid = 1; |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
863 v->no_cacheable = 0; |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
864 v->not_found = 0; |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
865 v->data = s; |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
866 |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
867 return NGX_OK; |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
868 } |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
869 |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
870 |
ecbfc3396c42
allow to log invalid $request in access_log always,
Igor Sysoev <igor@sysoev.ru>
parents:
2878
diff
changeset
|
871 static ngx_int_t |
2307 | 872 ngx_http_variable_cookie(ngx_http_request_t *r, ngx_http_variable_value_t *v, |
873 uintptr_t data) | |
874 { | |
875 ngx_str_t *name = (ngx_str_t *) data; | |
876 | |
877 ngx_str_t cookie, s; | |
878 | |
879 s.len = name->len - (sizeof("cookie_") - 1); | |
880 s.data = name->data + sizeof("cookie_") - 1; | |
881 | |
882 if (ngx_http_parse_multi_header_lines(&r->headers_in.cookies, &s, &cookie) | |
883 == NGX_DECLINED) | |
884 { | |
885 v->not_found = 1; | |
886 return NGX_OK; | |
887 } | |
888 | |
889 v->len = cookie.len; | |
890 v->valid = 1; | |
891 v->no_cacheable = 0; | |
892 v->not_found = 0; | |
893 v->data = cookie.data; | |
894 | |
895 return NGX_OK; | |
896 } | |
897 | |
898 | |
899 static ngx_int_t | |
2137 | 900 ngx_http_variable_argument(ngx_http_request_t *r, ngx_http_variable_value_t *v, |
901 uintptr_t data) | |
902 { | |
903 ngx_str_t *name = (ngx_str_t *) data; | |
904 | |
2415 | 905 u_char *arg; |
906 size_t len; | |
907 ngx_str_t value; | |
2137 | 908 |
2415 | 909 len = name->len - (sizeof("arg_") - 1); |
910 arg = name->data + sizeof("arg_") - 1; | |
911 | |
912 if (ngx_http_arg(r, arg, len, &value) != NGX_OK) { | |
2137 | 913 v->not_found = 1; |
914 return NGX_OK; | |
915 } | |
916 | |
2415 | 917 v->data = value.data; |
918 v->len = value.len; | |
919 v->valid = 1; | |
920 v->no_cacheable = 0; | |
921 v->not_found = 0; | |
2137 | 922 |
923 return NGX_OK; | |
924 } | |
925 | |
926 | |
4545
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
927 #if (NGX_HAVE_TCP_INFO) |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
928 |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
929 static ngx_int_t |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
930 ngx_http_variable_tcpinfo(ngx_http_request_t *r, ngx_http_variable_value_t *v, |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
931 uintptr_t data) |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
932 { |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
933 struct tcp_info ti; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
934 socklen_t len; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
935 uint32_t value; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
936 |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
937 len = sizeof(struct tcp_info); |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
938 if (getsockopt(r->connection->fd, IPPROTO_TCP, TCP_INFO, &ti, &len) == -1) { |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
939 v->not_found = 1; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
940 return NGX_OK; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
941 } |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
942 |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
943 v->data = ngx_pnalloc(r->pool, NGX_INT32_LEN); |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
944 if (v->data == NULL) { |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
945 return NGX_ERROR; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
946 } |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
947 |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
948 switch (data) { |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
949 case 0: |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
950 value = ti.tcpi_rtt; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
951 break; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
952 |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
953 case 1: |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
954 value = ti.tcpi_rttvar; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
955 break; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
956 |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
957 case 2: |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
958 value = ti.tcpi_snd_cwnd; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
959 break; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
960 |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
961 case 3: |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
962 value = ti.tcpi_rcv_space; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
963 break; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
964 |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
965 /* suppress warning */ |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
966 default: |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
967 value = 0; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
968 break; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
969 } |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
970 |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
971 v->len = ngx_sprintf(v->data, "%uD", value) - v->data; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
972 v->valid = 1; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
973 v->no_cacheable = 0; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
974 v->not_found = 0; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
975 |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
976 return NGX_OK; |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
977 } |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
978 |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
979 #endif |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
980 |
ba39af7274ed
Implemented $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, and
Ruslan Ermilov <ru@nginx.com>
parents:
4540
diff
changeset
|
981 |
2137 | 982 static ngx_int_t |
573 | 983 ngx_http_variable_host(ngx_http_request_t *r, ngx_http_variable_value_t *v, |
984 uintptr_t data) | |
509 | 985 { |
1811 | 986 ngx_http_core_srv_conf_t *cscf; |
987 | |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
1811
diff
changeset
|
988 if (r->headers_in.server.len) { |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
1811
diff
changeset
|
989 v->len = r->headers_in.server.len; |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
1811
diff
changeset
|
990 v->data = r->headers_in.server.data; |
928
a6fe6bedb9e3
fix segfault when $host is used and
Igor Sysoev <igor@sysoev.ru>
parents:
864
diff
changeset
|
991 |
a6fe6bedb9e3
fix segfault when $host is used and
Igor Sysoev <igor@sysoev.ru>
parents:
864
diff
changeset
|
992 } else { |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
1811
diff
changeset
|
993 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
1811
diff
changeset
|
994 |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
1811
diff
changeset
|
995 v->len = cscf->server_name.len; |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
1811
diff
changeset
|
996 v->data = cscf->server_name.data; |
509 | 997 } |
998 | |
573 | 999 v->valid = 1; |
1565 | 1000 v->no_cacheable = 0; |
573 | 1001 v->not_found = 0; |
509 | 1002 |
573 | 1003 return NGX_OK; |
499 | 1004 } |
1005 | |
1006 | |
573 | 1007 static ngx_int_t |
983
7a8ca436d611
ngx_http_variable_binary_remote_addr()
Igor Sysoev <igor@sysoev.ru>
parents:
982
diff
changeset
|
1008 ngx_http_variable_binary_remote_addr(ngx_http_request_t *r, |
573 | 1009 ngx_http_variable_value_t *v, uintptr_t data) |
499 | 1010 { |
2512
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1011 struct sockaddr_in *sin; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1012 #if (NGX_HAVE_INET6) |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1013 struct sockaddr_in6 *sin6; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1014 #endif |
982 | 1015 |
2512
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1016 switch (r->connection->sockaddr->sa_family) { |
983
7a8ca436d611
ngx_http_variable_binary_remote_addr()
Igor Sysoev <igor@sysoev.ru>
parents:
982
diff
changeset
|
1017 |
2512
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1018 #if (NGX_HAVE_INET6) |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1019 case AF_INET6: |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1020 sin6 = (struct sockaddr_in6 *) r->connection->sockaddr; |
982 | 1021 |
2512
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1022 v->len = sizeof(struct in6_addr); |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1023 v->valid = 1; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1024 v->no_cacheable = 0; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1025 v->not_found = 0; |
3268
c6a40c815d45
use sin6_addr.s6_addr instead of "(u_char *) & .sin6_addr"
Igor Sysoev <igor@sysoev.ru>
parents:
3144
diff
changeset
|
1026 v->data = sin6->sin6_addr.s6_addr; |
2512
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1027 |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1028 break; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1029 #endif |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1030 |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1031 default: /* AF_INET */ |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1032 sin = (struct sockaddr_in *) r->connection->sockaddr; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1033 |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1034 v->len = sizeof(in_addr_t); |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1035 v->valid = 1; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1036 v->no_cacheable = 0; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1037 v->not_found = 0; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1038 v->data = (u_char *) &sin->sin_addr; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1039 |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1040 break; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1041 } |
982 | 1042 |
983
7a8ca436d611
ngx_http_variable_binary_remote_addr()
Igor Sysoev <igor@sysoev.ru>
parents:
982
diff
changeset
|
1043 return NGX_OK; |
7a8ca436d611
ngx_http_variable_binary_remote_addr()
Igor Sysoev <igor@sysoev.ru>
parents:
982
diff
changeset
|
1044 } |
982 | 1045 |
1046 | |
983
7a8ca436d611
ngx_http_variable_binary_remote_addr()
Igor Sysoev <igor@sysoev.ru>
parents:
982
diff
changeset
|
1047 static ngx_int_t |
7a8ca436d611
ngx_http_variable_binary_remote_addr()
Igor Sysoev <igor@sysoev.ru>
parents:
982
diff
changeset
|
1048 ngx_http_variable_remote_addr(ngx_http_request_t *r, |
7a8ca436d611
ngx_http_variable_binary_remote_addr()
Igor Sysoev <igor@sysoev.ru>
parents:
982
diff
changeset
|
1049 ngx_http_variable_value_t *v, uintptr_t data) |
7a8ca436d611
ngx_http_variable_binary_remote_addr()
Igor Sysoev <igor@sysoev.ru>
parents:
982
diff
changeset
|
1050 { |
7a8ca436d611
ngx_http_variable_binary_remote_addr()
Igor Sysoev <igor@sysoev.ru>
parents:
982
diff
changeset
|
1051 v->len = r->connection->addr_text.len; |
7a8ca436d611
ngx_http_variable_binary_remote_addr()
Igor Sysoev <igor@sysoev.ru>
parents:
982
diff
changeset
|
1052 v->valid = 1; |
1565 | 1053 v->no_cacheable = 0; |
983
7a8ca436d611
ngx_http_variable_binary_remote_addr()
Igor Sysoev <igor@sysoev.ru>
parents:
982
diff
changeset
|
1054 v->not_found = 0; |
7a8ca436d611
ngx_http_variable_binary_remote_addr()
Igor Sysoev <igor@sysoev.ru>
parents:
982
diff
changeset
|
1055 v->data = r->connection->addr_text.data; |
499 | 1056 |
573 | 1057 return NGX_OK; |
499 | 1058 } |
1059 | |
1060 | |
573 | 1061 static ngx_int_t |
1062 ngx_http_variable_remote_port(ngx_http_request_t *r, | |
1063 ngx_http_variable_value_t *v, uintptr_t data) | |
499 | 1064 { |
2512
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1065 ngx_uint_t port; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1066 struct sockaddr_in *sin; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1067 #if (NGX_HAVE_INET6) |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1068 struct sockaddr_in6 *sin6; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1069 #endif |
509 | 1070 |
573 | 1071 v->len = 0; |
1072 v->valid = 1; | |
1565 | 1073 v->no_cacheable = 0; |
573 | 1074 v->not_found = 0; |
509 | 1075 |
2049 | 1076 v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1); |
573 | 1077 if (v->data == NULL) { |
1078 return NGX_ERROR; | |
509 | 1079 } |
1080 | |
2512
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1081 switch (r->connection->sockaddr->sa_family) { |
577 | 1082 |
2512
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1083 #if (NGX_HAVE_INET6) |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1084 case AF_INET6: |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1085 sin6 = (struct sockaddr_in6 *) r->connection->sockaddr; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1086 port = ntohs(sin6->sin6_port); |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1087 break; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1088 #endif |
577 | 1089 |
2512
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1090 default: /* AF_INET */ |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1091 sin = (struct sockaddr_in *) r->connection->sockaddr; |
509 | 1092 port = ntohs(sin->sin_port); |
2512
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1093 break; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1094 } |
577 | 1095 |
2512
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1096 if (port > 0 && port < 65536) { |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1097 v->len = ngx_sprintf(v->data, "%ui", port) - v->data; |
509 | 1098 } |
1099 | |
573 | 1100 return NGX_OK; |
509 | 1101 } |
1102 | |
1103 | |
573 | 1104 static ngx_int_t |
1105 ngx_http_variable_server_addr(ngx_http_request_t *r, | |
1106 ngx_http_variable_value_t *v, uintptr_t data) | |
509 | 1107 { |
1805 | 1108 ngx_str_t s; |
2512
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1109 u_char addr[NGX_SOCKADDR_STRLEN]; |
499 | 1110 |
2512
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1111 s.len = NGX_SOCKADDR_STRLEN; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1112 s.data = addr; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1113 |
2857
507fc5ac9839
use ngx_connection_local_sockaddr() instead of ngx_http_server_addr()
Igor Sysoev <igor@sysoev.ru>
parents:
2844
diff
changeset
|
1114 if (ngx_connection_local_sockaddr(r->connection, &s, 0) != NGX_OK) { |
2512
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1115 return NGX_ERROR; |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1116 } |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1117 |
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1118 s.data = ngx_pnalloc(r->pool, s.len); |
1805 | 1119 if (s.data == NULL) { |
573 | 1120 return NGX_ERROR; |
509 | 1121 } |
1122 | |
2512
2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents:
2485
diff
changeset
|
1123 ngx_memcpy(s.data, addr, s.len); |
509 | 1124 |
1805 | 1125 v->len = s.len; |
573 | 1126 v->valid = 1; |
1565 | 1127 v->no_cacheable = 0; |
573 | 1128 v->not_found = 0; |
1805 | 1129 v->data = s.data; |
499 | 1130 |
573 | 1131 return NGX_OK; |
499 | 1132 } |
1133 | |
1134 | |
573 | 1135 static ngx_int_t |
1136 ngx_http_variable_server_port(ngx_http_request_t *r, | |
1137 ngx_http_variable_value_t *v, uintptr_t data) | |
509 | 1138 { |
2533 | 1139 ngx_uint_t port; |
1140 struct sockaddr_in *sin; | |
1141 #if (NGX_HAVE_INET6) | |
1142 struct sockaddr_in6 *sin6; | |
1143 #endif | |
1144 | |
1145 v->len = 0; | |
573 | 1146 v->valid = 1; |
1565 | 1147 v->no_cacheable = 0; |
573 | 1148 v->not_found = 0; |
2533 | 1149 |
2857
507fc5ac9839
use ngx_connection_local_sockaddr() instead of ngx_http_server_addr()
Igor Sysoev <igor@sysoev.ru>
parents:
2844
diff
changeset
|
1150 if (ngx_connection_local_sockaddr(r->connection, NULL, 0) != NGX_OK) { |
2533 | 1151 return NGX_ERROR; |
1152 } | |
1153 | |
1154 v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1); | |
1155 if (v->data == NULL) { | |
1156 return NGX_ERROR; | |
1157 } | |
1158 | |
1159 switch (r->connection->local_sockaddr->sa_family) { | |
1160 | |
1161 #if (NGX_HAVE_INET6) | |
1162 case AF_INET6: | |
1163 sin6 = (struct sockaddr_in6 *) r->connection->local_sockaddr; | |
1164 port = ntohs(sin6->sin6_port); | |
1165 break; | |
1166 #endif | |
1167 | |
1168 default: /* AF_INET */ | |
1169 sin = (struct sockaddr_in *) r->connection->local_sockaddr; | |
1170 port = ntohs(sin->sin_port); | |
1171 break; | |
1172 } | |
1173 | |
1174 if (port > 0 && port < 65536) { | |
1175 v->len = ngx_sprintf(v->data, "%ui", port) - v->data; | |
1176 } | |
509 | 1177 |
573 | 1178 return NGX_OK; |
509 | 1179 } |
1180 | |
1181 | |
573 | 1182 static ngx_int_t |
731 | 1183 ngx_http_variable_scheme(ngx_http_request_t *r, |
1184 ngx_http_variable_value_t *v, uintptr_t data) | |
1185 { | |
1186 #if (NGX_HTTP_SSL) | |
1187 | |
1188 if (r->connection->ssl) { | |
1189 v->len = sizeof("https") - 1; | |
1190 v->valid = 1; | |
1565 | 1191 v->no_cacheable = 0; |
731 | 1192 v->not_found = 0; |
732 | 1193 v->data = (u_char *) "https"; |
731 | 1194 |
1195 return NGX_OK; | |
1196 } | |
1197 | |
1198 #endif | |
1199 | |
1200 v->len = sizeof("http") - 1; | |
1201 v->valid = 1; | |
1565 | 1202 v->no_cacheable = 0; |
731 | 1203 v->not_found = 0; |
732 | 1204 v->data = (u_char *) "http"; |
731 | 1205 |
1206 return NGX_OK; | |
1207 } | |
1208 | |
1209 | |
1210 static ngx_int_t | |
4332
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1211 ngx_http_variable_https(ngx_http_request_t *r, |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1212 ngx_http_variable_value_t *v, uintptr_t data) |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1213 { |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1214 #if (NGX_HTTP_SSL) |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1215 |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1216 if (r->connection->ssl) { |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1217 v->len = sizeof("on") - 1; |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1218 v->valid = 1; |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1219 v->no_cacheable = 0; |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1220 v->not_found = 0; |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1221 v->data = (u_char *) "on"; |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1222 |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1223 return NGX_OK; |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1224 } |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1225 |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1226 #endif |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1227 |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1228 *v = ngx_http_variable_null_value; |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1229 |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1230 return NGX_OK; |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1231 } |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1232 |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1233 |
4d9f985fd217
Added the $https variable.
Valentin Bartenev <vbart@nginx.com>
parents:
3929
diff
changeset
|
1234 static ngx_int_t |
1351 | 1235 ngx_http_variable_is_args(ngx_http_request_t *r, |
1236 ngx_http_variable_value_t *v, uintptr_t data) | |
1237 { | |
1238 v->valid = 1; | |
1565 | 1239 v->no_cacheable = 0; |
1351 | 1240 v->not_found = 0; |
1241 | |
1242 if (r->args.len == 0) { | |
1243 v->len = 0; | |
1244 v->data = NULL; | |
1245 return NGX_OK; | |
1246 } | |
1247 | |
1248 v->len = 1; | |
1249 v->data = (u_char *) "?"; | |
1250 | |
1251 return NGX_OK; | |
1252 } | |
1253 | |
1254 | |
1255 static ngx_int_t | |
573 | 1256 ngx_http_variable_document_root(ngx_http_request_t *r, |
1257 ngx_http_variable_value_t *v, uintptr_t data) | |
499 | 1258 { |
671 | 1259 ngx_str_t path; |
573 | 1260 ngx_http_core_loc_conf_t *clcf; |
509 | 1261 |
1262 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); | |
1263 | |
671 | 1264 if (clcf->root_lengths == NULL) { |
1265 v->len = clcf->root.len; | |
1266 v->valid = 1; | |
1565 | 1267 v->no_cacheable = 0; |
671 | 1268 v->not_found = 0; |
1269 v->data = clcf->root.data; | |
1270 | |
1271 } else { | |
1272 if (ngx_http_script_run(r, &path, clcf->root_lengths->elts, 0, | |
1273 clcf->root_values->elts) | |
1274 == NULL) | |
1275 { | |
1276 return NGX_ERROR; | |
1277 } | |
1278 | |
2536
a6d6d762c554
small optimization: " == NGX_ERROR" > " != NGX_OK"
Igor Sysoev <igor@sysoev.ru>
parents:
2533
diff
changeset
|
1279 if (ngx_conf_full_name((ngx_cycle_t *) ngx_cycle, &path, 0) != NGX_OK) { |
671 | 1280 return NGX_ERROR; |
1281 } | |
1282 | |
1283 v->len = path.len; | |
1284 v->valid = 1; | |
1565 | 1285 v->no_cacheable = 0; |
671 | 1286 v->not_found = 0; |
1287 v->data = path.data; | |
1288 } | |
509 | 1289 |
573 | 1290 return NGX_OK; |
509 | 1291 } |
1292 | |
1293 | |
573 | 1294 static ngx_int_t |
2259 | 1295 ngx_http_variable_realpath_root(ngx_http_request_t *r, |
1296 ngx_http_variable_value_t *v, uintptr_t data) | |
1297 { | |
4558
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1298 u_char *real; |
2259 | 1299 size_t len; |
1300 ngx_str_t path; | |
1301 ngx_http_core_loc_conf_t *clcf; | |
4558
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1302 #if (NGX_HAVE_MAX_PATH) |
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1303 u_char buffer[NGX_MAX_PATH]; |
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1304 #endif |
2259 | 1305 |
1306 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); | |
1307 | |
1308 if (clcf->root_lengths == NULL) { | |
1309 path = clcf->root; | |
1310 | |
1311 } else { | |
1312 if (ngx_http_script_run(r, &path, clcf->root_lengths->elts, 1, | |
1313 clcf->root_values->elts) | |
1314 == NULL) | |
1315 { | |
1316 return NGX_ERROR; | |
1317 } | |
1318 | |
1319 path.data[path.len - 1] = '\0'; | |
1320 | |
2536
a6d6d762c554
small optimization: " == NGX_ERROR" > " != NGX_OK"
Igor Sysoev <igor@sysoev.ru>
parents:
2533
diff
changeset
|
1321 if (ngx_conf_full_name((ngx_cycle_t *) ngx_cycle, &path, 0) != NGX_OK) { |
2259 | 1322 return NGX_ERROR; |
1323 } | |
1324 } | |
1325 | |
4558
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1326 #if (NGX_HAVE_MAX_PATH) |
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1327 real = buffer; |
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1328 #else |
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1329 real = NULL; |
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1330 #endif |
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1331 |
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1332 real = ngx_realpath(path.data, real); |
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1333 |
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1334 if (real == NULL) { |
2259 | 1335 ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno, |
1336 ngx_realpath_n " \"%s\" failed", path.data); | |
1337 return NGX_ERROR; | |
1338 } | |
1339 | |
1340 len = ngx_strlen(real); | |
1341 | |
1342 v->data = ngx_pnalloc(r->pool, len); | |
1343 if (v->data == NULL) { | |
4558
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1344 #if !(NGX_HAVE_MAX_PATH) |
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1345 ngx_free(real); |
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1346 #endif |
2259 | 1347 return NGX_ERROR; |
1348 } | |
1349 | |
1350 v->len = len; | |
1351 v->valid = 1; | |
1352 v->no_cacheable = 0; | |
1353 v->not_found = 0; | |
1354 | |
1355 ngx_memcpy(v->data, real, len); | |
1356 | |
4558
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1357 #if !(NGX_HAVE_MAX_PATH) |
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1358 ngx_free(real); |
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1359 #endif |
8865fd1f3aa5
Fixed unconditional MAX_PATH usage (ticket #22).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4545
diff
changeset
|
1360 |
2259 | 1361 return NGX_OK; |
1362 } | |
1363 | |
1364 | |
1365 static ngx_int_t | |
573 | 1366 ngx_http_variable_request_filename(ngx_http_request_t *r, |
1367 ngx_http_variable_value_t *v, uintptr_t data) | |
509 | 1368 { |
773 | 1369 size_t root; |
573 | 1370 ngx_str_t path; |
499 | 1371 |
773 | 1372 if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) { |
573 | 1373 return NGX_ERROR; |
557 | 1374 } |
509 | 1375 |
557 | 1376 /* ngx_http_map_uri_to_path() allocates memory for terminating '\0' */ |
509 | 1377 |
573 | 1378 v->len = path.len - 1; |
1379 v->valid = 1; | |
1565 | 1380 v->no_cacheable = 0; |
573 | 1381 v->not_found = 0; |
1382 v->data = path.data; | |
499 | 1383 |
573 | 1384 return NGX_OK; |
499 | 1385 } |
1386 | |
1387 | |
573 | 1388 static ngx_int_t |
1811 | 1389 ngx_http_variable_server_name(ngx_http_request_t *r, |
1390 ngx_http_variable_value_t *v, uintptr_t data) | |
1391 { | |
1392 ngx_http_core_srv_conf_t *cscf; | |
1393 | |
1394 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); | |
1395 | |
1396 v->len = cscf->server_name.len; | |
1397 v->valid = 1; | |
1398 v->no_cacheable = 0; | |
1399 v->not_found = 0; | |
1400 v->data = cscf->server_name.data; | |
1401 | |
1402 return NGX_OK; | |
1403 } | |
1404 | |
1405 | |
1406 static ngx_int_t | |
573 | 1407 ngx_http_variable_request_method(ngx_http_request_t *r, |
1408 ngx_http_variable_value_t *v, uintptr_t data) | |
561 | 1409 { |
647 | 1410 if (r->main->method_name.data) { |
1411 v->len = r->main->method_name.len; | |
573 | 1412 v->valid = 1; |
1565 | 1413 v->no_cacheable = 0; |
573 | 1414 v->not_found = 0; |
647 | 1415 v->data = r->main->method_name.data; |
573 | 1416 |
1417 } else { | |
1418 v->not_found = 1; | |
561 | 1419 } |
1420 | |
573 | 1421 return NGX_OK; |
561 | 1422 } |
1423 | |
1424 | |
573 | 1425 static ngx_int_t |
1426 ngx_http_variable_remote_user(ngx_http_request_t *r, | |
1427 ngx_http_variable_value_t *v, uintptr_t data) | |
539 | 1428 { |
573 | 1429 ngx_int_t rc; |
539 | 1430 |
1431 rc = ngx_http_auth_basic_user(r); | |
1432 | |
1433 if (rc == NGX_DECLINED) { | |
573 | 1434 v->not_found = 1; |
1435 return NGX_OK; | |
539 | 1436 } |
1437 | |
1438 if (rc == NGX_ERROR) { | |
573 | 1439 return NGX_ERROR; |
539 | 1440 } |
1441 | |
573 | 1442 v->len = r->headers_in.user.len; |
1443 v->valid = 1; | |
1565 | 1444 v->no_cacheable = 0; |
573 | 1445 v->not_found = 0; |
1446 v->data = r->headers_in.user.data; | |
571 | 1447 |
573 | 1448 return NGX_OK; |
571 | 1449 } |
1450 | |
1451 | |
611 | 1452 static ngx_int_t |
4886 | 1453 ngx_http_variable_bytes_sent(ngx_http_request_t *r, |
1454 ngx_http_variable_value_t *v, uintptr_t data) | |
1455 { | |
1456 u_char *p; | |
1457 | |
1458 p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN); | |
1459 if (p == NULL) { | |
1460 return NGX_ERROR; | |
1461 } | |
1462 | |
1463 v->len = ngx_sprintf(p, "%O", r->connection->sent) - p; | |
1464 v->valid = 1; | |
1465 v->no_cacheable = 0; | |
1466 v->not_found = 0; | |
1467 v->data = p; | |
1468 | |
1469 return NGX_OK; | |
1470 } | |
1471 | |
1472 | |
1473 static ngx_int_t | |
611 | 1474 ngx_http_variable_body_bytes_sent(ngx_http_request_t *r, |
1475 ngx_http_variable_value_t *v, uintptr_t data) | |
1476 { | |
1477 off_t sent; | |
1478 u_char *p; | |
1479 | |
1480 sent = r->connection->sent - r->header_size; | |
1481 | |
1482 if (sent < 0) { | |
1483 sent = 0; | |
1484 } | |
1485 | |
2049 | 1486 p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN); |
611 | 1487 if (p == NULL) { |
1488 return NGX_ERROR; | |
1489 } | |
1490 | |
1491 v->len = ngx_sprintf(p, "%O", sent) - p; | |
1492 v->valid = 1; | |
1565 | 1493 v->no_cacheable = 0; |
611 | 1494 v->not_found = 0; |
1495 v->data = p; | |
1496 | |
1497 return NGX_OK; | |
1498 } | |
1499 | |
1500 | |
629 | 1501 static ngx_int_t |
4685
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1502 ngx_http_variable_status(ngx_http_request_t *r, |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1503 ngx_http_variable_value_t *v, uintptr_t data) |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1504 { |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1505 ngx_uint_t status; |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1506 |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1507 v->data = ngx_pnalloc(r->pool, NGX_INT_T_LEN); |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1508 if (v->data == NULL) { |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1509 return NGX_ERROR; |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1510 } |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1511 |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1512 if (r->err_status) { |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1513 status = r->err_status; |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1514 |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1515 } else if (r->headers_out.status) { |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1516 status = r->headers_out.status; |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1517 |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1518 } else if (r->http_version == NGX_HTTP_VERSION_9) { |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1519 status = 9; |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1520 |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1521 } else { |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1522 status = 0; |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1523 } |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1524 |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1525 v->len = ngx_sprintf(v->data, "%03ui", status) - v->data; |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1526 v->valid = 1; |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1527 v->no_cacheable = 0; |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1528 v->not_found = 0; |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1529 |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1530 return NGX_OK; |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1531 } |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1532 |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1533 |
956edecaedeb
New core variable: $status.
Andrey Belov <defan@nginx.com>
parents:
4641
diff
changeset
|
1534 static ngx_int_t |
641 | 1535 ngx_http_variable_sent_content_type(ngx_http_request_t *r, |
1536 ngx_http_variable_value_t *v, uintptr_t data) | |
1537 { | |
1538 if (r->headers_out.content_type.len) { | |
1539 v->len = r->headers_out.content_type.len; | |
1540 v->valid = 1; | |
1565 | 1541 v->no_cacheable = 0; |
641 | 1542 v->not_found = 0; |
1543 v->data = r->headers_out.content_type.data; | |
1544 | |
1545 } else { | |
1546 v->not_found = 1; | |
1547 } | |
1548 | |
1549 return NGX_OK; | |
1550 } | |
1551 | |
1552 | |
1553 static ngx_int_t | |
1554 ngx_http_variable_sent_content_length(ngx_http_request_t *r, | |
1555 ngx_http_variable_value_t *v, uintptr_t data) | |
1556 { | |
1557 u_char *p; | |
1558 | |
1559 if (r->headers_out.content_length) { | |
1560 v->len = r->headers_out.content_length->value.len; | |
1561 v->valid = 1; | |
1565 | 1562 v->no_cacheable = 0; |
641 | 1563 v->not_found = 0; |
1564 v->data = r->headers_out.content_length->value.data; | |
1565 | |
1566 return NGX_OK; | |
1567 } | |
1568 | |
1569 if (r->headers_out.content_length_n >= 0) { | |
2049 | 1570 p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN); |
641 | 1571 if (p == NULL) { |
1572 return NGX_ERROR; | |
1573 } | |
1574 | |
1575 v->len = ngx_sprintf(p, "%O", r->headers_out.content_length_n) - p; | |
1576 v->valid = 1; | |
1565 | 1577 v->no_cacheable = 0; |
641 | 1578 v->not_found = 0; |
1579 v->data = p; | |
1580 | |
1581 return NGX_OK; | |
1582 } | |
1583 | |
1584 v->not_found = 1; | |
1585 | |
1586 return NGX_OK; | |
1587 } | |
1588 | |
1589 | |
1590 static ngx_int_t | |
2485
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1591 ngx_http_variable_sent_location(ngx_http_request_t *r, |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1592 ngx_http_variable_value_t *v, uintptr_t data) |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1593 { |
2539
051e9b12428e
fix segfault introduced in r2486 in $sent_http_location processing
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
1594 ngx_str_t name; |
051e9b12428e
fix segfault introduced in r2486 in $sent_http_location processing
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
1595 |
2485
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1596 if (r->headers_out.location) { |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1597 v->len = r->headers_out.location->value.len; |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1598 v->valid = 1; |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1599 v->no_cacheable = 0; |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1600 v->not_found = 0; |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1601 v->data = r->headers_out.location->value.data; |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1602 |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1603 return NGX_OK; |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1604 } |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1605 |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3500
diff
changeset
|
1606 ngx_str_set(&name, "sent_http_location"); |
2539
051e9b12428e
fix segfault introduced in r2486 in $sent_http_location processing
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
1607 |
051e9b12428e
fix segfault introduced in r2486 in $sent_http_location processing
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
1608 return ngx_http_variable_unknown_header(v, &name, |
2485
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1609 &r->headers_out.headers.part, |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1610 sizeof("sent_http_") - 1); |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1611 } |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1612 |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1613 |
51b1097dbb67
fix $sent_http_location for local redirects
Igor Sysoev <igor@sysoev.ru>
parents:
2415
diff
changeset
|
1614 static ngx_int_t |
641 | 1615 ngx_http_variable_sent_last_modified(ngx_http_request_t *r, |
1616 ngx_http_variable_value_t *v, uintptr_t data) | |
1617 { | |
1618 u_char *p; | |
1619 | |
1620 if (r->headers_out.last_modified) { | |
1621 v->len = r->headers_out.last_modified->value.len; | |
1622 v->valid = 1; | |
1565 | 1623 v->no_cacheable = 0; |
641 | 1624 v->not_found = 0; |
1625 v->data = r->headers_out.last_modified->value.data; | |
1626 | |
1627 return NGX_OK; | |
1628 } | |
1629 | |
1630 if (r->headers_out.last_modified_time >= 0) { | |
2049 | 1631 p = ngx_pnalloc(r->pool, |
641 | 1632 sizeof("Last-Modified: Mon, 28 Sep 1970 06:00:00 GMT") - 1); |
1633 if (p == NULL) { | |
1634 return NGX_ERROR; | |
1635 } | |
1636 | |
1637 v->len = ngx_http_time(p, r->headers_out.last_modified_time) - p; | |
1638 v->valid = 1; | |
1565 | 1639 v->no_cacheable = 0; |
641 | 1640 v->not_found = 0; |
1641 v->data = p; | |
1642 | |
1643 return NGX_OK; | |
1644 } | |
1645 | |
1646 v->not_found = 1; | |
1647 | |
1648 return NGX_OK; | |
1649 } | |
1650 | |
1651 | |
1652 static ngx_int_t | |
1653 ngx_http_variable_sent_connection(ngx_http_request_t *r, | |
1654 ngx_http_variable_value_t *v, uintptr_t data) | |
1655 { | |
1656 size_t len; | |
1657 char *p; | |
1658 | |
1659 if (r->keepalive) { | |
1660 len = sizeof("keep-alive") - 1; | |
1661 p = "keep-alive"; | |
1662 | |
1663 } else { | |
1664 len = sizeof("close") - 1; | |
1665 p = "close"; | |
1666 } | |
1667 | |
1668 v->len = len; | |
1669 v->valid = 1; | |
1565 | 1670 v->no_cacheable = 0; |
641 | 1671 v->not_found = 0; |
1672 v->data = (u_char *) p; | |
1673 | |
1674 return NGX_OK; | |
1675 } | |
1676 | |
1677 | |
1678 static ngx_int_t | |
1679 ngx_http_variable_sent_keep_alive(ngx_http_request_t *r, | |
1680 ngx_http_variable_value_t *v, uintptr_t data) | |
1681 { | |
1682 u_char *p; | |
1683 ngx_http_core_loc_conf_t *clcf; | |
1684 | |
1685 if (r->keepalive) { | |
1686 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); | |
1687 | |
1688 if (clcf->keepalive_header) { | |
1689 | |
2049 | 1690 p = ngx_pnalloc(r->pool, sizeof("timeout=") - 1 + NGX_TIME_T_LEN); |
641 | 1691 if (p == NULL) { |
1692 return NGX_ERROR; | |
1693 } | |
1694 | |
1695 v->len = ngx_sprintf(p, "timeout=%T", clcf->keepalive_header) - p; | |
1696 v->valid = 1; | |
1565 | 1697 v->no_cacheable = 0; |
641 | 1698 v->not_found = 0; |
1699 v->data = p; | |
1700 | |
1701 return NGX_OK; | |
1702 } | |
1703 } | |
1704 | |
1705 v->not_found = 1; | |
1706 | |
1707 return NGX_OK; | |
1708 } | |
1709 | |
1710 | |
1711 static ngx_int_t | |
1712 ngx_http_variable_sent_transfer_encoding(ngx_http_request_t *r, | |
1713 ngx_http_variable_value_t *v, uintptr_t data) | |
1714 { | |
1715 if (r->chunked) { | |
1716 v->len = sizeof("chunked") - 1; | |
1717 v->valid = 1; | |
1565 | 1718 v->no_cacheable = 0; |
641 | 1719 v->not_found = 0; |
1720 v->data = (u_char *) "chunked"; | |
1721 | |
1722 } else { | |
1723 v->not_found = 1; | |
1724 } | |
1725 | |
1726 return NGX_OK; | |
1727 } | |
1728 | |
1729 | |
1730 static ngx_int_t | |
629 | 1731 ngx_http_variable_request_completion(ngx_http_request_t *r, |
1732 ngx_http_variable_value_t *v, uintptr_t data) | |
1733 { | |
1734 if (r->request_complete) { | |
1735 v->len = 2; | |
1736 v->valid = 1; | |
1565 | 1737 v->no_cacheable = 0; |
629 | 1738 v->not_found = 0; |
1739 v->data = (u_char *) "OK"; | |
1740 | |
1741 return NGX_OK; | |
1742 } | |
1743 | |
1744 v->len = 0; | |
1745 v->valid = 1; | |
1565 | 1746 v->no_cacheable = 0; |
629 | 1747 v->not_found = 0; |
1748 v->data = (u_char *) ""; | |
1749 | |
1750 return NGX_OK; | |
1751 } | |
1752 | |
1753 | |
759 | 1754 static ngx_int_t |
2844 | 1755 ngx_http_variable_request_body(ngx_http_request_t *r, |
1756 ngx_http_variable_value_t *v, uintptr_t data) | |
1757 { | |
1758 u_char *p; | |
1759 size_t len; | |
1760 ngx_buf_t *buf, *next; | |
1761 ngx_chain_t *cl; | |
1762 | |
2878
8535736ace1a
fix segfault introduced in r2845
Igor Sysoev <igor@sysoev.ru>
parents:
2857
diff
changeset
|
1763 if (r->request_body == NULL |
8535736ace1a
fix segfault introduced in r2845
Igor Sysoev <igor@sysoev.ru>
parents:
2857
diff
changeset
|
1764 || r->request_body->bufs == NULL |
8535736ace1a
fix segfault introduced in r2845
Igor Sysoev <igor@sysoev.ru>
parents:
2857
diff
changeset
|
1765 || r->request_body->temp_file) |
8535736ace1a
fix segfault introduced in r2845
Igor Sysoev <igor@sysoev.ru>
parents:
2857
diff
changeset
|
1766 { |
2844 | 1767 v->not_found = 1; |
1768 | |
1769 return NGX_OK; | |
1770 } | |
1771 | |
1772 cl = r->request_body->bufs; | |
1773 buf = cl->buf; | |
1774 | |
1775 if (cl->next == NULL) { | |
1776 v->len = buf->last - buf->pos; | |
1777 v->valid = 1; | |
1778 v->no_cacheable = 0; | |
1779 v->not_found = 0; | |
1780 v->data = buf->pos; | |
1781 | |
1782 return NGX_OK; | |
1783 } | |
1784 | |
1785 next = cl->next->buf; | |
1786 len = (buf->last - buf->pos) + (next->last - next->pos); | |
1787 | |
1788 p = ngx_pnalloc(r->pool, len); | |
1789 if (p == NULL) { | |
1790 return NGX_ERROR; | |
1791 } | |
1792 | |
1793 v->data = p; | |
1794 | |
1795 p = ngx_cpymem(p, buf->pos, buf->last - buf->pos); | |
1796 ngx_memcpy(p, next->pos, next->last - next->pos); | |
1797 | |
1798 v->len = len; | |
1799 v->valid = 1; | |
1800 v->no_cacheable = 0; | |
1801 v->not_found = 0; | |
1802 | |
1803 return NGX_OK; | |
1804 } | |
1805 | |
1806 | |
1807 static ngx_int_t | |
759 | 1808 ngx_http_variable_request_body_file(ngx_http_request_t *r, |
1809 ngx_http_variable_value_t *v, uintptr_t data) | |
1810 { | |
1811 if (r->request_body == NULL || r->request_body->temp_file == NULL) { | |
763
0b0f3d4854c0
variable should not be found if no request body file
Igor Sysoev <igor@sysoev.ru>
parents:
759
diff
changeset
|
1812 v->not_found = 1; |
759 | 1813 |
1814 return NGX_OK; | |
1815 } | |
1816 | |
1817 v->len = r->request_body->temp_file->file.name.len; | |
1818 v->valid = 1; | |
1565 | 1819 v->no_cacheable = 0; |
759 | 1820 v->not_found = 0; |
1821 v->data = r->request_body->temp_file->file.name.data; | |
1822 | |
1823 return NGX_OK; | |
1824 } | |
1825 | |
1826 | |
1329 | 1827 static ngx_int_t |
4893
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1828 ngx_http_variable_connection(ngx_http_request_t *r, |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1829 ngx_http_variable_value_t *v, uintptr_t data) |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1830 { |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1831 u_char *p; |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1832 |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1833 p = ngx_pnalloc(r->pool, NGX_ATOMIC_T_LEN); |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1834 if (p == NULL) { |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1835 return NGX_ERROR; |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1836 } |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1837 |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1838 v->len = ngx_sprintf(p, "%uA", r->connection->number) - p; |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1839 v->valid = 1; |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1840 v->no_cacheable = 0; |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1841 v->not_found = 0; |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1842 v->data = p; |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1843 |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1844 return NGX_OK; |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1845 } |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1846 |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1847 |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1848 static ngx_int_t |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1849 ngx_http_variable_connection_requests(ngx_http_request_t *r, |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1850 ngx_http_variable_value_t *v, uintptr_t data) |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1851 { |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1852 u_char *p; |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1853 |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1854 p = ngx_pnalloc(r->pool, NGX_INT_T_LEN); |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1855 if (p == NULL) { |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1856 return NGX_ERROR; |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1857 } |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1858 |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1859 v->len = ngx_sprintf(p, "%ui", r->connection->requests) - p; |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1860 v->valid = 1; |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1861 v->no_cacheable = 0; |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1862 v->not_found = 0; |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1863 v->data = p; |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1864 |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1865 return NGX_OK; |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1866 } |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1867 |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1868 |
e89bd9896fea
Variables $connection and $connection_requests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4886
diff
changeset
|
1869 static ngx_int_t |
1329 | 1870 ngx_http_variable_nginx_version(ngx_http_request_t *r, |
1871 ngx_http_variable_value_t *v, uintptr_t data) | |
1872 { | |
1873 v->len = sizeof(NGINX_VERSION) - 1; | |
1874 v->valid = 1; | |
1565 | 1875 v->no_cacheable = 0; |
1329 | 1876 v->not_found = 0; |
1877 v->data = (u_char *) NGINX_VERSION; | |
1878 | |
1879 return NGX_OK; | |
1880 } | |
1881 | |
1882 | |
2011 | 1883 static ngx_int_t |
1884 ngx_http_variable_hostname(ngx_http_request_t *r, | |
1885 ngx_http_variable_value_t *v, uintptr_t data) | |
1886 { | |
1887 v->len = ngx_cycle->hostname.len; | |
1888 v->valid = 1; | |
1889 v->no_cacheable = 0; | |
1890 v->not_found = 0; | |
1891 v->data = ngx_cycle->hostname.data; | |
1892 | |
1893 return NGX_OK; | |
1894 } | |
1895 | |
1896 | |
2249 | 1897 static ngx_int_t |
1898 ngx_http_variable_pid(ngx_http_request_t *r, | |
1899 ngx_http_variable_value_t *v, uintptr_t data) | |
1900 { | |
1901 u_char *p; | |
1902 | |
1903 p = ngx_pnalloc(r->pool, NGX_INT64_LEN); | |
1904 if (p == NULL) { | |
1905 return NGX_ERROR; | |
1906 } | |
1907 | |
1908 v->len = ngx_sprintf(p, "%P", ngx_pid) - p; | |
1909 v->valid = 1; | |
1910 v->no_cacheable = 0; | |
1911 v->not_found = 0; | |
1912 v->data = p; | |
1913 | |
1914 return NGX_OK; | |
1915 } | |
1916 | |
1917 | |
3872
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1918 void * |
3929
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1919 ngx_http_map_find(ngx_http_request_t *r, ngx_http_map_t *map, ngx_str_t *match) |
3872
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1920 { |
3929
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1921 void *value; |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1922 u_char *low; |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1923 size_t len; |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1924 ngx_uint_t key; |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1925 |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1926 len = match->len; |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1927 |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1928 if (len) { |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1929 low = ngx_pnalloc(r->pool, len); |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1930 if (low == NULL) { |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1931 return NULL; |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1932 } |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1933 |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1934 } else { |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1935 low = NULL; |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1936 } |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1937 |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1938 key = ngx_hash_strlow(low, match->data, len); |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1939 |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1940 value = ngx_hash_find_combined(&map->hash, key, low, len); |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1941 if (value) { |
fa4612bfb9fa
change ngx_http_map_find(): use case sensitive regexes
Igor Sysoev <igor@sysoev.ru>
parents:
3872
diff
changeset
|
1942 return value; |
3872
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1943 } |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1944 |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1945 #if (NGX_PCRE) |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1946 |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1947 if (len && map->nregex) { |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1948 ngx_int_t n; |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1949 ngx_uint_t i; |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1950 ngx_http_map_regex_t *reg; |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1951 |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1952 reg = map->regex; |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1953 |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1954 for (i = 0; i < map->nregex; i++) { |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1955 |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1956 n = ngx_http_regex_exec(r, reg[i].regex, match); |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1957 |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1958 if (n == NGX_OK) { |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1959 return reg[i].value; |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1960 } |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1961 |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1962 if (n == NGX_DECLINED) { |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1963 continue; |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1964 } |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1965 |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1966 /* NGX_ERROR */ |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1967 |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1968 return NULL; |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1969 } |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1970 } |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1971 |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1972 #endif |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1973 |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1974 return NULL; |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1975 } |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1976 |
83cd1910329c
allow regex as "map" parameter
Igor Sysoev <igor@sysoev.ru>
parents:
3641
diff
changeset
|
1977 |
3356
fe08c14530e9
fix building without PCRE, the bug had been introduced in r3326
Igor Sysoev <igor@sysoev.ru>
parents:
3345
diff
changeset
|
1978 #if (NGX_PCRE) |
fe08c14530e9
fix building without PCRE, the bug had been introduced in r3326
Igor Sysoev <igor@sysoev.ru>
parents:
3345
diff
changeset
|
1979 |
3325 | 1980 static ngx_int_t |
1981 ngx_http_variable_not_found(ngx_http_request_t *r, ngx_http_variable_value_t *v, | |
1982 uintptr_t data) | |
1983 { | |
1984 v->not_found = 1; | |
1985 return NGX_OK; | |
1986 } | |
1987 | |
1988 | |
1989 ngx_http_regex_t * | |
1990 ngx_http_regex_compile(ngx_conf_t *cf, ngx_regex_compile_t *rc) | |
1991 { | |
1992 u_char *p; | |
1993 size_t size; | |
1994 ngx_str_t name; | |
1995 ngx_uint_t i, n; | |
1996 ngx_http_variable_t *v; | |
1997 ngx_http_regex_t *re; | |
1998 ngx_http_regex_variable_t *rv; | |
1999 ngx_http_core_main_conf_t *cmcf; | |
2000 | |
2001 rc->pool = cf->pool; | |
2002 | |
2003 if (ngx_regex_compile(rc) != NGX_OK) { | |
2004 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc->err); | |
2005 return NULL; | |
2006 } | |
2007 | |
2008 re = ngx_pcalloc(cf->pool, sizeof(ngx_http_regex_t)); | |
2009 if (re == NULL) { | |
2010 return NULL; | |
2011 } | |
2012 | |
2013 re->regex = rc->regex; | |
2014 re->ncaptures = rc->captures; | |
2015 | |
2016 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); | |
2017 cmcf->ncaptures = ngx_max(cmcf->ncaptures, re->ncaptures); | |
2018 | |
2019 n = (ngx_uint_t) rc->named_captures; | |
2020 | |
2021 if (n == 0) { | |
2022 return re; | |
2023 } | |
2024 | |
2025 rv = ngx_palloc(rc->pool, n * sizeof(ngx_http_regex_variable_t)); | |
2026 if (rv == NULL) { | |
2027 return NULL; | |
2028 } | |
2029 | |
2030 re->variables = rv; | |
2031 re->nvariables = n; | |
2032 re->name = rc->pattern; | |
2033 | |
2034 size = rc->name_size; | |
2035 p = rc->names; | |
2036 | |
2037 for (i = 0; i < n; i++) { | |
2038 rv[i].capture = 2 * ((p[0] << 8) + p[1]); | |
2039 | |
2040 name.data = &p[2]; | |
2041 name.len = ngx_strlen(name.data); | |
2042 | |
2043 v = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE); | |
2044 if (v == NULL) { | |
2045 return NULL; | |
2046 } | |
2047 | |
2048 rv[i].index = ngx_http_get_variable_index(cf, &name); | |
2049 if (rv[i].index == NGX_ERROR) { | |
2050 return NULL; | |
2051 } | |
2052 | |
2053 v->get_handler = ngx_http_variable_not_found; | |
2054 | |
3409
bb79608169eb
named captures worked for two names only
Igor Sysoev <igor@sysoev.ru>
parents:
3356
diff
changeset
|
2055 p += size; |
3325 | 2056 } |
2057 | |
2058 return re; | |
2059 } | |
2060 | |
2061 | |
2062 ngx_int_t | |
2063 ngx_http_regex_exec(ngx_http_request_t *r, ngx_http_regex_t *re, ngx_str_t *s) | |
2064 { | |
2065 ngx_int_t rc, index; | |
2066 ngx_uint_t i, n, len; | |
2067 ngx_http_variable_value_t *vv; | |
2068 ngx_http_core_main_conf_t *cmcf; | |
2069 | |
2070 cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); | |
2071 | |
2072 if (re->ncaptures) { | |
3345
d8228f0b5113
evaluate maximum captures size on configuration phase
Igor Sysoev <igor@sysoev.ru>
parents:
3344
diff
changeset
|
2073 len = cmcf->ncaptures; |
3325 | 2074 |
2075 if (r->captures == NULL) { | |
2076 r->captures = ngx_palloc(r->pool, len * sizeof(int)); | |
2077 if (r->captures == NULL) { | |
2078 return NGX_ERROR; | |
2079 } | |
2080 } | |
2081 | |
2082 } else { | |
2083 len = 0; | |
2084 } | |
2085 | |
2086 rc = ngx_regex_exec(re->regex, s, r->captures, len); | |
2087 | |
2088 if (rc == NGX_REGEX_NO_MATCHED) { | |
2089 return NGX_DECLINED; | |
2090 } | |
2091 | |
2092 if (rc < 0) { | |
2093 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, | |
2094 ngx_regex_exec_n " failed: %i on \"%V\" using \"%V\"", | |
2095 rc, s, &re->name); | |
2096 return NGX_ERROR; | |
2097 } | |
2098 | |
2099 for (i = 0; i < re->nvariables; i++) { | |
2100 | |
2101 n = re->variables[i].capture; | |
2102 index = re->variables[i].index; | |
2103 vv = &r->variables[index]; | |
2104 | |
2105 vv->len = r->captures[n + 1] - r->captures[n]; | |
2106 vv->valid = 1; | |
2107 vv->no_cacheable = 0; | |
2108 vv->not_found = 0; | |
2109 vv->data = &s->data[r->captures[n]]; | |
2110 | |
2111 #if (NGX_DEBUG) | |
2112 { | |
2113 ngx_http_variable_t *v; | |
2114 | |
2115 v = cmcf->variables.elts; | |
2116 | |
2117 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
2118 "http regex set $%V to \"%*s\"", | |
2119 &v[index].name, vv->len, vv->data); | |
2120 } | |
2121 #endif | |
2122 } | |
2123 | |
3344
1aed55182ea2
fix captures in "rewrite", the bug had been introduced in r3326
Igor Sysoev <igor@sysoev.ru>
parents:
3325
diff
changeset
|
2124 r->ncaptures = rc * 2; |
3325 | 2125 r->captures_data = s->data; |
2126 | |
2127 return NGX_OK; | |
2128 } | |
2129 | |
3356
fe08c14530e9
fix building without PCRE, the bug had been introduced in r3326
Igor Sysoev <igor@sysoev.ru>
parents:
3345
diff
changeset
|
2130 #endif |
fe08c14530e9
fix building without PCRE, the bug had been introduced in r3326
Igor Sysoev <igor@sysoev.ru>
parents:
3345
diff
changeset
|
2131 |
3325 | 2132 |
499 | 2133 ngx_int_t |
509 | 2134 ngx_http_variables_add_core_vars(ngx_conf_t *cf) |
499 | 2135 { |
611 | 2136 ngx_int_t rc; |
4641
045bb3ef3ffc
Fixed core variables dynamic access after reconfiguration.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4572
diff
changeset
|
2137 ngx_http_variable_t *cv, *v; |
501 | 2138 ngx_http_core_main_conf_t *cmcf; |
499 | 2139 |
509 | 2140 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); |
2141 | |
611 | 2142 cmcf->variables_keys = ngx_pcalloc(cf->temp_pool, |
2143 sizeof(ngx_hash_keys_arrays_t)); | |
2144 if (cmcf->variables_keys == NULL) { | |
2145 return NGX_ERROR; | |
2146 } | |
2147 | |
2148 cmcf->variables_keys->pool = cf->pool; | |
2149 cmcf->variables_keys->temp_pool = cf->pool; | |
2150 | |
2151 if (ngx_hash_keys_array_init(cmcf->variables_keys, NGX_HASH_SMALL) | |
2152 != NGX_OK) | |
509 | 2153 { |
499 | 2154 return NGX_ERROR; |
2155 } | |
2156 | |
4641
045bb3ef3ffc
Fixed core variables dynamic access after reconfiguration.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4572
diff
changeset
|
2157 for (cv = ngx_http_core_variables; cv->name.len; cv++) { |
045bb3ef3ffc
Fixed core variables dynamic access after reconfiguration.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4572
diff
changeset
|
2158 v = ngx_palloc(cf->pool, sizeof(ngx_http_variable_t)); |
045bb3ef3ffc
Fixed core variables dynamic access after reconfiguration.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4572
diff
changeset
|
2159 if (v == NULL) { |
045bb3ef3ffc
Fixed core variables dynamic access after reconfiguration.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4572
diff
changeset
|
2160 return NGX_ERROR; |
045bb3ef3ffc
Fixed core variables dynamic access after reconfiguration.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4572
diff
changeset
|
2161 } |
045bb3ef3ffc
Fixed core variables dynamic access after reconfiguration.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4572
diff
changeset
|
2162 |
045bb3ef3ffc
Fixed core variables dynamic access after reconfiguration.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4572
diff
changeset
|
2163 *v = *cv; |
045bb3ef3ffc
Fixed core variables dynamic access after reconfiguration.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4572
diff
changeset
|
2164 |
611 | 2165 rc = ngx_hash_add_key(cmcf->variables_keys, &v->name, v, |
2166 NGX_HASH_READONLY_KEY); | |
2167 | |
2168 if (rc == NGX_OK) { | |
2169 continue; | |
499 | 2170 } |
2171 | |
611 | 2172 if (rc == NGX_BUSY) { |
2173 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
2174 "conflicting variable name \"%V\"", &v->name); | |
2175 } | |
2176 | |
2177 return NGX_ERROR; | |
499 | 2178 } |
2179 | |
2180 return NGX_OK; | |
2181 } | |
509 | 2182 |
2183 | |
2184 ngx_int_t | |
2185 ngx_http_variables_init_vars(ngx_conf_t *cf) | |
2186 { | |
2187 ngx_uint_t i, n; | |
611 | 2188 ngx_hash_key_t *key; |
2189 ngx_hash_init_t hash; | |
509 | 2190 ngx_http_variable_t *v, *av; |
2191 ngx_http_core_main_conf_t *cmcf; | |
2192 | |
2193 /* set the handlers for the indexed http variables */ | |
2194 | |
2195 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); | |
2196 | |
2197 v = cmcf->variables.elts; | |
611 | 2198 key = cmcf->variables_keys->keys.elts; |
509 | 2199 |
2200 for (i = 0; i < cmcf->variables.nelts; i++) { | |
2201 | |
611 | 2202 for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) { |
509 | 2203 |
1191
0eb2dc4fdea8
fix segfault introduced in r1190
Igor Sysoev <igor@sysoev.ru>
parents:
1173
diff
changeset
|
2204 av = key[n].value; |
0eb2dc4fdea8
fix segfault introduced in r1190
Igor Sysoev <igor@sysoev.ru>
parents:
1173
diff
changeset
|
2205 |
0eb2dc4fdea8
fix segfault introduced in r1190
Igor Sysoev <igor@sysoev.ru>
parents:
1173
diff
changeset
|
2206 if (av->get_handler |
0eb2dc4fdea8
fix segfault introduced in r1190
Igor Sysoev <igor@sysoev.ru>
parents:
1173
diff
changeset
|
2207 && v[i].name.len == key[n].key.len |
611 | 2208 && ngx_strncmp(v[i].name.data, key[n].key.data, v[i].name.len) |
509 | 2209 == 0) |
2210 { | |
637 | 2211 v[i].get_handler = av->get_handler; |
611 | 2212 v[i].data = av->data; |
527 | 2213 |
611 | 2214 av->flags |= NGX_HTTP_VAR_INDEXED; |
2215 v[i].flags = av->flags; | |
509 | 2216 |
611 | 2217 av->index = i; |
533 | 2218 |
509 | 2219 goto next; |
2220 } | |
2221 } | |
2222 | |
2223 if (ngx_strncmp(v[i].name.data, "http_", 5) == 0) { | |
637 | 2224 v[i].get_handler = ngx_http_variable_unknown_header_in; |
577 | 2225 v[i].data = (uintptr_t) &v[i].name; |
2226 | |
2227 continue; | |
2228 } | |
2229 | |
2230 if (ngx_strncmp(v[i].name.data, "sent_http_", 10) == 0) { | |
637 | 2231 v[i].get_handler = ngx_http_variable_unknown_header_out; |
509 | 2232 v[i].data = (uintptr_t) &v[i].name; |
2233 | |
2234 continue; | |
2235 } | |
2236 | |
1162 | 2237 if (ngx_strncmp(v[i].name.data, "upstream_http_", 14) == 0) { |
2238 v[i].get_handler = ngx_http_upstream_header_variable; | |
2239 v[i].data = (uintptr_t) &v[i].name; | |
1565 | 2240 v[i].flags = NGX_HTTP_VAR_NOCACHEABLE; |
1162 | 2241 |
2242 continue; | |
2243 } | |
2244 | |
2307 | 2245 if (ngx_strncmp(v[i].name.data, "cookie_", 7) == 0) { |
2246 v[i].get_handler = ngx_http_variable_cookie; | |
2247 v[i].data = (uintptr_t) &v[i].name; | |
2248 | |
2249 continue; | |
2250 } | |
2251 | |
2137 | 2252 if (ngx_strncmp(v[i].name.data, "arg_", 4) == 0) { |
2253 v[i].get_handler = ngx_http_variable_argument; | |
2254 v[i].data = (uintptr_t) &v[i].name; | |
3499
b4a14d50388b
make $arg_ variables non-cacheable
Igor Sysoev <igor@sysoev.ru>
parents:
3463
diff
changeset
|
2255 v[i].flags = NGX_HTTP_VAR_NOCACHEABLE; |
2137 | 2256 |
2257 continue; | |
2258 } | |
2259 | |
509 | 2260 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, |
2261 "unknown \"%V\" variable", &v[i].name); | |
2262 | |
2263 return NGX_ERROR; | |
2264 | |
2265 next: | |
2266 continue; | |
2267 } | |
2268 | |
2269 | |
611 | 2270 for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) { |
2271 av = key[n].value; | |
2272 | |
2273 if (av->flags & NGX_HTTP_VAR_NOHASH) { | |
2274 key[n].key.data = NULL; | |
583 | 2275 } |
2276 } | |
2277 | |
2278 | |
611 | 2279 hash.hash = &cmcf->variables_hash; |
2280 hash.key = ngx_hash_key; | |
2281 hash.max_size = cmcf->variables_hash_max_size; | |
2282 hash.bucket_size = cmcf->variables_hash_bucket_size; | |
2283 hash.name = "variables_hash"; | |
2284 hash.pool = cf->pool; | |
2285 hash.temp_pool = NULL; | |
509 | 2286 |
611 | 2287 if (ngx_hash_init(&hash, cmcf->variables_keys->keys.elts, |
2288 cmcf->variables_keys->keys.nelts) | |
581 | 2289 != NGX_OK) |
509 | 2290 { |
2291 return NGX_ERROR; | |
2292 } | |
2293 | |
611 | 2294 cmcf->variables_keys = NULL; |
509 | 2295 |
2296 return NGX_OK; | |
2297 } |