[njs] Modules: introduced common ngx_js_retval().

Dmitry Volyntsev xeioex at nginx.com
Fri Oct 8 13:42:06 UTC 2021


details:   https://hg.nginx.org/njs/rev/5e3973c2216d
branches:  
changeset: 1716:5e3973c2216d
user:      Dmitry Volyntsev <xeioex at nginx.com>
date:      Fri Oct 08 13:41:00 2021 +0000
description:
Modules: introduced common ngx_js_retval().

diffstat:

 nginx/ngx_http_js_module.c   |  29 ++++++++++++--------------
 nginx/ngx_js.c               |  47 +++++++++++++++++++++++++++++++++++++++----
 nginx/ngx_js.h               |   2 +
 nginx/ngx_stream_js_module.c |  39 +++++++++++++++++++----------------
 4 files changed, 78 insertions(+), 39 deletions(-)

diffs (332 lines):

diff -r 9291aef80a73 -r 5e3973c2216d nginx/ngx_http_js_module.c
--- a/nginx/ngx_http_js_module.c	Fri Oct 08 13:40:58 2021 +0000
+++ b/nginx/ngx_http_js_module.c	Fri Oct 08 13:41:00 2021 +0000
@@ -50,6 +50,7 @@ typedef struct {
     ngx_log_t             *log;
     ngx_uint_t             done;
     ngx_int_t              status;
+    njs_opaque_value_t     retval;
     njs_opaque_value_t     request;
     njs_opaque_value_t     request_body;
     njs_opaque_value_t     response_body;
@@ -910,7 +911,6 @@ ngx_http_js_body_filter(ngx_http_request
     size_t                   len;
     u_char                  *p;
     ngx_int_t                rc;
-    njs_str_t                exception;
     njs_int_t                ret, pending;
     ngx_buf_t               *b;
     ngx_chain_t             *out, *cl;
@@ -988,11 +988,6 @@ ngx_http_js_body_filter(ngx_http_request
                              3);
 
             if (rc == NGX_ERROR) {
-                njs_vm_retval_string(ctx->vm, &exception);
-
-                ngx_log_error(NGX_LOG_ERR, c->log, 0, "js exception: %*s",
-                              exception.length, exception.start);
-
                 return NGX_ERROR;
             }
 
@@ -1044,7 +1039,7 @@ ngx_http_js_variable_set(ngx_http_reques
 
     ngx_int_t           rc;
     njs_int_t           pending;
-    njs_str_t           value;
+    ngx_str_t           value;
     ngx_http_js_ctx_t  *ctx;
 
     rc = ngx_http_js_init_vm(r);
@@ -1078,15 +1073,15 @@ ngx_http_js_variable_set(ngx_http_reques
         return NGX_ERROR;
     }
 
-    if (njs_vm_retval_string(ctx->vm, &value) != NJS_OK) {
+    if (ngx_js_retval(ctx->vm, &ctx->retval, &value) != NGX_OK) {
         return NGX_ERROR;
     }
 
-    v->len = value.length;
+    v->len = value.len;
     v->valid = 1;
     v->no_cacheable = 0;
     v->not_found = 0;
-    v->data = value.start;
+    v->data = value.data;
 
     return NGX_OK;
 }
@@ -1123,7 +1118,7 @@ static ngx_int_t
 ngx_http_js_init_vm(ngx_http_request_t *r)
 {
     njs_int_t                 rc;
-    njs_str_t                 exception;
+    ngx_str_t                 exception;
     ngx_http_js_ctx_t        *ctx;
     ngx_pool_cleanup_t       *cln;
     ngx_http_js_main_conf_t  *jmcf;
@@ -1141,6 +1136,8 @@ ngx_http_js_init_vm(ngx_http_request_t *
             return NGX_ERROR;
         }
 
+        njs_value_invalid_set(njs_value_arg(&ctx->retval));
+
         ngx_http_set_ctx(r, ctx, ngx_http_js_module);
     }
 
@@ -1164,10 +1161,10 @@ ngx_http_js_init_vm(ngx_http_request_t *
     cln->data = ctx;
 
     if (njs_vm_start(ctx->vm) == NJS_ERROR) {
-        njs_vm_retval_string(ctx->vm, &exception);
+        ngx_js_retval(ctx->vm, NULL, &exception);
 
         ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
-                      "js exception: %*s", exception.length, exception.start);
+                      "js exception: %V", &exception);
 
         return NGX_ERROR;
     }
@@ -3403,7 +3400,7 @@ ngx_http_js_handle_vm_event(ngx_http_req
     njs_value_t *args, njs_uint_t nargs)
 {
     njs_int_t           rc;
-    njs_str_t           exception;
+    ngx_str_t           exception;
     ngx_http_js_ctx_t  *ctx;
 
     ctx = ngx_http_get_module_ctx(r, ngx_http_js_module);
@@ -3417,10 +3414,10 @@ ngx_http_js_handle_vm_event(ngx_http_req
                    (ngx_int_t) rc, vm_event);
 
     if (rc == NJS_ERROR) {
-        njs_vm_retval_string(ctx->vm, &exception);
+        ngx_js_retval(ctx->vm, NULL, &exception);
 
         ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
-                      "js exception: %*s", exception.length, exception.start);
+                      "js exception: %V", &exception);
 
         ngx_http_finalize_request(r, NGX_ERROR);
     }
diff -r 9291aef80a73 -r 5e3973c2216d nginx/ngx_js.c
--- a/nginx/ngx_js.c	Fri Oct 08 13:40:58 2021 +0000
+++ b/nginx/ngx_js.c	Fri Oct 08 13:41:00 2021 +0000
@@ -69,7 +69,9 @@ ngx_int_t
 ngx_js_call(njs_vm_t *vm, ngx_str_t *fname, ngx_log_t *log,
     njs_opaque_value_t *args, njs_uint_t nargs)
 {
-    njs_str_t        name, exception;
+    njs_int_t        ret;
+    njs_str_t        name;
+    ngx_str_t        exception;
     njs_function_t  *func;
 
     name.start = fname->data;
@@ -82,16 +84,51 @@ ngx_js_call(njs_vm_t *vm, ngx_str_t *fna
         return NGX_ERROR;
     }
 
-    if (njs_vm_call(vm, func, njs_value_arg(args), nargs) != NJS_OK) {
-        njs_vm_retval_string(vm, &exception);
+    ret = njs_vm_call(vm, func, njs_value_arg(args), nargs);
+    if (ret == NJS_ERROR) {
+        ngx_js_retval(vm, NULL, &exception);
 
         ngx_log_error(NGX_LOG_ERR, log, 0,
-                      "js exception: %*s", exception.length, exception.start);
+                      "js exception: %V", &exception);
+
+        return NGX_ERROR;
+    }
+
+    ret = njs_vm_run(vm);
+    if (ret == NJS_ERROR) {
+        ngx_js_retval(vm, NULL, &exception);
+
+        ngx_log_error(NGX_LOG_ERR, log, 0,
+                      "js exception: %V", &exception);
 
         return NGX_ERROR;
     }
 
-    return njs_vm_run(vm);
+    return (ret == NJS_AGAIN) ? NGX_AGAIN : NGX_OK;
+}
+
+
+ngx_int_t
+ngx_js_retval(njs_vm_t *vm, njs_opaque_value_t *retval, ngx_str_t *s)
+{
+    njs_int_t  ret;
+    njs_str_t  str;
+
+    if (retval != NULL && njs_value_is_valid(njs_value_arg(retval))) {
+        ret = njs_vm_value_string(vm, &str, njs_value_arg(retval));
+
+    } else {
+        ret = njs_vm_retval_string(vm, &str);
+    }
+
+    if (ret != NJS_OK) {
+        return NGX_ERROR;
+    }
+
+    s->data = str.start;
+    s->len = str.length;
+
+    return NGX_OK;
 }
 
 
diff -r 9291aef80a73 -r 5e3973c2216d nginx/ngx_js.h
--- a/nginx/ngx_js.h	Fri Oct 08 13:40:58 2021 +0000
+++ b/nginx/ngx_js.h	Fri Oct 08 13:41:00 2021 +0000
@@ -51,6 +51,8 @@ typedef ngx_ssl_t *(*ngx_external_ssl_pt
 
 ngx_int_t ngx_js_call(njs_vm_t *vm, ngx_str_t *fname, ngx_log_t *log,
     njs_opaque_value_t *args, njs_uint_t nargs);
+ngx_int_t ngx_js_retval(njs_vm_t *vm, njs_opaque_value_t *retval,
+    ngx_str_t *s);
 
 njs_int_t ngx_js_ext_log(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t level);
diff -r 9291aef80a73 -r 5e3973c2216d nginx/ngx_stream_js_module.c
--- a/nginx/ngx_stream_js_module.c	Fri Oct 08 13:40:58 2021 +0000
+++ b/nginx/ngx_stream_js_module.c	Fri Oct 08 13:41:00 2021 +0000
@@ -52,6 +52,7 @@ typedef struct {
 
 typedef struct {
     njs_vm_t               *vm;
+    njs_opaque_value_t      retval;
     njs_opaque_value_t      args[3];
     ngx_buf_t              *buf;
     ngx_chain_t           **last_out;
@@ -511,7 +512,7 @@ ngx_stream_js_preread_handler(ngx_stream
 static ngx_int_t
 ngx_stream_js_phase_handler(ngx_stream_session_t *s, ngx_str_t *name)
 {
-    njs_str_t             exception;
+    ngx_str_t             exception;
     njs_int_t             ret;
     ngx_int_t             rc;
     ngx_connection_t     *c;
@@ -550,10 +551,10 @@ ngx_stream_js_phase_handler(ngx_stream_s
 
     ret = ngx_stream_js_run_event(s, ctx, &ctx->events[NGX_JS_EVENT_UPLOAD]);
     if (ret != NJS_OK) {
-        njs_vm_retval_string(ctx->vm, &exception);
+        ngx_js_retval(ctx->vm, NULL, &exception);
 
-        ngx_log_error(NGX_LOG_ERR, c->log, 0, "js exception: %*s",
-                      exception.length, exception.start);
+        ngx_log_error(NGX_LOG_ERR, c->log, 0, "js exception: %V",
+                      &exception);
 
         return NGX_ERROR;
     }
@@ -583,7 +584,7 @@ static ngx_int_t
 ngx_stream_js_body_filter(ngx_stream_session_t *s, ngx_chain_t *in,
     ngx_uint_t from_upstream)
 {
-    njs_str_t                  exception;
+    ngx_str_t                  exception;
     njs_int_t                  ret;
     ngx_int_t                  rc;
     ngx_chain_t               *out, *cl, **busy;
@@ -635,10 +636,10 @@ ngx_stream_js_body_filter(ngx_stream_ses
         if (event->ev != NULL) {
             ret = ngx_stream_js_run_event(s, ctx, event);
             if (ret != NJS_OK) {
-                njs_vm_retval_string(ctx->vm, &exception);
+                ngx_js_retval(ctx->vm, NULL, &exception);
 
-                ngx_log_error(NGX_LOG_ERR, c->log, 0, "js exception: %*s",
-                              exception.length, exception.start);
+                ngx_log_error(NGX_LOG_ERR, c->log, 0, "js exception: %V",
+                              &exception);
 
                 return NGX_ERROR;
             }
@@ -693,7 +694,7 @@ ngx_stream_js_variable_set(ngx_stream_se
 
     ngx_int_t             rc;
     njs_int_t             pending;
-    njs_str_t             value;
+    ngx_str_t             value;
     ngx_stream_js_ctx_t  *ctx;
 
     rc = ngx_stream_js_init_vm(s);
@@ -727,15 +728,15 @@ ngx_stream_js_variable_set(ngx_stream_se
         return NGX_ERROR;
     }
 
-    if (njs_vm_retval_string(ctx->vm, &value) != NJS_OK) {
+    if (ngx_js_retval(ctx->vm, &ctx->retval, &value) != NGX_OK) {
         return NGX_ERROR;
     }
 
-    v->len = value.length;
+    v->len = value.len;
     v->valid = 1;
     v->no_cacheable = 0;
     v->not_found = 0;
-    v->data = value.start;
+    v->data = value.data;
 
     return NGX_OK;
 }
@@ -772,7 +773,7 @@ static ngx_int_t
 ngx_stream_js_init_vm(ngx_stream_session_t *s)
 {
     njs_int_t                   rc;
-    njs_str_t                   exception;
+    ngx_str_t                   exception;
     ngx_pool_cleanup_t         *cln;
     ngx_stream_js_ctx_t        *ctx;
     ngx_stream_js_main_conf_t  *jmcf;
@@ -790,6 +791,8 @@ ngx_stream_js_init_vm(ngx_stream_session
             return NGX_ERROR;
         }
 
+        njs_value_invalid_set(njs_value_arg(&ctx->retval));
+
         ngx_stream_set_ctx(s, ctx, ngx_stream_js_module);
     }
 
@@ -811,10 +814,10 @@ ngx_stream_js_init_vm(ngx_stream_session
     cln->data = s;
 
     if (njs_vm_start(ctx->vm) == NJS_ERROR) {
-        njs_vm_retval_string(ctx->vm, &exception);
+        ngx_js_retval(ctx->vm, NULL, &exception);
 
         ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
-                      "js exception: %*s", exception.length, exception.start);
+                      "js exception: %V", &exception);
 
         return NGX_ERROR;
     }
@@ -1433,7 +1436,7 @@ ngx_stream_js_handle_event(ngx_stream_se
     njs_value_t *args, njs_uint_t nargs)
 {
     njs_int_t            rc;
-    njs_str_t            exception;
+    ngx_str_t            exception;
     ngx_stream_js_ctx_t  *ctx;
 
     ctx = ngx_stream_get_module_ctx(s, ngx_stream_js_module);
@@ -1443,10 +1446,10 @@ ngx_stream_js_handle_event(ngx_stream_se
     rc = njs_vm_run(ctx->vm);
 
     if (rc == NJS_ERROR) {
-        njs_vm_retval_string(ctx->vm, &exception);
+        ngx_js_retval(ctx->vm, NULL, &exception);
 
         ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
-                      "js exception: %*s", exception.length, exception.start);
+                      "js exception: %V", &exception);
 
         ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
     }


More information about the nginx-devel mailing list