From ed344a882b2628a2be80b866528d3900bd0bf9f6 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Mon, 2 May 2022 12:38:57 -0700 Subject: [PATCH] fix: delete headers with undefined value (#13880) --- packages/playwright-core/src/utils/index.ts | 2 ++ tests/page/page-request-continue.spec.ts | 38 +++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/packages/playwright-core/src/utils/index.ts b/packages/playwright-core/src/utils/index.ts index 16085e74d7..feb2212dae 100644 --- a/packages/playwright-core/src/utils/index.ts +++ b/packages/playwright-core/src/utils/index.ts @@ -132,6 +132,8 @@ export function headersObjectToArray(headers: HeadersObject, separator?: string, const result: HeadersArray = []; for (const name in headers) { const values = headers[name]; + if (values === undefined) + continue; if (separator) { const sep = name.toLowerCase() === 'set-cookie' ? setCookieSeparator : separator; for (const value of values.split(sep!)) diff --git a/tests/page/page-request-continue.spec.ts b/tests/page/page-request-continue.spec.ts index e5c4077742..50fc36e48d 100644 --- a/tests/page/page-request-continue.spec.ts +++ b/tests/page/page-request-continue.spec.ts @@ -36,6 +36,44 @@ it('should amend HTTP headers', async ({ page, server }) => { expect(request.headers['foo']).toBe('bar'); }); +it('should delete header with undefined value', async ({ page, server, browserName }) => { + it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/13106' }); + + await page.goto(server.PREFIX + '/empty.html'); + server.setRoute('/something', (request, response) => { + response.writeHead(200, { 'Access-Control-Allow-Origin': '*' }); + response.end('done'); + }); + let interceptedRequest; + await page.route(server.PREFIX + '/something', async (route, request) => { + interceptedRequest = request; + const headers = await request.allHeaders(); + route.continue({ + headers: { + ...headers, + foo: undefined + } + }); + }); + + const [text, serverRequest] = await Promise.all([ + page.evaluate(async url => { + const data = await fetch(url, { + headers: { + foo: 'a', + bar: 'b', + } + }); + return data.text(); + }, server.PREFIX + '/something'), + server.waitForRequest('/something') + ]); + expect(text).toBe('done'); + expect(interceptedRequest.headers()['foo']).toEqual('a'); + expect(serverRequest.headers.foo).toBeFalsy(); + expect(serverRequest.headers.bar).toBe('b'); +}); + it('should amend method', async ({ page, server }) => { const sRequest = server.waitForRequest('/sleep.zzz'); await page.goto(server.EMPTY_PAGE);