From 501ed3285638c3254410017063b57a0f1635b4f0 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Mon, 28 Aug 2023 12:42:50 -0700 Subject: [PATCH] fix(fetch): update host header on redirect (#26750) Fixes https://github.com/microsoft/playwright/issues/26743 --- packages/playwright-core/src/server/fetch.ts | 7 ++++- tests/library/browsercontext-fetch.spec.ts | 31 +++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/packages/playwright-core/src/server/fetch.ts b/packages/playwright-core/src/server/fetch.ts index 58921d11f4392..d439d393a3ad8 100644 --- a/packages/playwright-core/src/server/fetch.ts +++ b/packages/playwright-core/src/server/fetch.ts @@ -291,7 +291,7 @@ export abstract class APIRequestContext extends SdkObject { request.destroy(); return; } - const headers: HeadersObject = { ...options.headers }; + const headers = { ...options.headers }; removeHeader(headers, `cookie`); // HTTP-redirect fetch step 13 (https://fetch.spec.whatwg.org/#http-redirect-fetch) @@ -308,6 +308,7 @@ export abstract class APIRequestContext extends SdkObject { removeHeader(headers, `content-type`); } + const redirectOptions: SendRequestOptions = { method, headers, @@ -331,6 +332,10 @@ export abstract class APIRequestContext extends SdkObject { request.destroy(); return; } + + if (headers['host']) + headers['host'] = locationURL.host; + notifyRequestFinished(); fulfill(this._sendRequest(progress, locationURL, redirectOptions, postData)); request.destroy(); diff --git a/tests/library/browsercontext-fetch.spec.ts b/tests/library/browsercontext-fetch.spec.ts index 913c21c664327..de0da3a118c56 100644 --- a/tests/library/browsercontext-fetch.spec.ts +++ b/tests/library/browsercontext-fetch.spec.ts @@ -1123,4 +1123,33 @@ it('should support set-cookie with SameSite and without Secure attribute over HT expect(cookie.sameSite).toBe(value); }); } -}); \ No newline at end of file +}); + +it('should update host header on redirect', async ({ context, server }) => { + it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/26743' }); + let redirectCount = 0; + server.setRoute('/redirect', (req, res) => { + redirectCount++; + const path = (req.headers.host === new URL(server.PREFIX).host) ? '/redirect' : '/test'; + res.writeHead(302, { + host: new URL(server.CROSS_PROCESS_PREFIX).host, + location: server.CROSS_PROCESS_PREFIX + path, + }); + res.end(); + }); + server.setRoute('/test', (req, res) => { + res.writeHead(200, { + 'content-type': 'text/plain', + }); + res.end('Hello!'); + }); + const reqPromise = server.waitForRequest('/test'); + const response = await context.request.get(server.PREFIX + '/redirect', { + headers: { host: new URL(server.PREFIX).host } + }); + expect(redirectCount).toBe(2); + await expect(response).toBeOK(); + expect(await response.text()).toBe('Hello!'); + + expect((await reqPromise).headers.host).toBe(new URL(server.CROSS_PROCESS_PREFIX).host); +});