fix(ext/fetch): new Request should soft clone (#16869)

Previously the inner request object of the original and the new request
were the same, causing the requests to be entangled and mutable changes
to one to be visible to the other. This fixes that.
This commit is contained in:
Luca Casonato 2022-12-06 09:39:04 +01:00 committed by GitHub
parent 3973ceb634
commit 923370f18f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 12 deletions

View file

@ -157,14 +157,14 @@
* @param {InnerRequest} request
* @returns {InnerRequest}
*/
function cloneInnerRequest(request) {
function cloneInnerRequest(request, skipBody = false) {
const headerList = ArrayPrototypeMap(
request.headerList,
(x) => [x[0], x[1]],
);
let body = null;
if (request.body !== null) {
if (request.body !== null && !skipBody) {
body = request.body.clone();
}
@ -315,12 +315,14 @@
if (!ObjectPrototypeIsPrototypeOf(RequestPrototype, input)) {
throw new TypeError("Unreachable");
}
request = input[_request];
const originalReq = input[_request];
// fold in of step 12 from below
request = cloneInnerRequest(originalReq, true);
request.redirectCount = 0; // reset to 0 - cloneInnerRequest copies the value
signal = input[_signal];
}
// 12.
// TODO(lucacasonato): create a copy of `request`
// 12. is folded into the else statement of step 6 above.
// 22.
if (init.redirect !== undefined) {