diff --git a/packages/playwright-core/src/server/chromium/crNetworkManager.ts b/packages/playwright-core/src/server/chromium/crNetworkManager.ts index 8279f323c0..fa1d830ee5 100644 --- a/packages/playwright-core/src/server/chromium/crNetworkManager.ts +++ b/packages/playwright-core/src/server/chromium/crNetworkManager.ts @@ -271,8 +271,25 @@ export class CRNetworkManager { _createResponse(request: InterceptableRequest, responsePayload: Protocol.Network.Response): network.Response { const getResponseBody = async () => { + const contentLengthHeader = Object.entries(responsePayload.headers).find(header => header[0].toLowerCase() === 'content-length'); + const expectedLength = contentLengthHeader ? +contentLengthHeader[1] : undefined; + const response = await this._client.send('Network.getResponseBody', { requestId: request._requestId }); - return Buffer.from(response.body, response.base64Encoded ? 'base64' : 'utf8'); + if (response.body || !expectedLength) + return Buffer.from(response.body, response.base64Encoded ? 'base64' : 'utf8'); + + // For \ No newline at end of file diff --git a/tests/assets/prefetch.js b/tests/assets/prefetch.js new file mode 100644 index 0000000000..03d8677e99 --- /dev/null +++ b/tests/assets/prefetch.js @@ -0,0 +1 @@ +// Scripts will be pre-fetched \ No newline at end of file diff --git a/tests/page/page-network-response.spec.ts b/tests/page/page-network-response.spec.ts index b9d59cb686..5430ec36da 100644 --- a/tests/page/page-network-response.spec.ts +++ b/tests/page/page-network-response.spec.ts @@ -334,3 +334,13 @@ it('should report if request was fromServiceWorker', async ({ page, server, isAn expect(res.fromServiceWorker()).toBe(true); } }); + +it('should return body for prefetch script', async ({ page, server, browserName }) => { + it.skip(browserName === 'webkit', 'No prefetch in WebKit: https://caniuse.com/link-rel-prefetch'); + const [response] = await Promise.all([ + page.waitForResponse('**/prefetch.js'), + page.goto(server.PREFIX + '/prefetch.html') + ]); + const body = await response.body(); + expect(body.toString()).toBe('// Scripts will be pre-fetched'); +}); diff --git a/tests/page/page-request-intercept.spec.ts b/tests/page/page-request-intercept.spec.ts index 4776765f3c..9ec49f9d6e 100644 --- a/tests/page/page-request-intercept.spec.ts +++ b/tests/page/page-request-intercept.spec.ts @@ -64,6 +64,7 @@ it('should fulfill response with empty body', async ({ page, server, isAndroid, const response = await page.request.fetch(route.request()); await route.fulfill({ response, + headers: { 'content-length': '0' }, status: 201, body: '' });