diff --git a/packages/playwright-core/src/server/bidi/bidiNetworkManager.ts b/packages/playwright-core/src/server/bidi/bidiNetworkManager.ts index b6807e731d457..a0c033f511aef 100644 --- a/packages/playwright-core/src/server/bidi/bidiNetworkManager.ts +++ b/packages/playwright-core/src/server/bidi/bidiNetworkManager.ts @@ -68,8 +68,16 @@ export class BidiNetworkManager { // We do not support intercepting redirects. if (redirectedFrom) { let params = {}; - if (redirectedFrom._originalRequestRoute?._alreadyContinuedHeaders) - params = toBidiRequestHeaders(redirectedFrom._originalRequestRoute._alreadyContinuedHeaders ?? []); + if (redirectedFrom._originalRequestRoute?._alreadyContinuedHeaders) { + const { headers } = toBidiRequestHeaders(redirectedFrom._originalRequestRoute._alreadyContinuedHeaders ?? []); + const hostHeader = headers.find(header => header.name.toLowerCase() === 'host'); + if (hostHeader) { + const requestHostHeader = param.request.headers.find(header => header.name.toLowerCase() === 'host'); + if (requestHostHeader) + hostHeader.value = requestHostHeader.value; + } + params = { headers }; + } this._session.sendMayFail('network.continueRequest', { request: param.request.request, diff --git a/packages/playwright-core/src/server/firefox/ffNetworkManager.ts b/packages/playwright-core/src/server/firefox/ffNetworkManager.ts index 50bb3017a301c..56a8861b68839 100644 --- a/packages/playwright-core/src/server/firefox/ffNetworkManager.ts +++ b/packages/playwright-core/src/server/firefox/ffNetworkManager.ts @@ -225,6 +225,8 @@ class FFRouteImpl implements network.RouteDelegate { private _request: InterceptableRequest; private _session: FFSession; + readonly removeHostHeaderFromOverrides = true; + constructor(session: FFSession, request: InterceptableRequest) { this._session = session; this._request = request; diff --git a/packages/playwright-core/src/server/network.ts b/packages/playwright-core/src/server/network.ts index f9ad37aa6c2b0..831cb2d9acbce 100644 --- a/packages/playwright-core/src/server/network.ts +++ b/packages/playwright-core/src/server/network.ts @@ -358,10 +358,10 @@ export class Route extends SdkObject { throw new Error('New URL must have same protocol as overridden URL'); } if (overrides.headers) { - overrides.headers = overrides.headers?.filter(header => { - const headerName = header.name.toLowerCase(); - return headerName !== 'cookie' && headerName !== 'host'; - }); + const headersToRemove = ['cookie']; + if (this._delegate.removeHostHeaderFromOverrides) + headersToRemove.push('host'); + overrides.headers = overrides.headers.filter(header => !headersToRemove.includes(header.name)); } overrides = this._request._applyOverrides(overrides); @@ -668,6 +668,7 @@ export class WebSocket extends SdkObject { } export interface RouteDelegate { + readonly removeHostHeaderFromOverrides?: boolean; abort(errorCode: string): Promise; fulfill(response: types.NormalizedFulfillResponse): Promise; continue(overrides: types.NormalizedContinueOverrides): Promise; diff --git a/packages/playwright-core/src/server/webkit/wkInterceptableRequest.ts b/packages/playwright-core/src/server/webkit/wkInterceptableRequest.ts index e4cd9a78f0c76..8a2888fa19db5 100644 --- a/packages/playwright-core/src/server/webkit/wkInterceptableRequest.ts +++ b/packages/playwright-core/src/server/webkit/wkInterceptableRequest.ts @@ -107,6 +107,8 @@ export class WKRouteImpl implements network.RouteDelegate { private readonly _session: WKSession; private readonly _requestId: string; + readonly removeHostHeaderFromOverrides = true; + constructor(session: WKSession, requestId: string) { this._session = session; this._requestId = requestId;