Var: dynamic variables support.
This commit adds the variables $arg_NAME, $header_NAME, and $cookie_NAME.
This commit is contained in:
@@ -8,29 +8,47 @@
|
||||
|
||||
|
||||
static nxt_int_t nxt_http_var_method(nxt_task_t *task, nxt_str_t *str,
|
||||
void *ctx);
|
||||
void *ctx, uint16_t field);
|
||||
static nxt_int_t nxt_http_var_request_uri(nxt_task_t *task, nxt_str_t *str,
|
||||
void *ctx);
|
||||
static nxt_int_t nxt_http_var_uri(nxt_task_t *task, nxt_str_t *str, void *ctx);
|
||||
static nxt_int_t nxt_http_var_host(nxt_task_t *task, nxt_str_t *str, void *ctx);
|
||||
void *ctx, uint16_t field);
|
||||
static nxt_int_t nxt_http_var_uri(nxt_task_t *task, nxt_str_t *str, void *ctx,
|
||||
uint16_t field);
|
||||
static nxt_int_t nxt_http_var_host(nxt_task_t *task, nxt_str_t *str, void *ctx,
|
||||
uint16_t field);
|
||||
static nxt_int_t nxt_http_var_arg(nxt_task_t *task, nxt_str_t *str, void *ctx,
|
||||
uint16_t field);
|
||||
static nxt_int_t nxt_http_var_header(nxt_task_t *task, nxt_str_t *str,
|
||||
void *ctx, uint16_t field);
|
||||
static nxt_int_t nxt_http_var_cookie(nxt_task_t *task, nxt_str_t *str,
|
||||
void *ctx, uint16_t field);
|
||||
|
||||
|
||||
static nxt_var_decl_t nxt_http_vars[] = {
|
||||
{ nxt_string("method"),
|
||||
&nxt_http_var_method,
|
||||
0 },
|
||||
|
||||
{ nxt_string("request_uri"),
|
||||
&nxt_http_var_request_uri,
|
||||
0 },
|
||||
|
||||
{ nxt_string("uri"),
|
||||
&nxt_http_var_uri,
|
||||
0 },
|
||||
|
||||
{ nxt_string("host"),
|
||||
&nxt_http_var_host,
|
||||
0 },
|
||||
{
|
||||
.name = nxt_string("method"),
|
||||
.handler = nxt_http_var_method,
|
||||
}, {
|
||||
.name = nxt_string("request_uri"),
|
||||
.handler = nxt_http_var_request_uri,
|
||||
}, {
|
||||
.name = nxt_string("uri"),
|
||||
.handler = nxt_http_var_uri,
|
||||
}, {
|
||||
.name = nxt_string("host"),
|
||||
.handler = nxt_http_var_host,
|
||||
}, {
|
||||
.name = nxt_string("arg"),
|
||||
.handler = nxt_http_var_arg,
|
||||
.field_hash = nxt_http_argument_hash,
|
||||
}, {
|
||||
.name = nxt_string("header"),
|
||||
.handler = nxt_http_var_header,
|
||||
.field_hash = nxt_http_header_hash,
|
||||
}, {
|
||||
.name = nxt_string("cookie"),
|
||||
.handler = nxt_http_var_cookie,
|
||||
.field_hash = nxt_http_cookie_hash,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -42,7 +60,7 @@ nxt_http_register_variables(void)
|
||||
|
||||
|
||||
static nxt_int_t
|
||||
nxt_http_var_method(nxt_task_t *task, nxt_str_t *str, void *ctx)
|
||||
nxt_http_var_method(nxt_task_t *task, nxt_str_t *str, void *ctx, uint16_t field)
|
||||
{
|
||||
nxt_http_request_t *r;
|
||||
|
||||
@@ -55,7 +73,8 @@ nxt_http_var_method(nxt_task_t *task, nxt_str_t *str, void *ctx)
|
||||
|
||||
|
||||
static nxt_int_t
|
||||
nxt_http_var_request_uri(nxt_task_t *task, nxt_str_t *str, void *ctx)
|
||||
nxt_http_var_request_uri(nxt_task_t *task, nxt_str_t *str, void *ctx,
|
||||
uint16_t field)
|
||||
{
|
||||
nxt_http_request_t *r;
|
||||
|
||||
@@ -68,7 +87,7 @@ nxt_http_var_request_uri(nxt_task_t *task, nxt_str_t *str, void *ctx)
|
||||
|
||||
|
||||
static nxt_int_t
|
||||
nxt_http_var_uri(nxt_task_t *task, nxt_str_t *str, void *ctx)
|
||||
nxt_http_var_uri(nxt_task_t *task, nxt_str_t *str, void *ctx, uint16_t field)
|
||||
{
|
||||
nxt_http_request_t *r;
|
||||
|
||||
@@ -81,7 +100,7 @@ nxt_http_var_uri(nxt_task_t *task, nxt_str_t *str, void *ctx)
|
||||
|
||||
|
||||
static nxt_int_t
|
||||
nxt_http_var_host(nxt_task_t *task, nxt_str_t *str, void *ctx)
|
||||
nxt_http_var_host(nxt_task_t *task, nxt_str_t *str, void *ctx, uint16_t field)
|
||||
{
|
||||
nxt_http_request_t *r;
|
||||
|
||||
@@ -91,3 +110,125 @@ nxt_http_var_host(nxt_task_t *task, nxt_str_t *str, void *ctx)
|
||||
|
||||
return NXT_OK;
|
||||
}
|
||||
|
||||
|
||||
static nxt_int_t
|
||||
nxt_http_var_arg(nxt_task_t *task, nxt_str_t *str, void *ctx, uint16_t field)
|
||||
{
|
||||
nxt_array_t *args;
|
||||
nxt_var_field_t *vf;
|
||||
nxt_router_conf_t *rtcf;
|
||||
nxt_http_request_t *r;
|
||||
nxt_http_name_value_t *nv, *start;
|
||||
|
||||
r = ctx;
|
||||
|
||||
rtcf = r->conf->socket_conf->router_conf;
|
||||
|
||||
vf = nxt_var_field_get(rtcf->var_fields, field);
|
||||
|
||||
args = nxt_http_arguments_parse(r);
|
||||
if (nxt_slow_path(args == NULL)) {
|
||||
return NXT_ERROR;
|
||||
}
|
||||
|
||||
start = args->elts;
|
||||
nv = start + args->nelts - 1;
|
||||
|
||||
while (nv >= start) {
|
||||
|
||||
if (vf->hash == nv->hash
|
||||
&& vf->name.length == nv->name_length
|
||||
&& nxt_memcmp(vf->name.start, nv->name, nv->name_length) == 0)
|
||||
{
|
||||
str->start = nv->value;
|
||||
str->length = nv->value_length;
|
||||
|
||||
return NXT_OK;
|
||||
}
|
||||
|
||||
nv--;
|
||||
}
|
||||
|
||||
nxt_str_null(str);
|
||||
|
||||
return NXT_OK;
|
||||
}
|
||||
|
||||
|
||||
static nxt_int_t
|
||||
nxt_http_var_header(nxt_task_t *task, nxt_str_t *str, void *ctx, uint16_t field)
|
||||
{
|
||||
nxt_var_field_t *vf;
|
||||
nxt_http_field_t *f;
|
||||
nxt_router_conf_t *rtcf;
|
||||
nxt_http_request_t *r;
|
||||
|
||||
r = ctx;
|
||||
|
||||
rtcf = r->conf->socket_conf->router_conf;
|
||||
|
||||
vf = nxt_var_field_get(rtcf->var_fields, field);
|
||||
|
||||
nxt_list_each(f, r->fields) {
|
||||
|
||||
if (vf->hash == f->hash
|
||||
&& vf->name.length == f->name_length
|
||||
&& nxt_strncasecmp(vf->name.start, f->name, f->name_length) == 0)
|
||||
{
|
||||
str->start = f->value;
|
||||
str->length = f->value_length;
|
||||
|
||||
return NXT_OK;
|
||||
}
|
||||
|
||||
} nxt_list_loop;
|
||||
|
||||
nxt_str_null(str);
|
||||
|
||||
return NXT_OK;
|
||||
}
|
||||
|
||||
|
||||
static nxt_int_t
|
||||
nxt_http_var_cookie(nxt_task_t *task, nxt_str_t *str, void *ctx, uint16_t field)
|
||||
{
|
||||
nxt_array_t *cookies;
|
||||
nxt_var_field_t *vf;
|
||||
nxt_router_conf_t *rtcf;
|
||||
nxt_http_request_t *r;
|
||||
nxt_http_name_value_t *nv, *end;
|
||||
|
||||
r = ctx;
|
||||
|
||||
rtcf = r->conf->socket_conf->router_conf;
|
||||
|
||||
vf = nxt_var_field_get(rtcf->var_fields, field);
|
||||
|
||||
cookies = nxt_http_cookies_parse(r);
|
||||
if (nxt_slow_path(cookies == NULL)) {
|
||||
return NXT_ERROR;
|
||||
}
|
||||
|
||||
nv = cookies->elts;
|
||||
end = nv + cookies->nelts;
|
||||
|
||||
while (nv < end) {
|
||||
|
||||
if (vf->hash == nv->hash
|
||||
&& vf->name.length == nv->name_length
|
||||
&& nxt_memcmp(vf->name.start, nv->name, nv->name_length) == 0)
|
||||
{
|
||||
str->start = nv->value;
|
||||
str->length = nv->value_length;
|
||||
|
||||
return NXT_OK;
|
||||
}
|
||||
|
||||
nv++;
|
||||
}
|
||||
|
||||
nxt_str_null(str);
|
||||
|
||||
return NXT_OK;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user