From 15414fb59ef2a7ad5ac83f974e0206eb44182b61 Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Mon, 14 Oct 2024 11:59:24 +0200 Subject: [PATCH] fix(har): account for socket reuse --- packages/playwright-core/src/server/fetch.ts | 14 ++++++++++++-- tests/library/har.spec.ts | 12 ++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/playwright-core/src/server/fetch.ts b/packages/playwright-core/src/server/fetch.ts index 243e89cf1c..a98a00e512 100644 --- a/packages/playwright-core/src/server/fetch.ts +++ b/packages/playwright-core/src/server/fetch.ts @@ -329,6 +329,11 @@ export abstract class APIRequestContext extends SdkObject { blocked: -1, }; + if (request.reusedSocket) { + timings.connect = -1; + timings.dns = -1; + } + const requestFinishedEvent: APIRequestFinishedEvent = { requestEvent, httpVersion: response.httpVersion, @@ -491,8 +496,13 @@ export abstract class APIRequestContext extends SdkObject { request.on('socket', socket => { // happy eyeballs don't emit lookup and connect events, so we use our custom ones const happyEyeBallsTimings = timingForSocket(socket); - dnsLookupAt = happyEyeBallsTimings.dnsLookupAt; - tcpConnectionAt ??= happyEyeBallsTimings.tcpConnectionAt; + if (request.reusedSocket) { + dnsLookupAt = startAt; + tcpConnectionAt = startAt; + } else { + dnsLookupAt = happyEyeBallsTimings.dnsLookupAt; + tcpConnectionAt ??= happyEyeBallsTimings.tcpConnectionAt; + } // non-happy-eyeballs sockets listeners.push( diff --git a/tests/library/har.spec.ts b/tests/library/har.spec.ts index a5d4a6fa0e..bb440a206d 100644 --- a/tests/library/har.spec.ts +++ b/tests/library/har.spec.ts @@ -877,6 +877,18 @@ it('should include timings when using socks proxy', async ({ contextFactory, ser expect(log.entries[0].timings.connect).toBeGreaterThan(0); }); +it('should not have connect and dns timings when socket is reused', async ({ contextFactory, server }, testInfo) => { + const { page, getLog } = await pageWithHar(contextFactory, testInfo); + await page.request.get(server.EMPTY_PAGE); + await page.request.get(server.EMPTY_PAGE); + + const log = await getLog(); + expect(log.entries).toHaveLength(2); + const request2 = log.entries[1]; + expect.soft(request2.timings.connect).toBe(-1); + expect.soft(request2.timings.dns).toBe(-1); +}); + it('should include redirects from API request', async ({ contextFactory, server }, testInfo) => { server.setRedirect('/redirect-me', '/simple.json'); const { page, getLog } = await pageWithHar(contextFactory, testInfo);