fix: override cookie even if new is expired (#17998)

This commit is contained in:
Barbara Lócsi 2022-10-12 08:06:16 +02:00 committed by GitHub
parent 5484865583
commit 347544db09
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 58 additions and 8 deletions

View file

@ -83,22 +83,18 @@ export class CookieStore {
}
private _addCookie(cookie: Cookie) {
if (cookie.expired())
return;
let set = this._nameToCookies.get(cookie.name());
if (!set) {
set = new Set();
this._nameToCookies.set(cookie.name(), set);
}
CookieStore.pruneExpired(set);
// https://datatracker.ietf.org/doc/html/rfc6265#section-5.3
for (const other of set) {
if (other.equals(cookie)) {
cookie.updateExpiresFrom(other);
if (other.equals(cookie))
set.delete(other);
}
}
set.add(cookie);
CookieStore.pruneExpired(set);
}
private *_cookiesIterator(): IterableIterator<Cookie> {

View file

@ -20,8 +20,8 @@ import type { APIRequestContext } from 'playwright-core';
import { expect, playwrightTest } from '../config/browserTest';
export type GlobalFetchFixtures = {
request: APIRequestContext;
};
request: APIRequestContext;
};
const it = playwrightTest.extend<GlobalFetchFixtures>({
request: async ({ playwright }, use) => {
@ -206,6 +206,60 @@ it('should store cookie from Set-Cookie header even if it contains equal signs',
});
});
it('should override cookie from Set-Cookie header', async ({ request, server }) => {
const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
server.setRoute('/setcookie.html', (req, res) => {
res.setHeader('Set-Cookie', [`a=old; expires=${tomorrow.toUTCString()}`]);
res.end();
});
const dayAfterTomorrow = new Date(tomorrow);
dayAfterTomorrow.setDate(tomorrow.getDate() + 1);
const dayAfterTomorrowInSeconds = Math.floor(dayAfterTomorrow.valueOf() / 1000);
server.setRoute('/updatecookie.html', (req, res) => {
res.setHeader('Set-Cookie', [`a=new; expires=${dayAfterTomorrow.toUTCString()}`]);
res.end();
});
await request.get(`${server.PREFIX}/setcookie.html`);
await request.get(`${server.PREFIX}/updatecookie.html`);
const state = await request.storageState();
expect(state.cookies).toHaveLength(1);
expect(state.cookies[0].name).toBe(`a`);
expect(state.cookies[0].value).toBe(`new`);
expect(state.cookies[0].expires).toBe(dayAfterTomorrowInSeconds);
});
it('should override cookie from Set-Cookie header even if it expired', async ({ request, server }) => {
const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
server.setRoute('/setcookie.html', (req, res) => {
res.setHeader('Set-Cookie', [`a=ok`, `b=ok; expires=${tomorrow.toUTCString()}`]);
res.end();
});
server.setRoute('/unsetsetcookie.html', (req, res) => {
const pastDateString = new Date(1970, 0, 1, 0, 0, 0, 0).toUTCString();
res.setHeader('Set-Cookie', [`a=; expires=${pastDateString}`, `b=; expires=${pastDateString}`]);
res.end();
});
await request.get(`${server.PREFIX}/setcookie.html`);
await request.get(`${server.PREFIX}/unsetsetcookie.html`);
const [serverRequest] = await Promise.all([
server.waitForRequest('/empty.html'),
request.get(server.EMPTY_PAGE)
]);
expect(serverRequest.headers.cookie).toBeFalsy();
});
it('should export cookies to storage state', async ({ request, server }) => {
const expires = new Date('12/31/2100 PST');
server.setRoute('/setcookie.html', (req, res) => {