summaryrefslogtreecommitdiff
path: root/src/http/ngx_http_variables.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2011-12-12 15:04:54 +0000
committerJonathan Kolb <jon@b0g.us>2011-12-12 15:04:54 +0000
commitf3f84820db369aade03ed922872e206760e0ce0f (patch)
tree2e2010e8de0d85c2c291b7bdc3caca6f808f72c4 /src/http/ngx_http_variables.c
parent56831c260fdbd5d130c692d0d4dc8918a462f4bb (diff)
downloadnginx-f3f84820db369aade03ed922872e206760e0ce0f.tar.gz
Changes with nginx 1.1.11 12 Dec 2011v1.1.11
*) Feature: the "so_keepalive" parameter of the "listen" directive. Thanks to Vsevolod Stakhov. *) Feature: the "if_not_empty" parameter of the "fastcgi/scgi/uwsgi_param" directives. *) Feature: the $https variable. *) Feature: the "proxy_redirect" directive supports variables in the first parameter. *) Feature: the "proxy_redirect" directive supports regular expressions. *) Bugfix: the $sent_http_cache_control variable might contain a wrong value if the "expires" directive was used. Thanks to Yichun Zhang. *) Bugfix: the "read_ahead" directive might not work combined with "try_files" and "open_file_cache". *) Bugfix: a segmentation fault might occur in a worker process if small time was used in the "inactive" parameter of the "proxy_cache_path" directive. *) Bugfix: responses from cache might hang. Maxim Dounin _______________________________________________ nginx-announce mailing list nginx-announce@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-announce
Diffstat (limited to 'src/http/ngx_http_variables.c')
-rw-r--r--src/http/ngx_http_variables.c69
1 files changed, 57 insertions, 12 deletions
diff --git a/src/http/ngx_http_variables.c b/src/http/ngx_http_variables.c
index 4afd88405..840519ef9 100644
--- a/src/http/ngx_http_variables.c
+++ b/src/http/ngx_http_variables.c
@@ -48,6 +48,8 @@ static ngx_int_t ngx_http_variable_server_port(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data);
static ngx_int_t ngx_http_variable_scheme(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data);
+static ngx_int_t ngx_http_variable_https(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data);
static ngx_int_t ngx_http_variable_is_args(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data);
static ngx_int_t ngx_http_variable_document_root(ngx_http_request_t *r,
@@ -157,6 +159,8 @@ static ngx_http_variable_t ngx_http_core_variables[] = {
{ ngx_string("scheme"), NULL, ngx_http_variable_scheme, 0, 0, 0 },
+ { ngx_string("https"), NULL, ngx_http_variable_https, 0, 0, 0 },
+
{ ngx_string("request_uri"), NULL, ngx_http_variable_request,
offsetof(ngx_http_request_t, unparsed_uri), 0, 0 },
@@ -640,8 +644,8 @@ static ngx_int_t
ngx_http_variable_headers(ngx_http_request_t *r, ngx_http_variable_value_t *v,
uintptr_t data)
{
- ssize_t len;
- u_char *p;
+ size_t len;
+ u_char *p, *end;
ngx_uint_t i, n;
ngx_array_t *a;
ngx_table_elt_t **h;
@@ -649,18 +653,30 @@ ngx_http_variable_headers(ngx_http_request_t *r, ngx_http_variable_value_t *v,
a = (ngx_array_t *) ((char *) r + data);
n = a->nelts;
+ h = a->elts;
- if (n == 0) {
+ len = 0;
+
+ for (i = 0; i < n; i++) {
+
+ if (h[i]->hash == 0) {
+ continue;
+ }
+
+ len += h[i]->value.len + sizeof("; ") - 1;
+ }
+
+ if (len == 0) {
v->not_found = 1;
return NGX_OK;
}
+ len -= sizeof("; ") - 1;
+
v->valid = 1;
v->no_cacheable = 0;
v->not_found = 0;
- h = a->elts;
-
if (n == 1) {
v->len = (*h)->value.len;
v->data = (*h)->value.data;
@@ -668,12 +684,6 @@ ngx_http_variable_headers(ngx_http_request_t *r, ngx_http_variable_value_t *v,
return NGX_OK;
}
- len = - (ssize_t) (sizeof("; ") - 1);
-
- for (i = 0; i < n; i++) {
- len += h[i]->value.len + sizeof("; ") - 1;
- }
-
p = ngx_pnalloc(r->pool, len);
if (p == NULL) {
return NGX_ERROR;
@@ -682,10 +692,17 @@ ngx_http_variable_headers(ngx_http_request_t *r, ngx_http_variable_value_t *v,
v->len = len;
v->data = p;
+ end = p + len;
+
for (i = 0; /* void */ ; i++) {
+
+ if (h[i]->hash == 0) {
+ continue;
+ }
+
p = ngx_copy(p, h[i]->value.data, h[i]->value.len);
- if (i == n - 1) {
+ if (p == end) {
break;
}
@@ -738,6 +755,10 @@ ngx_http_variable_unknown_header(ngx_http_variable_value_t *v, ngx_str_t *var,
i = 0;
}
+ if (header[i].hash == 0) {
+ continue;
+ }
+
for (n = 0; n + prefix < var->len && n < header[i].key.len; n++) {
ch = header[i].key.data[n];
@@ -1091,6 +1112,30 @@ ngx_http_variable_scheme(ngx_http_request_t *r,
static ngx_int_t
+ngx_http_variable_https(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data)
+{
+#if (NGX_HTTP_SSL)
+
+ if (r->connection->ssl) {
+ v->len = sizeof("on") - 1;
+ v->valid = 1;
+ v->no_cacheable = 0;
+ v->not_found = 0;
+ v->data = (u_char *) "on";
+
+ return NGX_OK;
+ }
+
+#endif
+
+ *v = ngx_http_variable_null_value;
+
+ return NGX_OK;
+}
+
+
+static ngx_int_t
ngx_http_variable_is_args(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data)
{