fix: do not dedup header values (#8998)

This commit is contained in:
Yury Semikhatsky 2021-09-17 17:19:13 -07:00 committed by GitHub
parent cb7285a8c0
commit cc15227327
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 27 deletions

View file

@ -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;
} }

View file

@ -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);

View file

@ -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);
});