summaryrefslogtreecommitdiff
path: root/cli/tests/unit/flash_test.ts
diff options
context:
space:
mode:
authorKamil Ogórek <kamil.ogorek@gmail.com>2023-01-14 15:06:28 +0100
committerGitHub <noreply@github.com>2023-01-14 15:06:28 +0100
commit1d7203c24c2ca2fa5c75a149324ebd5bf806102a (patch)
tree0b5f2f93a2694cba6c53a067aa30ba97b978fd81 /cli/tests/unit/flash_test.ts
parentae2981d7acea79f3513b273ccf1cd2dc9d4dbbda (diff)
fix(ext/flash): Correctly handle errors for chunked responses (#17303)
The leading cause of the problem was that `handleResponse` has `tryRespondChunked` passed as an argument, which in turn is implemented as a call to `core.ops.op_try_flash_respond_chuncked`, that throws in the repro code. `handleResponse` was not handled correctly, as it not returned any value, and had no `catch` attached to it. It also effectively was never correctly handled inside two other blocks with `resp.then` and `PromisePrototypeCatch(PromisePrototypeThen(resp, "..."))` as well, as it just short-circuited the promise with an empty resolve, instead of relying on the last `(async () => {})` block. This change makes `handleResponse` return a correct value and attach `onError` handler to the "non-thenable" variant of response handling code.
Diffstat (limited to 'cli/tests/unit/flash_test.ts')
-rw-r--r--cli/tests/unit/flash_test.ts46
1 files changed, 46 insertions, 0 deletions
diff --git a/cli/tests/unit/flash_test.ts b/cli/tests/unit/flash_test.ts
index 9491e4534..5604f6b5f 100644
--- a/cli/tests/unit/flash_test.ts
+++ b/cli/tests/unit/flash_test.ts
@@ -12,6 +12,7 @@ import {
assert,
assertEquals,
assertRejects,
+ assertStringIncludes,
assertThrows,
Deferred,
deferred,
@@ -495,6 +496,51 @@ Deno.test(
},
);
+// https://github.com/denoland/deno/issues/17291
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerIncorrectChunkedResponse() {
+ const ac = new AbortController();
+ const listeningPromise = deferred();
+ const errorPromise = deferred();
+ const server = Deno.serve({
+ handler: () => {
+ const body = new ReadableStream({
+ start(controller) {
+ // Non-encoded string is not a valid readable chunk.
+ controller.enqueue("wat");
+ },
+ });
+ return new Response(body);
+ },
+ port: 4501,
+ signal: ac.signal,
+ onListen: onListen(listeningPromise),
+ onError: (err) => {
+ const errResp = new Response(
+ `Internal server error: ${(err as Error).message}`,
+ { status: 500 },
+ );
+ ac.abort();
+ errorPromise.resolve(errResp);
+ return errResp;
+ },
+ });
+
+ await listeningPromise;
+
+ const resp = await fetch("http://127.0.0.1:4501/");
+ // Incorrectly implemented reader ReadableStream should reject.
+ await assertRejects(() => resp.body!.getReader().read());
+
+ const err = await errorPromise as Response;
+ assertStringIncludes(await err.text(), "Expected ArrayBufferView");
+
+ ac.abort();
+ await server;
+ },
+);
+
Deno.test(
{ permissions: { net: true } },
async function httpServerCorrectLengthForUnicodeString() {