From ed919f3dda06e23601df046c0c16ec160ff3c0af Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Fri, 15 Sep 2023 09:26:39 -0700 Subject: [PATCH] cherry-pick(#27098): fix(har): handle invalid Expires/Max-Age (#27123) Fixes #27073. --- .../playwright-core/src/server/har/harTracer.ts | 13 ++++++++++--- tests/library/har.spec.ts | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/packages/playwright-core/src/server/har/harTracer.ts b/packages/playwright-core/src/server/har/harTracer.ts index c1907fbd3f6b6..531ffe9e32ad0 100644 --- a/packages/playwright-core/src/server/har/harTracer.ts +++ b/packages/playwright-core/src/server/har/harTracer.ts @@ -223,7 +223,7 @@ export class HarTracer { harEntry.response.cookies = this._options.omitCookies ? [] : event.cookies.map(c => { return { ...c, - expires: c.expires === -1 ? undefined : new Date(c.expires).toISOString() + expires: c.expires === -1 ? undefined : safeDateToISOString(c.expires) }; }); @@ -658,11 +658,11 @@ function parseCookie(c: string): har.Cookie { if (name === 'Domain') cookie.domain = value; if (name === 'Expires') - cookie.expires = new Date(value).toISOString(); + cookie.expires = safeDateToISOString(value); if (name === 'HttpOnly') cookie.httpOnly = true; if (name === 'Max-Age') - cookie.expires = new Date(Date.now() + (+value) * 1000).toISOString(); + cookie.expires = safeDateToISOString(Date.now() + (+value) * 1000); if (name === 'Path') cookie.path = value; if (name === 'SameSite') @@ -673,4 +673,11 @@ function parseCookie(c: string): har.Cookie { return cookie; } +function safeDateToISOString(value: string | number) { + try { + return new Date(value).toISOString(); + } catch (e) { + } +} + const startedDateSymbol = Symbol('startedDate'); \ No newline at end of file diff --git a/tests/library/har.spec.ts b/tests/library/har.spec.ts index 58e8bf5f920c2..2a48aa1bcbe28 100644 --- a/tests/library/har.spec.ts +++ b/tests/library/har.spec.ts @@ -226,6 +226,20 @@ it('should include set-cookies', async ({ contextFactory, server }, testInfo) => expect(new Date(cookies[2].expires).valueOf()).toBeGreaterThan(Date.now()); }); +it('should skip invalid Expires', async ({ contextFactory, server }, testInfo) => { + const { page, getLog } = await pageWithHar(contextFactory, testInfo); + server.setRoute('/empty.html', (req, res) => { + res.setHeader('Set-Cookie', [ + 'name=value;Expires=Sat Sep 14 01:02:27 CET 2024', + ]); + res.end(); + }); + await page.goto(server.EMPTY_PAGE); + const log = await getLog(); + const cookies = log.entries[0].response.cookies; + expect(cookies[0]).toEqual({ name: 'name', value: 'value' }); +}); + it('should include set-cookies with comma', async ({ contextFactory, server, browserName }, testInfo) => { it.fixme(browserName === 'webkit', 'We get "name1=val, ue1, name2=val, ue2" as a header value'); const { page, getLog } = await pageWithHar(contextFactory, testInfo);