This commit is contained in:
Minwoo 'Charlie' Choi 2026-02-03 13:39:15 -08:00 committed by GitHub
commit 7f11c3b0a9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -42,6 +42,8 @@ static ngx_int_t ngx_http_variable_cookie(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_argument_unescape(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data);
#if (NGX_HAVE_TCP_INFO)
static ngx_int_t ngx_http_variable_tcpinfo(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data);
@ -79,6 +81,8 @@ static void ngx_http_variable_set_args(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_uargs(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,
ngx_http_variable_value_t *v, uintptr_t data);
static ngx_int_t ngx_http_variable_realpath_root(ngx_http_request_t *r,
@ -270,6 +274,9 @@ static ngx_http_variable_t ngx_http_core_variables[] = {
offsetof(ngx_http_request_t, args),
NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 },
{ ngx_string("uargs"), NULL, ngx_http_variable_uargs,
0, NGX_HTTP_VAR_NOCACHEABLE, 0 },
{ ngx_string("is_args"), NULL, ngx_http_variable_is_args,
0, NGX_HTTP_VAR_NOCACHEABLE, 0 },
@ -408,6 +415,9 @@ static ngx_http_variable_t ngx_http_core_variables[] = {
{ ngx_string("arg_"), NULL, ngx_http_variable_argument,
0, NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_PREFIX, 0 },
{ ngx_string("uarg_"), NULL, ngx_http_variable_argument_unescape,
0, NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_PREFIX, 0 },
ngx_http_null_variable
};
@ -1133,6 +1143,44 @@ ngx_http_variable_argument(ngx_http_request_t *r, ngx_http_variable_value_t *v,
}
static ngx_int_t
ngx_http_variable_argument_unescape(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data)
{
ngx_str_t *name = (ngx_str_t *) data;
u_char *arg, *dst, *src;
size_t len;
ngx_str_t value;
len = name->len - (sizeof("uarg_") - 1);
arg = name->data + sizeof("uarg_") - 1;
if (len == 0 || ngx_http_arg(r, arg, len, &value) != NGX_OK) {
v->not_found = 1;
return NGX_OK;
}
/* allocate buffer for unescaped value (can only shrink or stay same) */
dst = ngx_pnalloc(r->pool, value.len);
if (dst == NULL) {
return NGX_ERROR;
}
v->data = dst;
src = value.data;
ngx_unescape_uri(&dst, &src, value.len, 0);
v->len = dst - v->data;
v->valid = 1;
v->no_cacheable = 0;
v->not_found = 0;
return NGX_OK;
}
#if (NGX_HAVE_TCP_INFO)
static ngx_int_t
@ -1624,6 +1672,37 @@ ngx_http_variable_is_args(ngx_http_request_t *r,
}
static ngx_int_t
ngx_http_variable_uargs(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data)
{
u_char *dst, *src;
if (r->args.len == 0) {
*v = ngx_http_variable_null_value;
return NGX_OK;
}
/* allocate buffer for unescaped value (can only shrink or stay same) */
dst = ngx_pnalloc(r->pool, r->args.len);
if (dst == NULL) {
return NGX_ERROR;
}
v->data = dst;
src = r->args.data;
ngx_unescape_uri(&dst, &src, r->args.len, 0);
v->len = dst - v->data;
v->valid = 1;
v->no_cacheable = 0;
v->not_found = 0;
return NGX_OK;
}
static ngx_int_t
ngx_http_variable_document_root(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data)