[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