Skip to content

Commit 0385672

Browse files
authored
fix(firefox): filter host header from overrides (microsoft#36932)
1 parent c5a66d0 commit 0385672

File tree

2 files changed

+20
-10
lines changed

2 files changed

+20
-10
lines changed

packages/playwright-core/src/server/network.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -349,8 +349,12 @@ export class Route extends SdkObject {
349349
if (oldUrl.protocol !== newUrl.protocol)
350350
throw new Error('New URL must have same protocol as overridden URL');
351351
}
352-
if (overrides.headers)
353-
overrides.headers = overrides.headers?.filter(header => header.name.toLowerCase() !== 'cookie');
352+
if (overrides.headers) {
353+
overrides.headers = overrides.headers?.filter(header => {
354+
const headerName = header.name.toLowerCase();
355+
return headerName !== 'cookie' && headerName !== 'host';
356+
});
357+
}
354358
overrides = this._request._applyOverrides(overrides);
355359

356360
const nextHandler = this._futureHandlers.shift();

tests/page/page-request-continue.spec.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ it('should not allow to override unsafe HTTP headers', async ({ page, server, br
5151
const error = await route.continue({
5252
headers: {
5353
...route.request().headers(),
54-
host: 'bar'
54+
host: 'bar',
55+
trailer: 'baz',
5556
}
5657
}).catch(e => e);
5758
if (isElectron) {
@@ -67,7 +68,8 @@ it('should not allow to override unsafe HTTP headers', async ({ page, server, br
6768
// These lines just document current behavior in FF and WK,
6869
// we don't necessarily want to maintain this behavior.
6970
const serverRequest = await serverRequestPromise;
70-
expect(serverRequest.headers['host']).toBe('bar');
71+
expect(serverRequest.headers['trailer']).toBe('baz');
72+
expect(serverRequest.headers['host']).toBe(new URL(server.EMPTY_PAGE).host);
7173
}
7274
});
7375

@@ -902,29 +904,33 @@ it('should not forward Host header on cross-origin redirect', {
902904
description: 'https://github.com/microsoft/playwright/issues/36719'
903905
}
904906
}, async ({ page, server, browserName }) => {
905-
it.fixme(browserName === 'firefox', 'https://github.com/microsoft/playwright/issues/36719');
906-
907907
const redirectTargetPath = '/final';
908908
const redirectSourcePath = '/redirect';
909909

910-
let receivedHostHeader: string | undefined;
910+
let redirectedHost: string | undefined;
911911
server.setRoute(redirectTargetPath, (req, res) => {
912-
receivedHostHeader = req.headers['host'];
912+
redirectedHost = req.headers['host'];
913913
res.end('OK');
914914
});
915915

916+
let firstHost: string | undefined;
916917
server.setRoute(redirectSourcePath, (req, res) => {
918+
firstHost = req.headers['host'];
917919
res.writeHead(302, { ___location: `${server.CROSS_PROCESS_PREFIX}${redirectTargetPath}` });
918920
res.end();
919921
});
920922

921923
await page.route('**/*', async route => {
922924
const headers = route.request().headers();
923-
expect(headers).not.toHaveProperty('host');
925+
if (browserName === 'firefox')
926+
expect(headers).toHaveProperty('host');
927+
else
928+
expect(headers).not.toHaveProperty('host');
924929
await route.continue({ headers });
925930
});
926931

927932
const response = await page.goto(server.PREFIX + redirectSourcePath);
928933
expect(response.status()).toBe(200);
929-
expect(receivedHostHeader).toBe(new URL(server.CROSS_PROCESS_PREFIX).host);
934+
expect(firstHost).toBe(new URL(server.PREFIX).host);
935+
expect(redirectedHost).toBe(new URL(server.CROSS_PROCESS_PREFIX).host);
930936
});

0 commit comments

Comments
 (0)