diff --git a/packages/playwright-core/src/server/chromium/crNetworkManager.ts b/packages/playwright-core/src/server/chromium/crNetworkManager.ts index 54a648877e..c59d919f8d 100644 --- a/packages/playwright-core/src/server/chromium/crNetworkManager.ts +++ b/packages/playwright-core/src/server/chromium/crNetworkManager.ts @@ -208,13 +208,16 @@ export class CRNetworkManager { } else { const existingRequest = this._requestIdToRequest.get(requestId); const alreadyContinuedParams = existingRequest?._route?._alreadyContinuedParams; - if (alreadyContinuedParams) { + if (alreadyContinuedParams && !event.redirectedRequestId) { // Sometimes Chromium network stack restarts the request internally. // For example, when no-cors request hits a "less public address space", it should be resent with cors. // There are some more examples here: https://source.chromium.org/chromium/chromium/src/+/main:services/network/url_loader.cc;l=1205-1234;drc=d5dd931e0ad3d9ffe74888ec62a3cc106efd7ea6 // There are probably even more cases deep inside the network stack. // // Anyway, in this case, continue the request in the same way as before, and it should go through. + // + // Note: make sure not to prematurely continue the redirect, which shares the + // `networkId` between the original request and the redirect. this._session._sendMayFail('Fetch.continueRequest', { ...alreadyContinuedParams, requestId: event.requestId,