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.
This commit is contained in:
Dmitry Gozman 2023-10-09 20:08:35 -07:00 committed by GitHub
parent fd6bf8aa2c
commit 2407041090
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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,