summaryrefslogtreecommitdiff
path: root/ext/flash/01_http.js
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 /ext/flash/01_http.js
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 'ext/flash/01_http.js')
-rw-r--r--ext/flash/01_http.js30
1 files changed, 14 insertions, 16 deletions
diff --git a/ext/flash/01_http.js b/ext/flash/01_http.js
index e76914e72..e76f4de52 100644
--- a/ext/flash/01_http.js
+++ b/ext/flash/01_http.js
@@ -327,7 +327,7 @@
);
}
- (async () => {
+ return (async () => {
if (!ws) {
if (hasBody && body[_state] !== "closed") {
// TODO(@littledivy): Optimize by draining in a single op.
@@ -590,7 +590,6 @@
),
onError,
);
- continue;
} else if (typeof resp?.then === "function") {
resp.then((resp) =>
handleResponse(
@@ -606,24 +605,23 @@
tryRespondChunked,
)
).catch(onError);
- continue;
+ } else {
+ handleResponse(
+ req,
+ resp,
+ body,
+ hasBody,
+ method,
+ serverId,
+ i,
+ respondFast,
+ respondChunked,
+ tryRespondChunked,
+ ).catch(onError);
}
} catch (e) {
resp = await onError(e);
}
-
- handleResponse(
- req,
- resp,
- body,
- hasBody,
- method,
- serverId,
- i,
- respondFast,
- respondChunked,
- tryRespondChunked,
- );
}
offset += tokens;