From 401fc4cb9e90fbddb4258f762276241e743dfef4 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Fri, 2 Jun 2023 14:15:20 -0700 Subject: [PATCH] fix(tracing): record available response headers without waiting for extra info (#23483) Fixes #23115 --- .../src/server/har/harTracer.ts | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/playwright-core/src/server/har/harTracer.ts b/packages/playwright-core/src/server/har/harTracer.ts index 9d224914c1..31536d22c9 100644 --- a/packages/playwright-core/src/server/har/harTracer.ts +++ b/packages/playwright-core/src/server/har/harTracer.ts @@ -478,18 +478,26 @@ export class HarTracer { this._addBarrier(page || request.serviceWorker(), request.rawRequestHeaders().then(headers => { this._recordRequestHeadersAndCookies(harEntry, headers); })); + // Record available headers including redirect location in case the tracing is stopped before + // reponse extra info is received (in Chromium). + this._recordResponseHeaders(harEntry, response.headers()); this._addBarrier(page || request.serviceWorker(), response.rawResponseHeaders().then(headers => { - if (!this._options.omitCookies) { - for (const header of headers.filter(header => header.name.toLowerCase() === 'set-cookie')) - harEntry.response.cookies.push(parseCookie(header.value)); - } - harEntry.response.headers = headers; - const contentType = headers.find(header => header.name.toLowerCase() === 'content-type'); - if (contentType) - harEntry.response.content.mimeType = contentType.value; + this._recordResponseHeaders(harEntry, headers); })); } + private _recordResponseHeaders(harEntry: har.Entry, headers: HeadersArray) { + if (!this._options.omitCookies) { + harEntry.response.cookies = headers + .filter(header => header.name.toLowerCase() === 'set-cookie') + .map(header => parseCookie(header.value)); + } + harEntry.response.headers = headers; + const contentType = headers.find(header => header.name.toLowerCase() === 'content-type'); + if (contentType) + harEntry.response.content.mimeType = contentType.value; + } + private _computeHarEntryTotalTime(harEntry: har.Entry) { harEntry.time = [ harEntry.timings.dns,