Skip to content

Commit 6aab573

Browse files
committed
chore(bidi): add support for fetching request bodies
1 parent e7bff52 commit 6aab573

File tree

3 files changed

+15
-12
lines changed

3 files changed

+15
-12
lines changed

packages/playwright-core/src/server/bidi/bidiBrowser.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export class BidiBrowser extends Browser {
7070
});
7171

7272
await browser._browserSession.send('network.addDataCollector', {
73-
dataTypes: [bidi.Network.DataType.Response],
73+
dataTypes: [bidi.Network.DataType.Request, bidi.Network.DataType.Response],
7474
maxEncodedDataSize: 20_000_000, // same default as in CDP: https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/inspector/inspector_network_agent.cc;l=134;drc=4128411589187a396829a827f59a655bed876aa7
7575
});
7676

packages/playwright-core/src/server/bidi/bidiNetworkManager.ts

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ export class BidiNetworkManager {
5454
eventsHelper.removeEventListeners(this._eventListeners);
5555
}
5656

57-
private _onBeforeRequestSent(param: bidi.Network.BeforeRequestSentParameters) {
57+
private async _onBeforeRequestSent(param: bidi.Network.BeforeRequestSentParameters) {
5858
if (param.request.url.startsWith('data:'))
5959
return;
6060
const redirectedFrom = param.redirectCount ? (this._requests.get(param.request.request) || null) : null;
@@ -79,7 +79,7 @@ export class BidiNetworkManager {
7979
route = new BidiRouteImpl(this._session, param.request.request);
8080
}
8181
}
82-
const request = new BidiRequest(frame, redirectedFrom, param, route);
82+
const request = new BidiRequest(frame, redirectedFrom, param, route, await getNetworkData(this._session, param.request, bidi.Network.DataType.Request));
8383
this._requests.set(request._id, request);
8484
this._page.frameManager.requestStarted(request.request, route);
8585
}
@@ -88,11 +88,7 @@ export class BidiNetworkManager {
8888
const request = this._requests.get(params.request.request);
8989
if (!request)
9090
return;
91-
const getResponseBody = async () => {
92-
const { bytes } = await this._session.send('network.getData', { request: params.request.request, dataType: bidi.Network.DataType.Response });
93-
const encoding = bytes.type === 'base64' ? 'base64' : 'utf8';
94-
return Buffer.from(bytes.value, encoding);
95-
};
91+
const getResponseBody = async () => (await getNetworkData(this._session, params.request, bidi.Network.DataType.Response))!;
9692
const timings = params.request.timings;
9793
const startTime = timings.requestTime;
9894
function relativeToStart(time: number): number {
@@ -236,14 +232,12 @@ class BidiRequest {
236232
// store the first and only Route in the chain (if any).
237233
_originalRequestRoute: BidiRouteImpl | undefined;
238234

239-
constructor(frame: frames.Frame, redirectedFrom: BidiRequest | null, payload: bidi.Network.BeforeRequestSentParameters, route: BidiRouteImpl | undefined) {
235+
constructor(frame: frames.Frame, redirectedFrom: BidiRequest | null, payload: bidi.Network.BeforeRequestSentParameters, route: BidiRouteImpl | undefined, postData: Buffer | null) {
240236
this._id = payload.request.request;
241237
if (redirectedFrom)
242238
redirectedFrom._redirectedTo = this;
243-
// TODO: missing in the spec?
244-
const postDataBuffer = null;
245239
this.request = new network.Request(frame._page.browserContext, frame, null, redirectedFrom ? redirectedFrom.request : null, payload.navigation ?? undefined, payload.request.url,
246-
resourceTypeFromBidi(payload.request.destination, payload.request.initiatorType, payload.initiator?.type), payload.request.method, postDataBuffer, fromBidiHeaders(payload.request.headers));
240+
resourceTypeFromBidi(payload.request.destination, payload.request.initiatorType, payload.initiator?.type), payload.request.method, postData, fromBidiHeaders(payload.request.headers));
247241
// "raw" headers are the same as "provisional" headers in Bidi.
248242
this.request.setRawRequestHeaders(null);
249243
this.request._setBodySize(payload.request.bodySize || 0);
@@ -390,3 +384,11 @@ function resourceTypeFromBidi(requestDestination: string, requestInitiatorType:
390384
default: return 'other';
391385
}
392386
}
387+
388+
async function getNetworkData(session: BidiSession, request: bidi.Network.RequestData, dataType: bidi.Network.DataType): Promise<Buffer | null> {
389+
if (dataType === 'request' && !request.bodySize)
390+
return null;
391+
const { bytes } = await session.send('network.getData', { request: request.request, dataType });
392+
const encoding = bytes.type === 'base64' ? 'base64' : 'utf8';
393+
return Buffer.from(bytes.value, encoding);
394+
}

packages/playwright-core/src/server/bidi/third_party/bidiProtocolCore.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1383,6 +1383,7 @@ export namespace Network {
13831383
}
13841384
export namespace Network {
13851385
export const enum DataType {
1386+
Request = 'request',
13861387
Response = 'response',
13871388
}
13881389
}

0 commit comments

Comments
 (0)