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;
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;
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;
}
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);
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;
}
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;
return NGX_ERROR;
}
+ njs_value_invalid_set(njs_value_arg(&ctx->retval));
+
ngx_http_set_ctx(r, ctx, ngx_http_js_module);
}
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;
}
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);
(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);
}
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;
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;
}
- return njs_vm_run(vm);
+ 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 (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;
}
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);
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;
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;
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;
}
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;
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;
}
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);
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;
}
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;
return NGX_ERROR;
}
+ njs_value_invalid_set(njs_value_arg(&ctx->retval));
+
ngx_stream_set_ctx(s, ctx, ngx_stream_js_module);
}
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;
}
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);
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);
}