summaryrefslogtreecommitdiff
path: root/runtime/js
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/js')
-rw-r--r--runtime/js/40_http.js65
1 files changed, 38 insertions, 27 deletions
diff --git a/runtime/js/40_http.js b/runtime/js/40_http.js
index 67faf19cb..afc5635ac 100644
--- a/runtime/js/40_http.js
+++ b/runtime/js/40_http.js
@@ -136,40 +136,51 @@
respBody = new Uint8Array(0);
}
- const responseBodyRid = await Deno.core.opAsync("op_http_response", [
- responseSenderRid,
- innerResp.status ?? 200,
- innerResp.headerList,
- ], respBody instanceof Uint8Array ? respBody : null);
+ let responseBodyRid;
+ try {
+ responseBodyRid = await Deno.core.opAsync("op_http_response", [
+ responseSenderRid,
+ innerResp.status ?? 200,
+ innerResp.headerList,
+ ], respBody instanceof Uint8Array ? respBody : null);
+ } catch (error) {
+ if (respBody !== null && respBody instanceof ReadableStream) {
+ await respBody.cancel(error);
+ }
+ throw error;
+ }
// If `respond` returns a responseBodyRid, we should stream the body
// to that resource.
if (responseBodyRid !== null) {
- if (respBody === null || !(respBody instanceof ReadableStream)) {
- throw new TypeError("Unreachable");
- }
- const reader = respBody.getReader();
- while (true) {
- const { value, done } = await reader.read();
- if (done) break;
- if (!(value instanceof Uint8Array)) {
- await reader.cancel("value not a Uint8Array");
- break;
+ try {
+ if (respBody === null || !(respBody instanceof ReadableStream)) {
+ throw new TypeError("Unreachable");
}
- try {
- await Deno.core.opAsync(
- "op_http_response_write",
- responseBodyRid,
- value,
- );
- } catch (err) {
- await reader.cancel(err);
- break;
+ const reader = respBody.getReader();
+ while (true) {
+ const { value, done } = await reader.read();
+ if (done) break;
+ if (!(value instanceof Uint8Array)) {
+ await reader.cancel(new TypeError("Value not a Uint8Array"));
+ break;
+ }
+ try {
+ await Deno.core.opAsync(
+ "op_http_response_write",
+ responseBodyRid,
+ value,
+ );
+ } catch (error) {
+ await reader.cancel(error);
+ throw error;
+ }
}
+ } finally {
+ // Once all chunks are sent, and the request body is closed, we can
+ // close the response body.
+ await Deno.core.opAsync("op_http_response_close", responseBodyRid);
}
- // Once all chunks are sent, and the request body is closed, we can close
- // the response body.
- await Deno.core.opAsync("op_http_response_close", responseBodyRid);
}
};
}