fix: override cookie even if new is expired (#17998)
This commit is contained in:
parent
5484865583
commit
347544db09
|
|
@ -83,22 +83,18 @@ export class CookieStore {
|
||||||
}
|
}
|
||||||
|
|
||||||
private _addCookie(cookie: Cookie) {
|
private _addCookie(cookie: Cookie) {
|
||||||
if (cookie.expired())
|
|
||||||
return;
|
|
||||||
let set = this._nameToCookies.get(cookie.name());
|
let set = this._nameToCookies.get(cookie.name());
|
||||||
if (!set) {
|
if (!set) {
|
||||||
set = new Set();
|
set = new Set();
|
||||||
this._nameToCookies.set(cookie.name(), set);
|
this._nameToCookies.set(cookie.name(), set);
|
||||||
}
|
}
|
||||||
CookieStore.pruneExpired(set);
|
|
||||||
// https://datatracker.ietf.org/doc/html/rfc6265#section-5.3
|
// https://datatracker.ietf.org/doc/html/rfc6265#section-5.3
|
||||||
for (const other of set) {
|
for (const other of set) {
|
||||||
if (other.equals(cookie)) {
|
if (other.equals(cookie))
|
||||||
cookie.updateExpiresFrom(other);
|
|
||||||
set.delete(other);
|
set.delete(other);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
set.add(cookie);
|
set.add(cookie);
|
||||||
|
CookieStore.pruneExpired(set);
|
||||||
}
|
}
|
||||||
|
|
||||||
private *_cookiesIterator(): IterableIterator<Cookie> {
|
private *_cookiesIterator(): IterableIterator<Cookie> {
|
||||||
|
|
|
||||||
|
|
@ -20,8 +20,8 @@ import type { APIRequestContext } from 'playwright-core';
|
||||||
import { expect, playwrightTest } from '../config/browserTest';
|
import { expect, playwrightTest } from '../config/browserTest';
|
||||||
|
|
||||||
export type GlobalFetchFixtures = {
|
export type GlobalFetchFixtures = {
|
||||||
request: APIRequestContext;
|
request: APIRequestContext;
|
||||||
};
|
};
|
||||||
|
|
||||||
const it = playwrightTest.extend<GlobalFetchFixtures>({
|
const it = playwrightTest.extend<GlobalFetchFixtures>({
|
||||||
request: async ({ playwright }, use) => {
|
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 }) => {
|
it('should export cookies to storage state', async ({ request, server }) => {
|
||||||
const expires = new Date('12/31/2100 PST');
|
const expires = new Date('12/31/2100 PST');
|
||||||
server.setRoute('/setcookie.html', (req, res) => {
|
server.setRoute('/setcookie.html', (req, res) => {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue