diff --git a/src/server/firefox/ffNetworkManager.ts b/src/server/firefox/ffNetworkManager.ts index bb4fbe2506..d1781b9a9b 100644 --- a/src/server/firefox/ffNetworkManager.ts +++ b/src/server/firefox/ffNetworkManager.ts @@ -22,6 +22,7 @@ import * as network from '../network'; import * as frames from '../frames'; import * as types from '../types'; import { Protocol } from './protocol'; +import { InterceptedResponse } from '../network'; export class FFNetworkManager { private _session: FFSession; @@ -187,21 +188,28 @@ class InterceptableRequest implements network.RouteDelegate { payload.url, internalCauseToResourceType[payload.internalCause] || causeToResourceType[payload.cause] || 'other', payload.method, postDataBuffer, payload.headers); } - responseBody(): Promise { - throw new Error('Method not implemented.'); + async responseBody(forFulfill: boolean): Promise { + // Empty buffer will result in the response being used. + if (forFulfill) + return Buffer.from(''); + const response = await this._session.send('Network.getResponseBody', { + requestId: this._id + }); + return Buffer.from(response.base64body, 'base64'); } async continue(overrides: types.NormalizedContinueOverrides): Promise { - await this._session.sendMayFail('Network.resumeInterceptedRequest', { + const result = await this._session.sendMayFail('Network.resumeInterceptedRequest', { requestId: this._id, url: overrides.url, method: overrides.method, headers: overrides.headers, - postData: overrides.postData ? Buffer.from(overrides.postData).toString('base64') : undefined - }); - if (overrides.interceptResponse) - throw new Error('Response interception not implemented'); - return null; + postData: overrides.postData ? Buffer.from(overrides.postData).toString('base64') : undefined, + interceptResponse: overrides.interceptResponse, + }) as any; + if (!overrides.interceptResponse) + return null; + return new InterceptedResponse(this.request, result.response.status, result.response.statusText, result.response.headers); } async fulfill(response: types.NormalizedFulfillResponse) { diff --git a/tests/page/page-request-intercept.spec.ts b/tests/page/page-request-intercept.spec.ts index 3927924216..a923458bbb 100644 --- a/tests/page/page-request-intercept.spec.ts +++ b/tests/page/page-request-intercept.spec.ts @@ -20,7 +20,6 @@ import type { Route } from '../../index'; import { test as it, expect } from './pageTest'; it('should fulfill intercepted response', async ({page, server, browserName}) => { - it.fixme(browserName === 'firefox'); await page.route('**/*', async route => { // @ts-expect-error await route._intercept({}); @@ -41,8 +40,6 @@ it('should fulfill intercepted response', async ({page, server, browserName}) => }); it('should throw on continue after intercept', async ({page, server, browserName}) => { - it.fixme(browserName === 'firefox'); - let routeCallback; const routePromise = new Promise(f => routeCallback = f); await page.route('**', routeCallback); @@ -60,7 +57,6 @@ it('should throw on continue after intercept', async ({page, server, browserName }); it('should support fulfill after intercept', async ({page, server, browserName, browserMajorVersion}) => { - it.fixme(browserName === 'firefox'); it.skip(browserName === 'chromium' && browserMajorVersion <= 91); const requestPromise = server.waitForRequest('/empty.html'); await page.route('**', async route => { @@ -75,7 +71,6 @@ it('should support fulfill after intercept', async ({page, server, browserName, it('should support request overrides', async ({page, server, browserName, browserMajorVersion}) => { - it.fixme(browserName === 'firefox'); it.skip(browserName === 'chromium' && browserMajorVersion <= 91); const requestPromise = server.waitForRequest('/empty.html'); await page.route('**/foo', async route => { @@ -97,9 +92,6 @@ it('should support request overrides', async ({page, server, browserName, browse }); it('should give access to the intercepted response', async ({page, server, browserName}) => { - it.fixme(browserName === 'firefox'); - // it.fixme(browserName === 'webkit'); - await page.goto(server.EMPTY_PAGE); let routeCallback; @@ -121,8 +113,6 @@ it('should give access to the intercepted response', async ({page, server, brows }); it('should give access to the intercepted response body', async ({page, server, browserName}) => { - it.fixme(browserName === 'firefox'); - await page.goto(server.EMPTY_PAGE); let routeCallback; @@ -141,7 +131,6 @@ it('should give access to the intercepted response body', async ({page, server, }); it('should be abortable after interception', async ({page, server, browserName}) => { - it.fixme(browserName === 'firefox'); it.fixme(browserName === 'webkit'); await page.route(/\.css$/, async route => {