Skip to content

Commit 141deec

Browse files
committed
NJS: added the keys API for the request objects.
This commit is to loop through the request objects headers, arguments, and cookies.
1 parent 97caab0 commit 141deec

File tree

2 files changed

+106
-33
lines changed

2 files changed

+106
-33
lines changed

docs/changes.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ NGINX Unit updated to 1.30.0.
3232
date="" time=""
3333
packager="Nginx Packaging <nginx-packaging@f5.com>">
3434

35+
<change type="feature">
36+
<para>
37+
support the keys API on the request objects in NJS.
38+
</para>
39+
</change>
40+
3541
</changes>
3642

3743
<changes apply="unit-php

src/nxt_http_js.c

Lines changed: 100 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,19 @@ static njs_int_t nxt_http_js_ext_host(njs_vm_t *vm, njs_object_prop_t *prop,
1515
static njs_int_t nxt_http_js_ext_remote_addr(njs_vm_t *vm,
1616
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
1717
njs_value_t *retval);
18-
static njs_int_t nxt_http_js_ext_get_arg(njs_vm_t *vm,
18+
static njs_int_t nxt_http_js_ext_get_args(njs_vm_t *vm,
1919
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
2020
njs_value_t *retval);
2121
static njs_int_t nxt_http_js_ext_get_header(njs_vm_t *vm,
2222
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
2323
njs_value_t *retval);
24+
static njs_int_t nxt_http_js_ext_keys_header(njs_vm_t *vm,
25+
njs_value_t *value, njs_value_t *keys);
2426
static njs_int_t nxt_http_js_ext_get_cookie(njs_vm_t *vm,
2527
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
2628
njs_value_t *retval);
29+
static njs_int_t nxt_http_js_ext_keys_cookie(njs_vm_t *vm, njs_value_t *value,
30+
njs_value_t *keys);
2731

2832

2933
static njs_external_t nxt_http_js_proto[] = {
@@ -55,12 +59,11 @@ static njs_external_t nxt_http_js_proto[] = {
5559
},
5660

5761
{
58-
.flags = NJS_EXTERN_OBJECT,
62+
.flags = NJS_EXTERN_PROPERTY,
5963
.name.string = njs_str("args"),
6064
.enumerable = 1,
61-
.u.object = {
62-
.enumerable = 1,
63-
.prop_handler = nxt_http_js_ext_get_arg,
65+
.u.property = {
66+
.handler = nxt_http_js_ext_get_args,
6467
}
6568
},
6669

@@ -71,6 +74,7 @@ static njs_external_t nxt_http_js_proto[] = {
7174
.u.object = {
7275
.enumerable = 1,
7376
.prop_handler = nxt_http_js_ext_get_header,
77+
.keys = nxt_http_js_ext_keys_header,
7478
}
7579
},
7680

@@ -81,6 +85,7 @@ static njs_external_t nxt_http_js_proto[] = {
8185
.u.object = {
8286
.enumerable = 1,
8387
.prop_handler = nxt_http_js_ext_get_cookie,
88+
.keys = nxt_http_js_ext_keys_cookie,
8489
}
8590
},
8691
};
@@ -144,48 +149,32 @@ nxt_http_js_ext_remote_addr(njs_vm_t *vm, njs_object_prop_t *prop,
144149

145150

146151
static njs_int_t
147-
nxt_http_js_ext_get_arg(njs_vm_t *vm, njs_object_prop_t *prop,
152+
nxt_http_js_ext_get_args(njs_vm_t *vm, njs_object_prop_t *prop,
148153
njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
149154
{
150-
njs_int_t rc;
151-
njs_str_t key;
152-
nxt_array_t *args;
153-
nxt_http_request_t *r;
154-
nxt_http_name_value_t *nv, *start, *end;
155+
njs_int_t ret;
156+
njs_value_t *args;
157+
njs_opaque_value_t val;
158+
nxt_http_request_t *r;
155159

156160
r = njs_vm_external(vm, nxt_js_proto_id, value);
157161
if (r == NULL) {
158162
njs_value_undefined_set(retval);
159163
return NJS_DECLINED;
160164
}
161165

162-
rc = njs_vm_prop_name(vm, prop, &key);
163-
if (rc != NJS_OK) {
164-
njs_value_undefined_set(retval);
165-
return NJS_DECLINED;
166-
}
167-
168-
args = nxt_http_arguments_parse(r);
169-
if (nxt_slow_path(args == NULL)) {
170-
return NJS_ERROR;
171-
}
172-
173-
start = args->elts;
174-
end = start + args->nelts;
166+
args = njs_value_arg(&val);
175167

176-
for (nv = start; nv < end; nv++) {
168+
ret = njs_vm_query_string_parse(vm, r->args->start,
169+
r->args->start + r->args->length, args);
177170

178-
if (key.length == nv->name_length
179-
&& memcmp(key.start, nv->name, nv->name_length) == 0)
180-
{
181-
return njs_vm_value_string_set(vm, retval, nv->value,
182-
nv->value_length);
183-
}
171+
if (ret == NJS_ERROR) {
172+
return NJS_ERROR;
184173
}
185174

186-
njs_value_undefined_set(retval);
175+
njs_value_assign(retval, args);
187176

188-
return NJS_DECLINED;
177+
return NJS_OK;
189178
}
190179

191180

@@ -227,6 +216,41 @@ nxt_http_js_ext_get_header(njs_vm_t *vm, njs_object_prop_t *prop,
227216
}
228217

229218

219+
static njs_int_t
220+
nxt_http_js_ext_keys_header(njs_vm_t *vm, njs_value_t *value, njs_value_t *keys)
221+
{
222+
njs_int_t rc;
223+
nxt_http_field_t *f;
224+
nxt_http_request_t *r;
225+
226+
rc = njs_vm_array_alloc(vm, keys, 4);
227+
if (rc != NJS_OK) {
228+
return NJS_ERROR;
229+
}
230+
231+
r = njs_vm_external(vm, nxt_js_proto_id, value);
232+
if (r == NULL) {
233+
return NJS_OK;
234+
}
235+
236+
nxt_list_each(f, r->fields) {
237+
238+
value = njs_vm_array_push(vm, keys);
239+
if (value == NULL) {
240+
return NJS_ERROR;
241+
}
242+
243+
rc = njs_vm_value_string_set(vm, value, f->name, f->name_length);
244+
if (rc != NJS_OK) {
245+
return NJS_ERROR;
246+
}
247+
248+
} nxt_list_loop;
249+
250+
return NJS_OK;
251+
}
252+
253+
230254
static njs_int_t
231255
nxt_http_js_ext_get_cookie(njs_vm_t *vm, njs_object_prop_t *prop,
232256
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,
271295

272296
return NJS_DECLINED;
273297
}
298+
299+
300+
static njs_int_t
301+
nxt_http_js_ext_keys_cookie(njs_vm_t *vm, njs_value_t *value, njs_value_t *keys)
302+
{
303+
njs_int_t rc;
304+
nxt_array_t *cookies;
305+
nxt_http_request_t *r;
306+
nxt_http_name_value_t *nv, *start, *end;
307+
308+
rc = njs_vm_array_alloc(vm, keys, 4);
309+
if (rc != NJS_OK) {
310+
return NJS_ERROR;
311+
}
312+
313+
r = njs_vm_external(vm, nxt_js_proto_id, value);
314+
if (r == NULL) {
315+
return NJS_OK;
316+
}
317+
318+
cookies = nxt_http_cookies_parse(r);
319+
if (nxt_slow_path(cookies == NULL)) {
320+
return NJS_ERROR;
321+
}
322+
323+
start = cookies->elts;
324+
end = start + cookies->nelts;
325+
326+
for (nv = start; nv < end; nv++) {
327+
328+
value = njs_vm_array_push(vm, keys);
329+
if (value == NULL) {
330+
return NJS_ERROR;
331+
}
332+
333+
rc = njs_vm_value_string_set(vm, value, nv->name, nv->name_length);
334+
if (rc != NJS_OK) {
335+
return NJS_ERROR;
336+
}
337+
}
338+
339+
return NJS_OK;
340+
}

0 commit comments

Comments
 (0)