From 2407041090c5e662c33e6a0d66334f2906818cad Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Mon, 9 Oct 2023 20:08:35 -0700 Subject: [PATCH] fix(chromium): avoid premature continue of redirects (#27520) This has recently regressed in #27429. We now continue requests that are paused for the second time. However, redirects share `networkId` with the original request, so we may confuse paused redirect with a second pause for the original request. This is covered by the flaky test `page-route.spec.ts:392 > should work with redirects for subresources` References #27294. --- .../playwright-core/src/server/chromium/crNetworkManager.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/playwright-core/src/server/chromium/crNetworkManager.ts b/packages/playwright-core/src/server/chromium/crNetworkManager.ts index 54a648877e94e..c59d919f8dba1 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,