fix: do not dedup header values (#8998)
This commit is contained in:
parent
cb7285a8c0
commit
cc15227327
|
|
@ -15,23 +15,23 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export class MultiMap<K, V> {
|
export class MultiMap<K, V> {
|
||||||
private _map: Map<K, Set<V>>;
|
private _map: Map<K, V[]>;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this._map = new Map<K, Set<V>>();
|
this._map = new Map<K, V[]>();
|
||||||
}
|
}
|
||||||
|
|
||||||
set(key: K, value: V) {
|
set(key: K, value: V) {
|
||||||
let set = this._map.get(key);
|
let values = this._map.get(key);
|
||||||
if (!set) {
|
if (!values) {
|
||||||
set = new Set<V>();
|
values = [];
|
||||||
this._map.set(key, set);
|
this._map.set(key, values);
|
||||||
}
|
}
|
||||||
set.add(value);
|
values.push(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
get(key: K): Set<V> {
|
get(key: K): V[] {
|
||||||
return this._map.get(key) || new Set();
|
return this._map.get(key) || [];
|
||||||
}
|
}
|
||||||
|
|
||||||
has(key: K): boolean {
|
has(key: K): boolean {
|
||||||
|
|
@ -39,28 +39,16 @@ export class MultiMap<K, V> {
|
||||||
}
|
}
|
||||||
|
|
||||||
hasValue(key: K, value: V): boolean {
|
hasValue(key: K, value: V): boolean {
|
||||||
const set = this._map.get(key);
|
const values = this._map.get(key);
|
||||||
if (!set)
|
if (!values)
|
||||||
return false;
|
return false;
|
||||||
return set.has(value);
|
return values.includes(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
get size(): number {
|
get size(): number {
|
||||||
return this._map.size;
|
return this._map.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete(key: K, value: V): boolean {
|
|
||||||
const values = this.get(key);
|
|
||||||
const result = values.delete(value);
|
|
||||||
if (!values.size)
|
|
||||||
this._map.delete(key);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
deleteAll(key: K) {
|
|
||||||
this._map.delete(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
keys(): IterableIterator<K> {
|
keys(): IterableIterator<K> {
|
||||||
return this._map.keys();
|
return this._map.keys();
|
||||||
}
|
}
|
||||||
|
|
@ -68,7 +56,7 @@ export class MultiMap<K, V> {
|
||||||
values(): Iterable<V> {
|
values(): Iterable<V> {
|
||||||
const result: V[] = [];
|
const result: V[] = [];
|
||||||
for (const key of this.keys())
|
for (const key of this.keys())
|
||||||
result.push(...Array.from(this.get(key)!));
|
result.push(...this.get(key));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -213,10 +213,14 @@ it('should pause intercepted fetch request until continue', async ({page, server
|
||||||
expect(status).toBe(200);
|
expect(status).toBe(200);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should work with custom referer headers', async ({page, server}) => {
|
it('should work with custom referer headers', async ({page, server, browserName}) => {
|
||||||
await page.setExtraHTTPHeaders({ 'referer': server.EMPTY_PAGE });
|
await page.setExtraHTTPHeaders({ 'referer': server.EMPTY_PAGE });
|
||||||
await page.route('**/*', route => {
|
await page.route('**/*', route => {
|
||||||
expect(route.request().headers()['referer']).toBe(server.EMPTY_PAGE);
|
// See https://github.com/microsoft/playwright/issues/8999
|
||||||
|
if (browserName === 'chromium')
|
||||||
|
expect(route.request().headers()['referer']).toBe(server.EMPTY_PAGE + ', ' + server.EMPTY_PAGE);
|
||||||
|
else
|
||||||
|
expect(route.request().headers()['referer']).toBe(server.EMPTY_PAGE);
|
||||||
route.continue();
|
route.continue();
|
||||||
});
|
});
|
||||||
const response = await page.goto(server.EMPTY_PAGE);
|
const response = await page.goto(server.EMPTY_PAGE);
|
||||||
|
|
|
||||||
|
|
@ -60,3 +60,11 @@ it('should throw for non-string header values', async ({page}) => {
|
||||||
const error2 = await page.context().setExtraHTTPHeaders({ 'foo': true }).catch(e => e);
|
const error2 = await page.context().setExtraHTTPHeaders({ 'foo': true }).catch(e => e);
|
||||||
expect(error2.message).toContain('Expected value of header "foo" to be String, but "boolean" is found.');
|
expect(error2.message).toContain('Expected value of header "foo" to be String, but "boolean" is found.');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should not duplicate referer header', async ({page, server, browserName}) => {
|
||||||
|
it.fail(browserName === 'chromium', 'Request has referer and Referer');
|
||||||
|
await page.setExtraHTTPHeaders({ 'referer': server.EMPTY_PAGE });
|
||||||
|
const response = await page.goto(server.EMPTY_PAGE);
|
||||||
|
expect(response.ok()).toBe(true);
|
||||||
|
expect(response.request().headers()['referer']).toBe(server.EMPTY_PAGE);
|
||||||
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue