feat(firefox): response interception (#7510)

This commit is contained in:
Yury Semikhatsky 2021-07-29 10:12:47 -07:00 committed by GitHub
parent 07c1c4bfb1
commit 722f0606c4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 19 deletions

View file

@ -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<Buffer> {
throw new Error('Method not implemented.');
async responseBody(forFulfill: boolean): Promise<Buffer> {
// 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<network.InterceptedResponse|null> {
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) {

View file

@ -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<Route>(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 => {