[njs] Added querystring API for modules.

Dmitry Volyntsev xeioex at nginx.com
Fri Jul 15 03:56:49 UTC 2022


details:   https://hg.nginx.org/njs/rev/016946f45c70
branches:  
changeset: 1908:016946f45c70
user:      Dmitry Volyntsev <xeioex at nginx.com>
date:      Thu Jul 14 20:16:36 2022 -0700
description:
Added querystring API for modules.

diffstat:

 external/njs_query_string_module.c |  113 +++++++++++++++++++++++-------------
 src/njs.h                          |    3 +
 2 files changed, 75 insertions(+), 41 deletions(-)

diffs (201 lines):

diff -r 36a6dfe84da4 -r 016946f45c70 external/njs_query_string_module.c
--- a/external/njs_query_string_module.c	Thu Jul 14 20:16:34 2022 -0700
+++ b/external/njs_query_string_module.c	Thu Jul 14 20:16:36 2022 -0700
@@ -9,15 +9,9 @@
 #include <njs_main.h>
 
 
-static const njs_value_t  njs_escape_str = njs_string("escape");
-static const njs_value_t  njs_unescape_str = njs_string("unescape");
-static const njs_value_t  njs_encode_uri_str =
-                                         njs_long_string("encodeURIComponent");
-static const njs_value_t  njs_decode_uri_str =
-                                         njs_long_string("decodeURIComponent");
-static const njs_value_t  njs_max_keys_str = njs_string("maxKeys");
-
-
+static njs_int_t njs_query_string_parser(njs_vm_t *vm, u_char *query,
+    u_char *end, const njs_str_t *sep, const njs_str_t *eq,
+    njs_function_t *decode, njs_uint_t max_keys, njs_value_t *retval);
 static njs_int_t njs_query_string_parse(njs_vm_t *vm, njs_value_t *args,
     njs_uint_t nargs, njs_index_t unused);
 static njs_int_t njs_query_string_stringify(njs_vm_t *vm, njs_value_t *args,
@@ -114,6 +108,21 @@ njs_module_t  njs_query_string_module = 
 };
 
 
