diff --git a/packages/playwright-core/src/client/browserContext.ts b/packages/playwright-core/src/client/browserContext.ts index 03ae7a5eb1377..ffe1932764bec 100644 --- a/packages/playwright-core/src/client/browserContext.ts +++ b/packages/playwright-core/src/client/browserContext.ts @@ -222,6 +222,7 @@ export class BrowserContext extends ChannelOwner private _onRequestFailed(request: network.Request, responseEndTiming: number, failureText: string | undefined, page: Page | null) { request._failureText = failureText || null; request._setResponseEndTiming(responseEndTiming); + request._response?._finishedPromise.resolve(null); this.emit(Events.BrowserContext.RequestFailed, request); if (page) page.emit(Events.Page.RequestFailed, request); diff --git a/tests/page/page-event-network.spec.ts b/tests/page/page-event-network.spec.ts index 5618431c998d8..30b3cfaf5d97f 100644 --- a/tests/page/page-event-network.spec.ts +++ b/tests/page/page-event-network.spec.ts @@ -92,6 +92,20 @@ it('should fire events in proper order', async ({ page, server }) => { expect(events).toEqual(['request', 'response', 'requestfinished']); }); +it('should resolve finished() for a 204 response', async ({ page, server }) => { + it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/42786' }); + server.setRoute('/204', (req, res) => { + res.statusCode = 204; + res.end(); + }); + await page.goto(server.EMPTY_PAGE); + const [response] = await Promise.all([ + page.waitForEvent('response', r => r.url().endsWith('/204')), + page.evaluate(() => fetch('/204')), + ]); + expect(await response.finished()).toBe(null); +}); + it('should support redirects', async ({ page, server }) => { const FOO_URL = server.PREFIX + '/foo.html'; const events = {};