diff options
author | Kamil Ogórek <kamil.ogorek@gmail.com> | 2023-01-14 15:06:28 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-14 15:06:28 +0100 |
commit | 1d7203c24c2ca2fa5c75a149324ebd5bf806102a (patch) | |
tree | 0b5f2f93a2694cba6c53a067aa30ba97b978fd81 /cli/tests/unit/flash_test.ts | |
parent | ae2981d7acea79f3513b273ccf1cd2dc9d4dbbda (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.ts | 46 |
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() { |