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 /ext/flash/01_http.js | |
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 'ext/flash/01_http.js')
-rw-r--r-- | ext/flash/01_http.js | 30 |
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; |