mirror of
https://github.com/microsoft/playwright.git
synced 2025-01-07 11:46:42 +03:00
feat(har): disambiguate using matching headers (#14995)
This commit is contained in:
parent
45ec2d0825
commit
aaafb77036
@ -24,7 +24,7 @@ import type { DispatcherScope } from './dispatcher';
|
|||||||
import { Dispatcher } from './dispatcher';
|
import { Dispatcher } from './dispatcher';
|
||||||
import { yazl, yauzl } from '../../zipBundle';
|
import { yazl, yauzl } from '../../zipBundle';
|
||||||
import { ZipFile } from '../../utils/zipFile';
|
import { ZipFile } from '../../utils/zipFile';
|
||||||
import type { HAREntry, HARFile } from '../../../types/har';
|
import type { HAREntry, HARFile, HARHeader } from '../../../types/har';
|
||||||
import type { HeadersArray } from '../types';
|
import type { HeadersArray } from '../types';
|
||||||
|
|
||||||
export class LocalUtilsDispatcher extends Dispatcher<{ guid: string }, channels.LocalUtilsChannel> implements channels.LocalUtilsChannel {
|
export class LocalUtilsDispatcher extends Dispatcher<{ guid: string }, channels.LocalUtilsChannel> implements channels.LocalUtilsChannel {
|
||||||
@ -203,7 +203,7 @@ class HarBackend {
|
|||||||
if (entries.length > 1) {
|
if (entries.length > 1) {
|
||||||
// Disambiguating requests
|
// Disambiguating requests
|
||||||
|
|
||||||
// 1. Disambiguate by postData - this covers GraphQL
|
// 1. Disambiguate using postData - this covers GraphQL
|
||||||
if (!entry && postData) {
|
if (!entry && postData) {
|
||||||
for (const candidate of entries) {
|
for (const candidate of entries) {
|
||||||
if (!candidate.request.postData)
|
if (!candidate.request.postData)
|
||||||
@ -216,12 +216,21 @@ class HarBackend {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: disambiguate by headers.
|
// Last. Disambiguate using headers - then one with most matching headers wins.
|
||||||
|
if (!entry) {
|
||||||
|
const list: { candidate: HAREntry, matchingHeaders: number }[] = [];
|
||||||
|
for (const candidate of entries) {
|
||||||
|
const matchingHeaders = countMatchingHeaders(candidate.request.headers, headers);
|
||||||
|
list.push({ candidate, matchingHeaders });
|
||||||
|
}
|
||||||
|
list.sort((a, b) => b.matchingHeaders - a.matchingHeaders);
|
||||||
|
entry = list[0].candidate;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fall back to first entry.
|
} else {
|
||||||
if (!entry)
|
|
||||||
entry = entries[0];
|
entry = entries[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (visited.has(entry))
|
if (visited.has(entry))
|
||||||
throw new Error(`Found redirect cycle for ${url}`);
|
throw new Error(`Found redirect cycle for ${url}`);
|
||||||
@ -249,3 +258,14 @@ class HarBackend {
|
|||||||
this._zipFile?.close();
|
this._zipFile?.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function countMatchingHeaders(harHeaders: HARHeader[], headers: HeadersArray): number {
|
||||||
|
const set = new Set(headers.map(h => h.name.toLowerCase() + ':' + h.value));
|
||||||
|
let matches = 0;
|
||||||
|
for (const h of harHeaders) {
|
||||||
|
if (set.has(h.name.toLowerCase() + ':' + h.value))
|
||||||
|
++matches;
|
||||||
|
}
|
||||||
|
return matches;
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user