fail:
- njs_vm_exception_get(vm, njs_value_arg(&lvalue));
-
- ngx_js_fetch_done(fetch, &lvalue, NJS_ERROR);
+ ngx_log_debug2(NGX_LOG_DEBUG_EVENT, http->log, 0,
+ "js http done fetch:%p rc:%d", fetch, NJS_ERROR);
- njs_value_assign(retval, njs_value_arg(&fetch->promise));
+ ngx_js_del_event(ngx_external_ctx(vm, njs_vm_external_ptr(vm)),
+ fetch->event);
- return NJS_OK;
+ return ngx_js_fetch_promissified_result(vm, NULL, NJS_ERROR, retval);
}
fail:
- fetch->response_value = JS_GetException(cx);
+ ngx_log_debug2(NGX_LOG_DEBUG_EVENT, (&fetch->http)->log, 0,
+ "js http done fetch:%p rc:%d", fetch, NGX_ERROR);
- ngx_qjs_fetch_done(fetch, fetch->response_value, NGX_ERROR);
+ ngx_js_del_event(ngx_qjs_external_ctx(cx, external), fetch->event);
- return promise;
+ JS_FreeValue(cx, promise);
+
+ return qjs_promise_result(cx, JS_EXCEPTION);
}
js_content test.broken_response;
}
+ location /broken_catch {
+ js_content test.broken_catch;
+ }
+
location /body {
js_content test.body;
}
return process_errors(r, tests);
}
+ function process_errors_catch(r, tests) {
+ var results = [];
+
+ var sync_catch = 'sync';
+
+ tests.forEach(args => {
+ ngx.fetch.apply(r, args)
+ .then(reply => {
+ r.return(400, '["unexpected then"]');
+ })
+ .catch(e => {
+ results.push(sync_catch);
+
+ if (results.length == tests.length) {
+ r.return(200, JSON.stringify(results));
+ }
+ })
+ })
+
+ sync_catch = 'async';
+ }
+
+ function broken_catch(r) {
+ var tests = [
+ ['http://127.0.0.1:1/loc'],
+ ['http://127.0.0.1:80800/loc'],
+ [Symbol.toStringTag],
+ ];
+
+ return process_errors_catch(r, tests);
+ }
+
function chain(r) {
var results = [];
var reqs = [
r.return(c, `\${v.request_method}:\${bar}:\${body}`);
}
- export default {njs: test_njs, body, broken, broken_response, body_special,
- chain, chunked_ok, chunked_fail, header, header_iter,
- host_header, multi, loc, property, body_content_length,
- user_agent_header };
+ export default {njs: test_njs, body, broken, broken_response, broken_catch,
+ body_special,chain, chunked_ok, chunked_fail, header,
+ header_iter, host_header, multi, loc, property,
+ body_content_length, user_agent_header };
EOF
$t->try_run('no njs.fetch');
-$t->plan(40);
+$t->plan(41);
$t->run_daemon(\&http_daemon, port(8082));
$t->waitforsocket('127.0.0.1:' . port(8082));
like(http_get('/multi?throw=1'), qr/500/s, 'fetch destructor');
like(http_get('/broken'), qr/200/s, 'fetch broken');
like(http_get('/broken_response'), qr/200/s, 'fetch broken response');
+like(http_get('/broken_catch'), qr/\["async","async","async"]$/s,
+ 'fetch broken catch');
like(http_get('/chunked_ok'), qr/200/s, 'fetch chunked ok');
like(http_get('/chunked_fail'), qr/200/s, 'fetch chunked fail');
like(http_get('/chain'), qr/200 OK.*SUCCESS$/s, 'fetch chain');