NJS: added the keys API for the request objects.
This commit is to loop through the request objects headers, arguments, and cookies.
This commit is contained in:
@@ -32,6 +32,12 @@ NGINX Unit updated to 1.30.0.
|
|||||||
date="" time=""
|
date="" time=""
|
||||||
packager="Nginx Packaging <nginx-packaging@f5.com>">
|
packager="Nginx Packaging <nginx-packaging@f5.com>">
|
||||||
|
|
||||||
|
<change type="feature">
|
||||||
|
<para>
|
||||||
|
support the keys API on the request objects in NJS.
|
||||||
|
</para>
|
||||||
|
</change>
|
||||||
|
|
||||||
</changes>
|
</changes>
|
||||||
|
|
||||||
<changes apply="unit-php
|
<changes apply="unit-php
|
||||||
|
|||||||
@@ -15,15 +15,19 @@ static njs_int_t nxt_http_js_ext_host(njs_vm_t *vm, njs_object_prop_t *prop,
|
|||||||
static njs_int_t nxt_http_js_ext_remote_addr(njs_vm_t *vm,
|
static njs_int_t nxt_http_js_ext_remote_addr(njs_vm_t *vm,
|
||||||
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
|
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
|
||||||
njs_value_t *retval);
|
njs_value_t *retval);
|
||||||
static njs_int_t nxt_http_js_ext_get_arg(njs_vm_t *vm,
|
static njs_int_t nxt_http_js_ext_get_args(njs_vm_t *vm,
|
||||||
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
|
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
|
||||||
njs_value_t *retval);
|
njs_value_t *retval);
|
||||||
static njs_int_t nxt_http_js_ext_get_header(njs_vm_t *vm,
|
static njs_int_t nxt_http_js_ext_get_header(njs_vm_t *vm,
|
||||||
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
|
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
|
||||||
njs_value_t *retval);
|
njs_value_t *retval);
|
||||||
|
static njs_int_t nxt_http_js_ext_keys_header(njs_vm_t *vm,
|
||||||
|
njs_value_t *value, njs_value_t *keys);
|
||||||
static njs_int_t nxt_http_js_ext_get_cookie(njs_vm_t *vm,
|
static njs_int_t nxt_http_js_ext_get_cookie(njs_vm_t *vm,
|
||||||
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
|
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
|
||||||
njs_value_t *retval);
|
njs_value_t *retval);
|
||||||
|
static njs_int_t nxt_http_js_ext_keys_cookie(njs_vm_t *vm, njs_value_t *value,
|
||||||
|
njs_value_t *keys);
|
||||||
|
|
||||||
|
|
||||||
static njs_external_t nxt_http_js_proto[] = {
|
static njs_external_t nxt_http_js_proto[] = {
|
||||||
@@ -55,12 +59,11 @@ static njs_external_t nxt_http_js_proto[] = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
.flags = NJS_EXTERN_OBJECT,
|
.flags = NJS_EXTERN_PROPERTY,
|
||||||
.name.string = njs_str("args"),
|
.name.string = njs_str("args"),
|
||||||
.enumerable = 1,
|
.enumerable = 1,
|
||||||
.u.object = {
|
.u.property = {
|
||||||
.enumerable = 1,
|
.handler = nxt_http_js_ext_get_args,
|
||||||
.prop_handler = nxt_http_js_ext_get_arg,
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -71,6 +74,7 @@ static njs_external_t nxt_http_js_proto[] = {
|
|||||||
.u.object = {
|
.u.object = {
|
||||||
.enumerable = 1,
|
.enumerable = 1,
|
||||||
.prop_handler = nxt_http_js_ext_get_header,
|
.prop_handler = nxt_http_js_ext_get_header,
|
||||||
|
.keys = nxt_http_js_ext_keys_header,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -81,6 +85,7 @@ static njs_external_t nxt_http_js_proto[] = {
|
|||||||
.u.object = {
|
.u.object = {
|
||||||
.enumerable = 1,
|
.enumerable = 1,
|
||||||
.prop_handler = nxt_http_js_ext_get_cookie,
|
.prop_handler = nxt_http_js_ext_get_cookie,
|
||||||
|
.keys = nxt_http_js_ext_keys_cookie,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -144,14 +149,13 @@ nxt_http_js_ext_remote_addr(njs_vm_t *vm, njs_object_prop_t *prop,
|
|||||||
|
|
||||||
|
|
||||||
static njs_int_t
|
static njs_int_t
|
||||||
nxt_http_js_ext_get_arg(njs_vm_t *vm, njs_object_prop_t *prop,
|
nxt_http_js_ext_get_args(njs_vm_t *vm, njs_object_prop_t *prop,
|
||||||
njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
|
njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
|
||||||
{
|
{
|
||||||
njs_int_t rc;
|
njs_int_t ret;
|
||||||
njs_str_t key;
|
njs_value_t *args;
|
||||||
nxt_array_t *args;
|
njs_opaque_value_t val;
|
||||||
nxt_http_request_t *r;
|
nxt_http_request_t *r;
|
||||||
nxt_http_name_value_t *nv, *start, *end;
|
|
||||||
|
|
||||||
r = njs_vm_external(vm, nxt_js_proto_id, value);
|
r = njs_vm_external(vm, nxt_js_proto_id, value);
|
||||||
if (r == NULL) {
|
if (r == NULL) {
|
||||||
@@ -159,33 +163,18 @@ nxt_http_js_ext_get_arg(njs_vm_t *vm, njs_object_prop_t *prop,
|
|||||||
return NJS_DECLINED;
|
return NJS_DECLINED;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = njs_vm_prop_name(vm, prop, &key);
|
args = njs_value_arg(&val);
|
||||||
if (rc != NJS_OK) {
|
|
||||||
njs_value_undefined_set(retval);
|
|
||||||
return NJS_DECLINED;
|
|
||||||
}
|
|
||||||
|
|
||||||
args = nxt_http_arguments_parse(r);
|
ret = njs_vm_query_string_parse(vm, r->args->start,
|
||||||
if (nxt_slow_path(args == NULL)) {
|
r->args->start + r->args->length, args);
|
||||||
|
|
||||||
|
if (ret == NJS_ERROR) {
|
||||||
return NJS_ERROR;
|
return NJS_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
start = args->elts;
|
njs_value_assign(retval, args);
|
||||||
end = start + args->nelts;
|
|
||||||
|
|
||||||
for (nv = start; nv < end; nv++) {
|
return NJS_OK;
|
||||||
|
|
||||||
if (key.length == nv->name_length
|
|
||||||
&& memcmp(key.start, nv->name, nv->name_length) == 0)
|
|
||||||
{
|
|
||||||
return njs_vm_value_string_set(vm, retval, nv->value,
|
|
||||||
nv->value_length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
njs_value_undefined_set(retval);
|
|
||||||
|
|
||||||
return NJS_DECLINED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -227,6 +216,41 @@ nxt_http_js_ext_get_header(njs_vm_t *vm, njs_object_prop_t *prop,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static njs_int_t
|
||||||
|
nxt_http_js_ext_keys_header(njs_vm_t *vm, njs_value_t *value, njs_value_t *keys)
|
||||||
|
{
|
||||||
|
njs_int_t rc;
|
||||||
|
nxt_http_field_t *f;
|
||||||
|
nxt_http_request_t *r;
|
||||||
|
|
||||||
|
rc = njs_vm_array_alloc(vm, keys, 4);
|
||||||
|
if (rc != NJS_OK) {
|
||||||
|
return NJS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = njs_vm_external(vm, nxt_js_proto_id, value);
|
||||||
|
if (r == NULL) {
|
||||||
|
return NJS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nxt_list_each(f, r->fields) {
|
||||||
|
|
||||||
|
value = njs_vm_array_push(vm, keys);
|
||||||
|
if (value == NULL) {
|
||||||
|
return NJS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = njs_vm_value_string_set(vm, value, f->name, f->name_length);
|
||||||
|
if (rc != NJS_OK) {
|
||||||
|
return NJS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
} nxt_list_loop;
|
||||||
|
|
||||||
|
return NJS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static njs_int_t
|
static njs_int_t
|
||||||
nxt_http_js_ext_get_cookie(njs_vm_t *vm, njs_object_prop_t *prop,
|
nxt_http_js_ext_get_cookie(njs_vm_t *vm, njs_object_prop_t *prop,
|
||||||
njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
|
njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
|
||||||
@@ -271,3 +295,46 @@ nxt_http_js_ext_get_cookie(njs_vm_t *vm, njs_object_prop_t *prop,
|
|||||||
|
|
||||||
return NJS_DECLINED;
|
return NJS_DECLINED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static njs_int_t
|
||||||
|
nxt_http_js_ext_keys_cookie(njs_vm_t *vm, njs_value_t *value, njs_value_t *keys)
|
||||||
|
{
|
||||||
|
njs_int_t rc;
|
||||||
|
nxt_array_t *cookies;
|
||||||
|
nxt_http_request_t *r;
|
||||||
|
nxt_http_name_value_t *nv, *start, *end;
|
||||||
|
|
||||||
|
rc = njs_vm_array_alloc(vm, keys, 4);
|
||||||
|
if (rc != NJS_OK) {
|
||||||
|
return NJS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = njs_vm_external(vm, nxt_js_proto_id, value);
|
||||||
|
if (r == NULL) {
|
||||||
|
return NJS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
cookies = nxt_http_cookies_parse(r);
|
||||||
|
if (nxt_slow_path(cookies == NULL)) {
|
||||||
|
return NJS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
start = cookies->elts;
|
||||||
|
end = start + cookies->nelts;
|
||||||
|
|
||||||
|
for (nv = start; nv < end; nv++) {
|
||||||
|
|
||||||
|
value = njs_vm_array_push(vm, keys);
|
||||||
|
if (value == NULL) {
|
||||||
|
return NJS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = njs_vm_value_string_set(vm, value, nv->name, nv->name_length);
|
||||||
|
if (rc != NJS_OK) {
|
||||||
|
return NJS_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NJS_OK;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user