Skip to content

Commit

Permalink
feat: improve error message for response.buffer() (#7669)
Browse files Browse the repository at this point in the history
  • Loading branch information
jschfflr committed Oct 29, 2021
1 parent 4d9dc8c commit 03c9ecc
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 7 deletions.
28 changes: 21 additions & 7 deletions src/common/HTTPResponse.ts
Expand Up @@ -18,6 +18,7 @@ import { Frame } from './FrameManager.js';
import { HTTPRequest } from './HTTPRequest.js';
import { SecurityDetails } from './SecurityDetails.js';
import { Protocol } from 'devtools-protocol';
import { ProtocolError } from './Errors.js';

/**
* @public
Expand Down Expand Up @@ -147,13 +148,26 @@ export class HTTPResponse {
if (!this._contentPromise) {
this._contentPromise = this._bodyLoadedPromise.then(async (error) => {
if (error) throw error;
const response = await this._client.send('Network.getResponseBody', {
requestId: this._request._requestId,
});
return Buffer.from(
response.body,
response.base64Encoded ? 'base64' : 'utf8'
);
try {
const response = await this._client.send('Network.getResponseBody', {
requestId: this._request._requestId,
});
return Buffer.from(
response.body,
response.base64Encoded ? 'base64' : 'utf8'
);
} catch (error) {
if (
error instanceof ProtocolError &&
error.originalMessage === 'No resource with given identifier found'
) {
throw new ProtocolError(
'Could not load body for this request. This might happen if the request is a preflight request.'
);
}

throw error;
}
});
}
return this._contentPromise;
Expand Down
38 changes: 38 additions & 0 deletions test/network.spec.ts
Expand Up @@ -25,6 +25,7 @@ import {
itFailsFirefox,
describeFailsFirefox,
} from './mocha-utils'; // eslint-disable-line import/extensions
import { HTTPResponse } from '../lib/cjs/puppeteer/api-docs-entry.js';

describe('network', function () {
setupTestBrowserHooks();
Expand Down Expand Up @@ -366,6 +367,43 @@ describe('network', function () {
const responseBuffer = await response.buffer();
expect(responseBuffer.equals(imageBuffer)).toBe(true);
});
it('should throw if the response does not have a body', async () => {
const { page, server } = getTestState();

await page.goto(server.PREFIX + '/empty.html');

server.setRoute('/test.html', (req, res) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Headers', 'x-ping');
res.end('Hello World');
});
const url = server.CROSS_PROCESS_PREFIX + '/test.html';
const responsePromise = new Promise<HTTPResponse>((resolve) => {
page.on('response', (response) => {
// Get the preflight response.
if (
response.request().method() === 'OPTIONS' &&
response.url() === url
) {
resolve(response);
}
});
});

// Trigger a request with a preflight.
await page.evaluate<(src: string) => void>(async (src) => {
const response = await fetch(src, {
method: 'POST',
headers: { 'x-ping': 'pong' },
});
return response;
}, url);

const response = await responsePromise;
await expect(response.buffer()).rejects.toThrowError(
'Could not load body for this request. This might happen if the request is a preflight request.'
);
});
});

describe('Response.statusText', function () {
Expand Down

0 comments on commit 03c9ecc

Please sign in to comment.