From a8e756898756e8bef3d515eafb1f838e9dec2d78 Mon Sep 17 00:00:00 2001 From: Michal Jarosz Date: Sun, 27 Jul 2025 15:10:49 +0100 Subject: [PATCH 1/2] fix: don't fullfill requests after stop method was called --- src/index.ts | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/index.ts b/src/index.ts index 8945845..3875555 100644 --- a/src/index.ts +++ b/src/index.ts @@ -50,9 +50,9 @@ export function createNetworkFixture( args?: CreateNetworkFixtureArgs, /** @todo `onUnhandledRequest`? */ ): [ - TestFixture, - { auto: boolean }, -] { + TestFixture, + { auto: boolean }, + ] { return [ async ({ page }, use) => { const worker = new NetworkFixture({ @@ -70,6 +70,7 @@ export function createNetworkFixture( export class NetworkFixture extends SetupApi { #page: Page + #stopped: boolean; constructor(args: { page: Page @@ -77,9 +78,11 @@ export class NetworkFixture extends SetupApi { }) { super(...args.initialHandlers) this.#page = args.page + this.#stopped = true } public async start() { + this.#stopped = false // Handle HTTP requests. await this.#page.route(/.+/, async (route, request) => { const fetchRequest = new Request(request.url(), { @@ -98,6 +101,9 @@ export class NetworkFixture extends SetupApi { }, ) + if (this.#stopped) + return; + if (response) { if (response.status === 0) { route.abort() @@ -149,6 +155,7 @@ export class NetworkFixture extends SetupApi { } public async stop() { + this.#stopped = true super.dispose() await this.#page.unroute(/.+/) } @@ -160,8 +167,7 @@ export class NetworkFixture extends SetupApi { } class PlaywrightWebSocketClientConnection - implements WebSocketClientConnectionProtocol -{ + implements WebSocketClientConnectionProtocol { public id: string public url: URL @@ -264,8 +270,7 @@ class PlaywrightWebSocketClientConnection } class PlaywrightWebSocketServerConnection - implements WebSocketServerConnectionProtocol -{ + implements WebSocketServerConnectionProtocol { #server?: WebSocketRoute #bufferedEvents: Array< Parameters From f0c1427065227d083e7393cb56443d679a65c0ab Mon Sep 17 00:00:00 2001 From: Michal Jarosz Date: Sat, 2 Aug 2025 22:39:48 +0100 Subject: [PATCH 2/2] fix: use subscriptions callbacks for unrouting --- src/index.ts | 80 +++++++++++++++++++++++++++------------------------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/src/index.ts b/src/index.ts index 3875555..a09c854 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,6 +3,8 @@ import type { Page, PlaywrightTestArgs, PlaywrightWorkerArgs, + Request, + Route, TestFixture, WebSocketRoute, } from '@playwright/test' @@ -70,7 +72,6 @@ export function createNetworkFixture( export class NetworkFixture extends SetupApi { #page: Page - #stopped: boolean; constructor(args: { page: Page @@ -78,49 +79,51 @@ export class NetworkFixture extends SetupApi { }) { super(...args.initialHandlers) this.#page = args.page - this.#stopped = true + } - public async start() { - this.#stopped = false - // Handle HTTP requests. - await this.#page.route(/.+/, async (route, request) => { - const fetchRequest = new Request(request.url(), { - method: request.method(), - headers: new Headers(await request.allHeaders()), - body: request.postDataBuffer(), - }) + async httpHandler(route: Route, request: Request) { + const fetchRequest = new Request(request.url(), { + method: request.method(), + headers: new Headers(await request.allHeaders()), + body: request.postDataBuffer(), + }) - const response = await getResponse( - this.handlersController.currentHandlers().filter((handler) => { - return handler instanceof RequestHandler - }), - fetchRequest, - { - baseUrl: this.getPageUrl(), - }, - ) - - if (this.#stopped) - return; - - if (response) { - if (response.status === 0) { - route.abort() - return - } - - route.fulfill({ - status: response.status, - headers: Object.fromEntries(response.headers), - body: response.body - ? Buffer.from(await response.arrayBuffer()) - : undefined, - }) + const response = await getResponse( + this.handlersController.currentHandlers().filter((handler) => { + return handler instanceof RequestHandler + }), + fetchRequest, + { + baseUrl: this.getPageUrl(), + }, + ) + + if (response) { + if (response.status === 0) { + route.abort() return } - route.continue() + route.fulfill({ + status: response.status, + headers: Object.fromEntries(response.headers), + body: response.body + ? Buffer.from(await response.arrayBuffer()) + : undefined, + }) + return + } + + route.continue() + } + + public async start() { + // Handle HTTP requests. + await this.#page.route(/.+/, this.httpHandler) + + this.subscriptions.push(async () => { + await this.#page.unroute(/.+/, this.httpHandler) }) // Handle WebSocket connections. @@ -155,7 +158,6 @@ export class NetworkFixture extends SetupApi { } public async stop() { - this.#stopped = true super.dispose() await this.#page.unroute(/.+/) }