diff options
author | Isaiah Gamble <77396670+tsar-boomba@users.noreply.github.com> | 2023-01-14 23:08:34 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-15 05:08:34 +0100 |
commit | efcbfd5206fcdfac55c26a7133c04dd330d047b9 (patch) | |
tree | d34f0cccd2ffc0cde77e6bcdbc6fa8cf5f64f9b8 /ext/fetch/23_request.js | |
parent | fd85f840cd707c31d08fa836562127e249c9ff62 (diff) |
fix(ext/fetch) Fix request clone error in flash server (#16174)
Diffstat (limited to 'ext/fetch/23_request.js')
-rw-r--r-- | ext/fetch/23_request.js | 50 |
1 files changed, 44 insertions, 6 deletions
diff --git a/ext/fetch/23_request.js b/ext/fetch/23_request.js index b78cf48aa..e266a7e44 100644 --- a/ext/fetch/23_request.js +++ b/ext/fetch/23_request.js @@ -155,9 +155,11 @@ /** * https://fetch.spec.whatwg.org/#concept-request-clone * @param {InnerRequest} request + * @param {boolean} skipBody + * @param {boolean} flash * @returns {InnerRequest} */ - function cloneInnerRequest(request, skipBody = false) { + function cloneInnerRequest(request, skipBody = false, flash = false) { const headerList = ArrayPrototypeMap( request.headerList, (x) => [x[0], x[1]], @@ -168,6 +170,19 @@ body = request.body.clone(); } + if (flash) { + return { + body, + methodCb: request.methodCb, + urlCb: request.urlCb, + headerList: request.headerList, + streamRid: request.streamRid, + serverId: request.serverId, + redirectMode: "follow", + redirectCount: 0, + }; + } + return { method: request.method, headerList, @@ -487,16 +502,30 @@ } let newReq; if (this[_flash]) { - newReq = cloneInnerRequest(this[_flash]); + newReq = cloneInnerRequest(this[_flash], false, true); } else { newReq = cloneInnerRequest(this[_request]); } const newSignal = abortSignal.newSignal(); - abortSignal.follow(newSignal, this[_signal]); + + if (this[_signal]) { + abortSignal.follow(newSignal, this[_signal]); + } + + if (this[_flash]) { + return fromInnerRequest( + newReq, + newSignal, + guardFromHeaders(this[_headers]), + true, + ); + } + return fromInnerRequest( newReq, newSignal, guardFromHeaders(this[_headers]), + false, ); } @@ -573,14 +602,22 @@ /** * @param {InnerRequest} inner + * @param {AbortSignal} signal * @param {"request" | "immutable" | "request-no-cors" | "response" | "none"} guard + * @param {boolean} flash * @returns {Request} */ - function fromInnerRequest(inner, signal, guard) { + function fromInnerRequest(inner, signal, guard, flash) { const request = webidl.createBranded(Request); - request[_request] = inner; + if (flash) { + request[_flash] = inner; + } else { + request[_request] = inner; + } request[_signal] = signal; - request[_getHeaders] = () => headersFromHeaderList(inner.headerList, guard); + request[_getHeaders] = flash + ? () => headersFromHeaderList(inner.headerList(), guard) + : () => headersFromHeaderList(inner.headerList, guard); return request; } @@ -606,6 +643,7 @@ body: body !== null ? new InnerBody(body) : null, methodCb, urlCb, + headerList: headersCb, streamRid, serverId, redirectMode: "follow", |