+static const njs_value_t  njs_escape_str = njs_string("escape");
+static const njs_value_t  njs_unescape_str = njs_string("unescape");
+static const njs_value_t  njs_encode_uri_str =
+                                         njs_long_string("encodeURIComponent");
+static const njs_value_t  njs_decode_uri_str =
+                                         njs_long_string("decodeURIComponent");
+static const njs_value_t  njs_max_keys_str = njs_string("maxKeys");
+
+static const njs_str_t njs_sep_default = njs_str("&");
+static const njs_str_t njs_eq_default = njs_str("=");
+
+static const njs_value_t  njs_unescape_default =
+    njs_native_function(njs_query_string_unescape, 1);
+
+
 static njs_object_t *
 njs_query_string_object_alloc(njs_vm_t *vm)
 {
@@ -343,7 +352,7 @@ njs_query_string_append(njs_vm_t *vm, nj
 
 
 static u_char *
-njs_query_string_match(u_char *p, u_char *end, njs_str_t *v)
+njs_query_string_match(u_char *p, u_char *end, const njs_str_t *v)
 {
     size_t  length;
 
@@ -375,40 +384,28 @@ static njs_int_t
 njs_query_string_parse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    size_t          size;
-    u_char          *end, *part, *key, *val;
-    int64_t         max_keys, count;
+    int64_t         max_keys;
     njs_int_t       ret;
-    njs_str_t       str;
-    njs_value_t     obj, value, *this, *string, *options, *arg;
+    njs_str_t       str, sep, eq;
+    njs_value_t     value, *this, *string, *options, *arg;
     njs_value_t     val_sep, val_eq;
-    njs_object_t    *object;
     njs_function_t  *decode;
 
-    njs_str_t  sep = njs_str("&");
-    njs_str_t  eq = njs_str("=");
-
-    count = 0;
     decode = NULL;
     max_keys = 1000;
 
-    object = njs_query_string_object_alloc(vm);
-    if (njs_slow_path(object == NULL)) {
-        return NJS_ERROR;
-    }
-
-    njs_set_object(&obj, object);
-
     this = njs_argument(args, 0);
     string = njs_arg(args, nargs, 1);
 
-    if (njs_slow_path(!njs_is_string(string)
-                      || njs_string_length(string) == 0))
-    {
-        goto done;
+    if (njs_is_string(string)) {
+        njs_string_get(string, &str);
+
+    } else {
+        str = njs_str_value("");
     }
 
-    njs_string_get(string, &str);
+    sep = njs_sep_default;
+    eq = njs_eq_default;
 
     arg = njs_arg(args, nargs, 2);
     if (!njs_is_null_or_undefined(arg)) {
@@ -478,26 +475,62 @@ njs_query_string_parse(njs_vm_t *vm, njs
         decode = njs_function(&value);
     }
 
-    key = str.start;
-    end = str.start + str.length;
+    return njs_query_string_parser(vm, str.start, str.start + str.length,
+                                   &sep, &eq, decode, max_keys, &vm->retval);
+}
+
+
+njs_int_t
+njs_vm_query_string_parse(njs_vm_t *vm, u_char *start, u_char *end,
+    njs_value_t *retval)
+{
+    return njs_query_string_parser(vm, start, end, &njs_sep_default,
+                                   &njs_eq_default,
+                                   njs_function(&njs_unescape_default),
+                                   1000, retval);
+}
+
+
+static njs_int_t
+njs_query_string_parser(njs_vm_t *vm, u_char *query, u_char *end,
+    const njs_str_t *sep, const njs_str_t *eq, njs_function_t *decode,
+    njs_uint_t max_keys, njs_value_t *retval)
+{
+    size_t        size;
+    u_char        *part, *key, *val;
+    njs_int_t     ret;
+    njs_uint_t    count;
+    njs_value_t   obj;
+    njs_object_t  *object;
+
+    object = njs_query_string_object_alloc(vm);
+    if (njs_slow_path(object == NULL)) {
+        return NJS_ERROR;
+    }
+
+    njs_set_object(&obj, object);
+
+    count = 0;
+
+    key = query;
 
     do {
         if (count++ == max_keys) {
             break;
         }
 
-        part = njs_query_string_match(key, end, &sep);
+        part = njs_query_string_match(key, end, sep);
 
         if (part == key) {
             goto next;
         }
 
-        val = njs_query_string_match(key, part, &eq);
+        val = njs_query_string_match(key, part, eq);
 
         size = val - key;
 
         if (val != end) {
-            val += eq.length;
+            val += eq->length;
         }
 
         ret = njs_query_string_append(vm, &obj, key, size, val, part - val,
@@ -508,13 +541,11 @@ njs_query_string_parse(njs_vm_t *vm, njs
 
     next:
 
-        key = part + sep.length;
+        key = part + sep->length;
 
     } while (key < end);
 
-done:
-
-    njs_set_object(&vm->retval, object);
+    njs_set_object(retval, object);
 
     return NJS_OK;
 }
diff -r 36a6dfe84da4 -r 016946f45c70 src/njs.h
--- a/src/njs.h	Thu Jul 14 20:16:34 2022 -0700
+++ b/src/njs.h	Thu Jul 14 20:16:36 2022 -0700
@@ -451,6 +451,9 @@ NJS_EXPORT njs_int_t njs_vm_json_parse(n
 NJS_EXPORT njs_int_t njs_vm_json_stringify(njs_vm_t *vm, njs_value_t *args,
     njs_uint_t nargs);
 
+NJS_EXPORT njs_int_t njs_vm_query_string_parse(njs_vm_t *vm, u_char *start,
+    u_char *end, njs_value_t *retval);
+
 NJS_EXPORT njs_int_t njs_vm_promise_create(njs_vm_t *vm, njs_value_t *retval,
     njs_value_t *callbacks);
 



More information about the nginx-devel mailing list