[njs] Modules: common code for js_import is moved to shared library.

Vadim Zhestikov v.zhestikov at f5.com
Wed Sep 14 04:22:12 UTC 2022


details:   https://hg.nginx.org/njs/rev/05efe34376ab
branches:  
changeset: 1952:05efe34376ab
user:      Vadim Zhestikov <v.zhestikov at f5.com>
date:      Tue Sep 13 21:13:17 2022 -0700
description:
Modules: common code for js_import is moved to shared library.

diffstat:

 nginx/ngx_http_js_module.c   |  160 +++++-------------------------------------
 nginx/ngx_js.c               |  107 ++++++++++++++++++++++++++++
 nginx/ngx_js.h               |   18 ++++
 nginx/ngx_stream_js_module.c |  153 ++++------------------------------------
 4 files changed, 164 insertions(+), 274 deletions(-)

diffs (574 lines):

diff -r 86d181bb72e4 -r 05efe34376ab nginx/ngx_http_js_module.c
--- a/nginx/ngx_http_js_module.c	Mon Sep 12 17:56:44 2022 -0700
+++ b/nginx/ngx_http_js_module.c	Tue Sep 13 21:13:17 2022 -0700
@@ -12,15 +12,8 @@
 #include "ngx_js.h"
 
 
-#define NJS_HEADER_SEMICOLON   0x1
-#define NJS_HEADER_SINGLE      0x2
-#define NJS_HEADER_ARRAY       0x4
-
-
 typedef struct {
-    njs_vm_t              *vm;
-    ngx_array_t           *imports;
-    ngx_array_t           *paths;
+    NGX_JS_COMMON_CONF;
 
     ngx_str_t              content;
     ngx_str_t              header_filter;
@@ -42,12 +35,9 @@ typedef struct {
 } ngx_http_js_loc_conf_t;
 
 
-typedef struct {
-    ngx_str_t              name;
-    ngx_str_t              path;
-    u_char                *file;
-    ngx_uint_t             line;
-} ngx_http_js_import_t;
+#define NJS_HEADER_SEMICOLON   0x1
+#define NJS_HEADER_SINGLE      0x2
+#define NJS_HEADER_ARRAY       0x4
 
 
 typedef struct {
@@ -263,8 +253,6 @@ static void ngx_http_js_handle_event(ngx
     njs_vm_event_t vm_event, njs_value_t *args, njs_uint_t nargs);
 
 static ngx_int_t ngx_http_js_init(ngx_conf_t *cf);
-static char *ngx_http_js_import(ngx_conf_t *cf, ngx_command_t *cmd,
-    void *conf);
 static char *ngx_http_js_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
 static char *ngx_http_js_var(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
 static char *ngx_http_js_content(ngx_conf_t *cf, ngx_command_t *cmd,
@@ -301,7 +289,7 @@ static ngx_command_t  ngx_http_js_comman
 
     { ngx_string("js_import"),
       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE13,
-      ngx_http_js_import,
+      ngx_js_import,
       NGX_HTTP_LOC_CONF_OFFSET,
       0,
       NULL },
@@ -4182,10 +4170,10 @@ static ngx_int_t
 ngx_http_js_merge_vm(ngx_conf_t *cf, ngx_http_js_loc_conf_t *conf,
     ngx_http_js_loc_conf_t *prev)
 {
-    ngx_str_t             *path, *s;
-    ngx_uint_t             i;
-    ngx_array_t           *imports, *paths;
-    ngx_http_js_import_t  *import, *pi;
+    ngx_str_t            *path, *s;
+    ngx_uint_t            i;
+    ngx_array_t          *imports, *paths;
+    ngx_js_named_path_t  *import, *pi;
 
     if (prev->imports != NGX_CONF_UNSET_PTR && prev->vm == NULL) {
         if (ngx_http_js_init_conf_vm(cf, prev) != NGX_OK) {
@@ -4210,7 +4198,7 @@ ngx_http_js_merge_vm(ngx_conf_t *cf, ngx
 
         } else {
             imports = ngx_array_create(cf->pool, 4,
-                                       sizeof(ngx_http_js_import_t));
+                                       sizeof(ngx_js_named_path_t));
             if (imports == NULL) {
                 return NGX_ERROR;
             }
@@ -4288,17 +4276,17 @@ ngx_http_js_merge_vm(ngx_conf_t *cf, ngx
 static ngx_int_t
 ngx_http_js_init_conf_vm(ngx_conf_t *cf, ngx_http_js_loc_conf_t *conf)
 {
-    size_t                 size;
-    u_char                *start, *end, *p;
-    ngx_str_t             *m, file;
-    njs_int_t              rc;
-    njs_str_t              text, path;
-    ngx_uint_t             i;
-    njs_value_t           *value;
-    njs_vm_opt_t           options;
-    ngx_pool_cleanup_t    *cln;
-    njs_opaque_value_t     lvalue, exception;
-    ngx_http_js_import_t  *import;
+    size_t                size;
+    u_char               *start, *end, *p;
+    ngx_str_t            *m, file;
+    njs_int_t             rc;
+    njs_str_t             text, path;
+    ngx_uint_t            i;
+    njs_value_t          *value;
+    njs_vm_opt_t          options;
+    ngx_pool_cleanup_t   *cln;
+    njs_opaque_value_t    lvalue, exception;
+    ngx_js_named_path_t  *import;
 
     static const njs_str_t line_number_key = njs_str("lineNumber");
     static const njs_str_t file_name_key = njs_str("fileName");
@@ -4466,112 +4454,6 @@ ngx_http_js_init(ngx_conf_t *cf)
 
 
 static char *
-ngx_http_js_import(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
-{
-    ngx_http_js_loc_conf_t *jlcf = conf;
-
-    u_char                *p, *end, c;
-    ngx_int_t              from;
-    ngx_str_t             *value, name, path;
-    ngx_http_js_import_t  *import;
-
-    value = cf->args->elts;
-    from = (cf->args->nelts == 4);
-
-    if (from) {
-        if (ngx_strcmp(value[2].data, "from") != 0) {
-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
-                               "invalid parameter \"%V\"", &value[2]);
-            return NGX_CONF_ERROR;
-        }
-    }
-
-    name = value[1];
-    path = (from ? value[3] : value[1]);
-
-    if (!from) {
-        end = name.data + name.len;
-
-        for (p = end - 1; p >= name.data; p--) {
-            if (*p == '/') {
-                break;
-            }
-        }
-
-        name.data = p + 1;
-        name.len = end - p - 1;
-
-        if (name.len < 3
-            || ngx_memcmp(&name.data[name.len - 3], ".js", 3) != 0)
-        {
-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
-                               "cannot extract export name from file path "
-                               "\"%V\", use extended \"from\" syntax", &path);
-            return NGX_CONF_ERROR;
-        }
-
-        name.len -= 3;
-    }
-
-    if (name.len == 0) {
-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty export name");
-        return NGX_CONF_ERROR;
-    }
-
-    p = name.data;
-    end = name.data + name.len;
-
-    while (p < end) {
-        c = ngx_tolower(*p);
-
-        if (*p != '_' && (c < 'a' || c > 'z')) {
-            if (p == name.data) {
-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "cannot start "
-                                   "with \"%c\" in export name \"%V\"", *p,
-                                   &name);
-                return NGX_CONF_ERROR;
-            }
-
-            if (*p < '0' || *p > '9') {
-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid character "
-                                   "\"%c\" in export name \"%V\"", *p,
-                                   &name);
-                return NGX_CONF_ERROR;
-            }
-        }
-
-        p++;
-    }
-
-    if (ngx_strchr(path.data, '\'') != NULL) {
-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid character \"'\" "
-                           "in file path \"%V\"", &path);
-        return NGX_CONF_ERROR;
-    }
-
-    if (jlcf->imports == NGX_CONF_UNSET_PTR) {
-        jlcf->imports = ngx_array_create(cf->pool, 4,
-                                         sizeof(ngx_http_js_import_t));
-        if (jlcf->imports == NULL) {
-            return NGX_CONF_ERROR;
-        }
-    }
-
-    import = ngx_array_push(jlcf->imports);
-    if (import == NULL) {
-        return NGX_CONF_ERROR;
-    }
-
-    import->name = name;
-    import->path = path;
-    import->file = cf->conf_file->file.name.data;
-    import->line = cf->conf_file->line;
-
-    return NGX_CONF_OK;
-}
-
-
-static char *
 ngx_http_js_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 {
     ngx_str_t            *value, *fname;
diff -r 86d181bb72e4 -r 05efe34376ab nginx/ngx_js.c
--- a/nginx/ngx_js.c	Mon Sep 12 17:56:44 2022 -0700
+++ b/nginx/ngx_js.c	Tue Sep 13 21:13:17 2022 -0700
@@ -386,3 +386,110 @@ ngx_js_logger(njs_vm_t *vm, njs_external
 
     c->log->handler = handler;
 }
+
+
+char *
+ngx_js_import(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+{
+    ngx_js_conf_t *jscf = conf;
+
+    u_char               *p, *end, c;
+    ngx_int_t             from;
+    ngx_str_t            *value, name, path;
+    ngx_js_named_path_t  *import;
+
+    value = cf->args->elts;
+    from = (cf->args->nelts == 4);
+
+    if (from) {
+        if (ngx_strcmp(value[2].data, "from") != 0) {
+            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                               "invalid parameter \"%V\"", &value[2]);
+            return NGX_CONF_ERROR;
+        }
+    }
+
+    name = value[1];
+    path = (from ? value[3] : value[1]);
+
+    if (!from) {
+        end = name.data + name.len;
+
+        for (p = end - 1; p >= name.data; p--) {
+            if (*p == '/') {
+                break;
+            }
+        }
+
+        name.data = p + 1;
+        name.len = end - p - 1;
+
+        if (name.len < 3
+            || ngx_memcmp(&name.data[name.len - 3], ".js", 3) != 0)
+        {
+            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                               "cannot extract export name from file path "
+                               "\"%V\", use extended \"from\" syntax", &path);
+            return NGX_CONF_ERROR;
+        }
+
+        name.len -= 3;
+    }
+
+    if (name.len == 0) {
+        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty export name");
+        return NGX_CONF_ERROR;
+    }
+
+    p = name.data;
+    end = name.data + name.len;
+
+    while (p < end) {
+        c = ngx_tolower(*p);
+
+        if (*p != '_' && (c < 'a' || c > 'z')) {
+            if (p == name.data) {
+                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "cannot start "
+                                   "with \"%c\" in export name \"%V\"", *p,
+                                   &name);
+                return NGX_CONF_ERROR;
+            }
+
+            if (*p < '0' || *p > '9') {
+                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid character "
+                                   "\"%c\" in export name \"%V\"", *p,
+                                   &name);
+                return NGX_CONF_ERROR;
+            }
+        }
+
+        p++;
+    }
+
+    if (ngx_strchr(path.data, '\'') != NULL) {
+        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid character \"'\" "
+                           "in file path \"%V\"", &path);
+        return NGX_CONF_ERROR;
+    }
+
+    if (jscf->imports == NGX_CONF_UNSET_PTR) {
+        jscf->imports = ngx_array_create(cf->pool, 4,
+                                         sizeof(ngx_js_named_path_t));
+        if (jscf->imports == NULL) {
+            return NGX_CONF_ERROR;
+        }
+    }
+
+    import = ngx_array_push(jscf->imports);
+    if (import == NULL) {
+        return NGX_CONF_ERROR;
+    }
+
+    import->name = name;
+    import->path = path;
+    import->file = cf->conf_file->file.name.data;
+    import->line = cf->conf_file->line;
+
+    return NGX_CONF_OK;
+}
+
diff -r 86d181bb72e4 -r 05efe34376ab nginx/ngx_js.h
--- a/nginx/ngx_js.h	Mon Sep 12 17:56:44 2022 -0700
+++ b/nginx/ngx_js.h	Tue Sep 13 21:13:17 2022 -0700
@@ -38,6 +38,23 @@ typedef ngx_flag_t (*ngx_external_size_p
     njs_external_ptr_t e);
 typedef ngx_ssl_t *(*ngx_external_ssl_pt)(njs_vm_t *vm, njs_external_ptr_t e);
 
+typedef struct {
+    ngx_str_t              name;
+    ngx_str_t              path;
+    u_char                *file;
+    ngx_uint_t             line;
+} ngx_js_named_path_t;
+
+
+#define NGX_JS_COMMON_CONF                                                    \
+    njs_vm_t              *vm;                                                \
+    ngx_array_t           *imports;                                           \
+    ngx_array_t           *paths                                              \
+
+typedef struct {
+    NGX_JS_COMMON_CONF;
+} ngx_js_conf_t;
+
 
 #define ngx_external_connection(vm, e)                                        \
     (*((ngx_connection_t **) ((u_char *) (e) + njs_vm_meta(vm, 0))))
@@ -75,6 +92,7 @@ njs_int_t ngx_js_ext_log(njs_vm_t *vm, n
     njs_index_t level);
 void ngx_js_logger(njs_vm_t *vm, njs_external_ptr_t external,
     njs_log_level_t level, const u_char *start, size_t length);
+char * ngx_js_import(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
 
 njs_int_t ngx_js_ext_string(njs_vm_t *vm, njs_object_prop_t *prop,
     njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
diff -r 86d181bb72e4 -r 05efe34376ab nginx/ngx_stream_js_module.c
--- a/nginx/ngx_stream_js_module.c	Mon Sep 12 17:56:44 2022 -0700
+++ b/nginx/ngx_stream_js_module.c	Tue Sep 13 21:13:17 2022 -0700
@@ -13,17 +13,7 @@
 
 
 typedef struct {
-    ngx_str_t              name;
-    ngx_str_t              path;
-    u_char                *file;
-    ngx_uint_t             line;
-} ngx_stream_js_import_t;
-
-
-typedef struct {
-    njs_vm_t              *vm;
-    ngx_array_t           *imports;
-    ngx_array_t           *paths;
+    NGX_JS_COMMON_CONF;
 
     ngx_str_t              access;
     ngx_str_t              preread;
@@ -137,8 +127,6 @@ static size_t ngx_stream_js_max_response
 static void ngx_stream_js_handle_event(ngx_stream_session_t *s,
     njs_vm_event_t vm_event, njs_value_t *args, njs_uint_t nargs);
 
-static char *ngx_stream_js_import(ngx_conf_t *cf, ngx_command_t *cmd,
-    void *conf);
 static char *ngx_stream_js_set(ngx_conf_t *cf, ngx_command_t *cmd,
     void *conf);
 static char *ngx_stream_js_var(ngx_conf_t *cf, ngx_command_t *cmd,
@@ -176,7 +164,7 @@ static ngx_command_t  ngx_stream_js_comm
 
     { ngx_string("js_import"),
       NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE13,
-      ngx_stream_js_import,
+      ngx_js_import,
       NGX_STREAM_SRV_CONF_OFFSET,
       0,
       NULL },
@@ -1654,10 +1642,10 @@ static ngx_int_t
 ngx_stream_js_merge_vm(ngx_conf_t *cf, ngx_stream_js_srv_conf_t *conf,
     ngx_stream_js_srv_conf_t *prev)
 {
-    ngx_str_t               *path, *s;
-    ngx_uint_t               i;
-    ngx_array_t             *imports, *paths;
-    ngx_stream_js_import_t  *import, *pi;
+    ngx_str_t            *path, *s;
+    ngx_uint_t            i;
+    ngx_array_t          *imports, *paths;
+    ngx_js_named_path_t  *import, *pi;
 
     if (prev->imports != NGX_CONF_UNSET_PTR && prev->vm == NULL) {
         if (ngx_stream_js_init_conf_vm(cf, prev) != NGX_OK) {
@@ -1682,7 +1670,7 @@ ngx_stream_js_merge_vm(ngx_conf_t *cf, n
 
         } else {
             imports = ngx_array_create(cf->pool, 4,
-                                       sizeof(ngx_stream_js_import_t));
+                                       sizeof(ngx_js_named_path_t));
             if (imports == NULL) {
                 return NGX_ERROR;
             }
@@ -1760,17 +1748,17 @@ ngx_stream_js_merge_vm(ngx_conf_t *cf, n
 static ngx_int_t
 ngx_stream_js_init_conf_vm(ngx_conf_t *cf, ngx_stream_js_srv_conf_t *conf)
 {
-    size_t                   size;
-    u_char                  *start, *end, *p;
-    ngx_str_t               *m, file;
-    njs_int_t                rc;
-    njs_str_t                text, path;
-    ngx_uint_t               i;
-    njs_value_t             *value;
-    njs_vm_opt_t             options;
-    ngx_pool_cleanup_t      *cln;
-    njs_opaque_value_t       lvalue, exception;
-    ngx_stream_js_import_t  *import;
+    size_t                size;
+    u_char               *start, *end, *p;
+    ngx_str_t            *m, file;
+    njs_int_t             rc;
+    njs_str_t             text, path;
+    ngx_uint_t            i;
+    njs_value_t          *value;
+    njs_vm_opt_t          options;
+    ngx_pool_cleanup_t   *cln;
+    njs_opaque_value_t    lvalue, exception;
+    ngx_js_named_path_t  *import;
 
     static const njs_str_t line_number_key = njs_str("lineNumber");
     static const njs_str_t file_name_key = njs_str("fileName");
@@ -1933,111 +1921,6 @@ ngx_stream_js_init_conf_vm(ngx_conf_t *c
 
 
 static char *
-ngx_stream_js_import(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
-{
-    ngx_stream_js_srv_conf_t *jscf = conf;
-
-    u_char                  *p, *end, c;
-    ngx_int_t               from;
-    ngx_str_t               *value, name, path;
-    ngx_stream_js_import_t  *import;
-
-    value = cf->args->elts;
-    from = (cf->args->nelts == 4);
-
-    if (from) {
-        if (ngx_strcmp(value[2].data, "from") != 0) {
-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
-                               "invalid parameter \"%V\"", &value[2]);
-            return NGX_CONF_ERROR;
-        }
-    }
-
-    name = value[1];
-    path = (from ? value[3] : value[1]);
-
-    if (!from) {
-        end = name.data + name.len;
-
-        for (p = end - 1; p >= name.data; p--) {
-            if (*p == '/') {
-                break;
-            }
-        }
-
-        name.data = p + 1;
-        name.len = end - p - 1;
-
-        if (name.len < 3
-            || ngx_memcmp(&name.data[name.len - 3], ".js", 3) != 0)
-        {
-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
-                               "cannot extract export name from file path "
-                               "\"%V\", use extended \"from\" syntax", &path);
-            return NGX_CONF_ERROR;
-        }
-
-        name.len -= 3;
-    }
-
-    if (name.len == 0) {
-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty \"name\" parameter");
-        return NGX_CONF_ERROR;
-    }
-
-    p = name.data;
-    end = name.data + name.len;
-
-    while (p < end) {
-        c = ngx_tolower(*p);
-
-        if (*p != '_' && (c < 'a' || c > 'z')) {
-            if (p == name.data) {
-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "cannot start "
-                                   "with \"%c\" in export name \"%V\"", *p,
-                                   &name);
-                return NGX_CONF_ERROR;
-            }
-
-            if (*p < '0' || *p > '9') {
-                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid character "
-                                   "\"%c\" in export name \"%V\"", *p, &name);
-                return NGX_CONF_ERROR;
-            }
-        }
-
-        p++;
-    }
-
-    if (ngx_strchr(path.data, '\'') != NULL) {
-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid character \"'\" "
-                           "in file path \"%V\"", &path);
-        return NGX_CONF_ERROR;
-    }
-
-    if (jscf->imports == NGX_CONF_UNSET_PTR) {
-        jscf->imports = ngx_array_create(cf->pool, 4,
-                                         sizeof(ngx_stream_js_import_t));
-        if (jscf->imports == NULL) {
-            return NGX_CONF_ERROR;
-        }
-    }
-
-    import = ngx_array_push(jscf->imports);
-    if (import == NULL) {
-        return NGX_CONF_ERROR;
-    }
-
-    import->name = name;
-    import->path = path;
-    import->file = cf->conf_file->file.name.data;
-    import->line = cf->conf_file->line;
-
-    return NGX_CONF_OK;
-}
-
-
-static char *
 ngx_stream_js_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 {
     ngx_str_t              *value, *fname;



More information about the nginx-devel mailing list