diff options
author | Andrew Clayton <a.clayton@nginx.com> | 2023-09-08 21:51:25 +0100 |
---|---|---|
committer | Andrew Clayton <a.clayton@nginx.com> | 2023-09-25 13:49:36 +0100 |
commit | 76086d6d7a027ddf42d86897200a53d724fb4bb7 (patch) | |
tree | ac1b5f1a4c64641d0510e9ab289ffd1a99b47beb /src/wasm/nxt_wasm.c | |
parent | c9961610ed5651bda63191465e70e8227c3ef711 (diff) | |
download | unit-76086d6d7a027ddf42d86897200a53d724fb4bb7.tar.gz unit-76086d6d7a027ddf42d86897200a53d724fb4bb7.tar.bz2 |
Wasm: Allow to set the HTTP response status.
This commit enables WebAssembly modules to set the HTTP response status
to something other than the previously hard coded '200 OK'.
To do this they can make a call to nxt_wasm_set_resp_status() providing
the required status code.
If this function isn't called the status code defaults to '200 OK'. The
WebAssembly module can also return -1 from the request_handler function
as a short cut to signal a '500 Internal Server Error'.
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
Diffstat (limited to 'src/wasm/nxt_wasm.c')
-rw-r--r-- | src/wasm/nxt_wasm.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/src/wasm/nxt_wasm.c b/src/wasm/nxt_wasm.c index 45a40b4b..796ea847 100644 --- a/src/wasm/nxt_wasm.c +++ b/src/wasm/nxt_wasm.c @@ -24,6 +24,11 @@ static nxt_wasm_ctx_t nxt_wasm_ctx; static const nxt_wasm_operations_t *nxt_wops; +enum { + NXT_WASM_HTTP_OK = 200, + NXT_WASM_HTTP_ERROR = 500 +}; + void nxt_wasm_do_response_end(nxt_wasm_ctx_t *ctx) @@ -48,7 +53,7 @@ nxt_wasm_do_send_headers(nxt_wasm_ctx_t *ctx, uint32_t offset) fields_len += rh->fields[i].name_len + rh->fields[i].value_len; } - nxt_unit_response_init(ctx->req, 200, rh->nfields, fields_len); + nxt_unit_response_init(ctx->req, ctx->status, rh->nfields, fields_len); for (i = 0; i < rh->nfields; i++) { const char *name; @@ -72,7 +77,7 @@ nxt_wasm_do_send_response(nxt_wasm_ctx_t *ctx, uint32_t offset) nxt_unit_request_info_t *req = ctx->req; if (!nxt_unit_response_is_init(req)) { - nxt_unit_response_init(req, 200, 0, 0); + nxt_unit_response_init(req, ctx->status, 0, 0); } resp = (nxt_wasm_response_t *)(nxt_wasm_ctx.baddr + offset); @@ -84,6 +89,7 @@ nxt_wasm_do_send_response(nxt_wasm_ctx_t *ctx, uint32_t offset) static void nxt_wasm_request_handler(nxt_unit_request_info_t *req) { + int err; size_t offset, read_bytes, content_sent, content_len; ssize_t bytes_read; nxt_unit_field_t *sf, *sf_end; @@ -149,8 +155,12 @@ nxt_wasm_request_handler(nxt_unit_request_info_t *req) wr->request_size = offset + bytes_read; + nxt_wasm_ctx.status = NXT_WASM_HTTP_OK; nxt_wasm_ctx.req = req; - nxt_wops->exec_request(&nxt_wasm_ctx); + err = nxt_wops->exec_request(&nxt_wasm_ctx); + if (err) { + goto out_err_500; + } if (content_len == content_sent) { goto request_done; @@ -168,9 +178,18 @@ nxt_wasm_request_handler(nxt_unit_request_info_t *req) wr->request_size = wr->content_sent = bytes_read; wr->total_content_sent = content_sent; - nxt_wops->exec_request(&nxt_wasm_ctx); + err = nxt_wops->exec_request(&nxt_wasm_ctx); + if (err) { + goto out_err_500; + } } while (content_sent < content_len); + goto request_done; + +out_err_500: + nxt_unit_response_init(req, NXT_WASM_HTTP_ERROR, 0, 0); + nxt_unit_request_done(req, NXT_UNIT_OK); + request_done: NXT_WASM_DO_HOOK(NXT_WASM_FH_REQUEST_END); } |