@@ -15,15 +15,19 @@ static njs_int_t nxt_http_js_ext_host(njs_vm_t *vm, njs_object_prop_t *prop,
15
15
static njs_int_t nxt_http_js_ext_remote_addr (njs_vm_t * vm ,
16
16
njs_object_prop_t * prop , njs_value_t * value , njs_value_t * setval ,
17
17
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 ,
19
19
njs_object_prop_t * prop , njs_value_t * value , njs_value_t * setval ,
20
20
njs_value_t * retval );
21
21
static njs_int_t nxt_http_js_ext_get_header (njs_vm_t * vm ,
22
22
njs_object_prop_t * prop , njs_value_t * value , njs_value_t * setval ,
23
23
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 );
24
26
static njs_int_t nxt_http_js_ext_get_cookie (njs_vm_t * vm ,
25
27
njs_object_prop_t * prop , njs_value_t * value , njs_value_t * setval ,
26
28
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 );
27
31
28
32
29
33
static njs_external_t nxt_http_js_proto [] = {
@@ -55,12 +59,11 @@ static njs_external_t nxt_http_js_proto[] = {
55
59
},
56
60
57
61
{
58
- .flags = NJS_EXTERN_OBJECT ,
62
+ .flags = NJS_EXTERN_PROPERTY ,
59
63
.name .string = njs_str ("args" ),
60
64
.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 ,
64
67
}
65
68
},
66
69
@@ -71,6 +74,7 @@ static njs_external_t nxt_http_js_proto[] = {
71
74
.u .object = {
72
75
.enumerable = 1 ,
73
76
.prop_handler = nxt_http_js_ext_get_header ,
77
+ .keys = nxt_http_js_ext_keys_header ,
74
78
}
75
79
},
76
80
@@ -81,6 +85,7 @@ static njs_external_t nxt_http_js_proto[] = {
81
85
.u .object = {
82
86
.enumerable = 1 ,
83
87
.prop_handler = nxt_http_js_ext_get_cookie ,
88
+ .keys = nxt_http_js_ext_keys_cookie ,
84
89
}
85
90
},
86
91
};
@@ -144,48 +149,32 @@ nxt_http_js_ext_remote_addr(njs_vm_t *vm, njs_object_prop_t *prop,
144
149
145
150
146
151
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 ,
148
153
njs_value_t * value , njs_value_t * setval , njs_value_t * retval )
149
154
{
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 ;
155
159
156
160
r = njs_vm_external (vm , nxt_js_proto_id , value );
157
161
if (r == NULL ) {
158
162
njs_value_undefined_set (retval );
159
163
return NJS_DECLINED ;
160
164
}
161
165
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 );
175
167
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 );
177
170
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 ;
184
173
}
185
174
186
- njs_value_undefined_set (retval );
175
+ njs_value_assign (retval , args );
187
176
188
- return NJS_DECLINED ;
177
+ return NJS_OK ;
189
178
}
190
179
191
180
@@ -227,6 +216,41 @@ nxt_http_js_ext_get_header(njs_vm_t *vm, njs_object_prop_t *prop,
227
216
}
228
217
229
218
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
+
230
254
static njs_int_t
231
255
nxt_http_js_ext_get_cookie (njs_vm_t * vm , njs_object_prop_t * prop ,
232
256
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,
271
295
272
296
return NJS_DECLINED ;
273
297
}
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