@@ -15,15 +15,19 @@ static njs_int_t nxt_http_js_ext_host(njs_vm_t *vm, njs_object_prop_t *prop,
1515static 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 );
2121static 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 );
2426static 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
2933static 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
146151static 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+
230254static njs_int_t
231255nxt_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