Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nginx/nginx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2008-08-04 15:10:52 +0400
committerIgor Sysoev <igor@sysoev.ru>2008-08-04 15:10:52 +0400
commit42511c05c76b8434aae7a33c26516f7368c3c479 (patch)
treeb09bfa0cd3803e71c3e30dfeaf04fd8908aa5845 /src
parent6a07833d478a9b969dfa8a66041fc8537ee2b8d1 (diff)
$arg_... variable
Diffstat (limited to 'src')
-rw-r--r--src/http/ngx_http_request.c1
-rw-r--r--src/http/ngx_http_variables.c74
2 files changed, 75 insertions, 0 deletions
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
index 2a0ed7a44..61a41d4b2 100644
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -647,6 +647,7 @@ ngx_http_process_request_line(ngx_event_t *rev)
r->request_line.len = r->request_end - r->request_start;
r->request_line.data = r->request_start;
+ *r->request_end = '\0';
if (r->args_start) {
diff --git a/src/http/ngx_http_variables.c b/src/http/ngx_http_variables.c
index b41572202..cd706a2a9 100644
--- a/src/http/ngx_http_variables.c
+++ b/src/http/ngx_http_variables.c
@@ -26,6 +26,8 @@ static ngx_int_t ngx_http_variable_unknown_header_in(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data);
static ngx_int_t ngx_http_variable_unknown_header_out(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data);
+static ngx_int_t ngx_http_variable_argument(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data);
static ngx_int_t ngx_http_variable_host(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data);
@@ -477,6 +479,15 @@ ngx_http_get_variable(ngx_http_request_t *r, ngx_str_t *name, ngx_uint_t key,
return NULL;
}
+ if (ngx_strncmp(name->data, "arg_", 4) == 0) {
+
+ if (ngx_http_variable_argument(r, vv, (uintptr_t) name) == NGX_OK) {
+ return vv;
+ }
+
+ return NULL;
+ }
+
vv->not_found = 1;
if (nowarn == 0) {
@@ -708,6 +719,62 @@ ngx_http_variable_unknown_header(ngx_http_variable_value_t *v, ngx_str_t *var,
static ngx_int_t
+ngx_http_variable_argument(ngx_http_request_t *r, ngx_http_variable_value_t *v,
+ uintptr_t data)
+{
+ ngx_str_t *name = (ngx_str_t *) data;
+
+ u_char *p, *arg;
+ size_t len;
+
+ if (r->args.len == 0) {
+ v->not_found = 1;
+ return NGX_OK;
+ }
+
+ len = name->len - 1 - (sizeof("arg_") - 1);
+ arg = name->data + sizeof("arg_") - 1;
+
+ for (p = r->args.data; *p && *p != ' '; p++) {
+
+ /*
+ * although r->args.data is not null-terminated by itself,
+ * however, there is null in the end of request line
+ */
+
+ p = ngx_strcasestrn(p, (char *) arg, len);
+
+ if (p == NULL) {
+ v->not_found = 1;
+ return NGX_OK;
+ }
+
+ if ((p == r->args.data || *(p - 1) == '&') && *(p + len + 1) == '=') {
+
+ v->data = p + len + 2;
+
+ p = (u_char *) ngx_strchr(p, '&');
+
+ if (p == NULL) {
+ p = r->args.data + r->args.len;
+ }
+
+ v->len = p - v->data;
+ v->valid = 1;
+ v->no_cacheable = 0;
+ v->not_found = 0;
+
+ return NGX_OK;
+ }
+ }
+
+ v->not_found = 1;
+
+ return NGX_OK;
+}
+
+
+static ngx_int_t
ngx_http_variable_host(ngx_http_request_t *r, ngx_http_variable_value_t *v,
uintptr_t data)
{
@@ -1392,6 +1459,13 @@ ngx_http_variables_init_vars(ngx_conf_t *cf)
continue;
}
+ if (ngx_strncmp(v[i].name.data, "arg_", 4) == 0) {
+ v[i].get_handler = ngx_http_variable_argument;
+ v[i].data = (uintptr_t) &v[i].name;
+
+ continue;
+ }
+
ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
"unknown \"%V\" variable", &v[i].name);