fix(network): allow fulfilling requests with status code 422 (#4566)
Migration onto fetch domain (2265974ce5
)
changed the way we generate status texts: instead of relying on build-in
list of statuses, we tried to rely upon the [Chromium implementation](https://cs.chromium.org/chromium/src/net/http/http_status_code_list.h?sq=package:chromium&g=0).
Puppeteer's list is much more exhaustive - let's keep it.
Fix #4454
This commit is contained in:
parent
b2f94909a1
commit
8df0b3ec3b
@ -478,6 +478,7 @@ class Request {
|
|||||||
await this._client.send('Fetch.fulfillRequest', {
|
await this._client.send('Fetch.fulfillRequest', {
|
||||||
requestId: this._interceptionId,
|
requestId: this._interceptionId,
|
||||||
responseCode: response.status || 200,
|
responseCode: response.status || 200,
|
||||||
|
responsePhrase: STATUS_TEXTS[response.status || 200],
|
||||||
responseHeaders: headersArray(responseHeaders),
|
responseHeaders: headersArray(responseHeaders),
|
||||||
body: responseBody ? responseBody.toString('base64') : undefined,
|
body: responseBody ? responseBody.toString('base64') : undefined,
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
@ -727,4 +728,67 @@ function headersArray(headers) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const STATUS_TEXTS = {
|
||||||
|
'100': 'Continue',
|
||||||
|
'101': 'Switching Protocols',
|
||||||
|
'102': 'Processing',
|
||||||
|
'200': 'OK',
|
||||||
|
'201': 'Created',
|
||||||
|
'202': 'Accepted',
|
||||||
|
'203': 'Non-Authoritative Information',
|
||||||
|
'204': 'No Content',
|
||||||
|
'206': 'Partial Content',
|
||||||
|
'207': 'Multi-Status',
|
||||||
|
'208': 'Already Reported',
|
||||||
|
'209': 'IM Used',
|
||||||
|
'300': 'Multiple Choices',
|
||||||
|
'301': 'Moved Permanently',
|
||||||
|
'302': 'Found',
|
||||||
|
'303': 'See Other',
|
||||||
|
'304': 'Not Modified',
|
||||||
|
'305': 'Use Proxy',
|
||||||
|
'306': 'Switch Proxy',
|
||||||
|
'307': 'Temporary Redirect',
|
||||||
|
'308': 'Permanent Redirect',
|
||||||
|
'400': 'Bad Request',
|
||||||
|
'401': 'Unauthorized',
|
||||||
|
'402': 'Payment Required',
|
||||||
|
'403': 'Forbidden',
|
||||||
|
'404': 'Not Found',
|
||||||
|
'405': 'Method Not Allowed',
|
||||||
|
'406': 'Not Acceptable',
|
||||||
|
'407': 'Proxy Authentication Required',
|
||||||
|
'408': 'Request Timeout',
|
||||||
|
'409': 'Conflict',
|
||||||
|
'410': 'Gone',
|
||||||
|
'411': 'Length Required',
|
||||||
|
'412': 'Precondition Failed',
|
||||||
|
'413': 'Payload Too Large',
|
||||||
|
'414': 'URI Too Long',
|
||||||
|
'415': 'Unsupported Media Type',
|
||||||
|
'416': 'Range Not Satisfiable',
|
||||||
|
'417': 'Expectation Failed',
|
||||||
|
'418': 'I\'m a teapot',
|
||||||
|
'421': 'Misdirected Request',
|
||||||
|
'422': 'Unprocessable Entity',
|
||||||
|
'423': 'Locked',
|
||||||
|
'424': 'Failed Dependency',
|
||||||
|
'426': 'Upgrade Required',
|
||||||
|
'428': 'Precondition Required',
|
||||||
|
'429': 'Too Many Requests',
|
||||||
|
'431': 'Request Header Fields Too Large',
|
||||||
|
'451': 'Unavailable For Legal Reasons',
|
||||||
|
'500': 'Internal Server Error',
|
||||||
|
'501': 'Not Implemented',
|
||||||
|
'502': 'Bad Gateway',
|
||||||
|
'503': 'Service Unavailable',
|
||||||
|
'504': 'Gateway Timeout',
|
||||||
|
'505': 'HTTP Version Not Supported',
|
||||||
|
'506': 'Variant Also Negotiates',
|
||||||
|
'507': 'Insufficient Storage',
|
||||||
|
'508': 'Loop Detected',
|
||||||
|
'510': 'Not Extended',
|
||||||
|
'511': 'Network Authentication Required',
|
||||||
|
};
|
||||||
|
|
||||||
module.exports = {Request, Response, NetworkManager, SecurityDetails};
|
module.exports = {Request, Response, NetworkManager, SecurityDetails};
|
||||||
|
@ -483,6 +483,19 @@ module.exports.addTests = function({testRunner, expect, CHROME}) {
|
|||||||
expect(response.headers().foo).toBe('bar');
|
expect(response.headers().foo).toBe('bar');
|
||||||
expect(await page.evaluate(() => document.body.textContent)).toBe('Yo, page!');
|
expect(await page.evaluate(() => document.body.textContent)).toBe('Yo, page!');
|
||||||
});
|
});
|
||||||
|
it('should work with status code 422', async({page, server}) => {
|
||||||
|
await page.setRequestInterception(true);
|
||||||
|
page.on('request', request => {
|
||||||
|
request.respond({
|
||||||
|
status: 422,
|
||||||
|
body: 'Yo, page!'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
const response = await page.goto(server.EMPTY_PAGE);
|
||||||
|
expect(response.status()).toBe(422);
|
||||||
|
expect(response.statusText()).toBe('Unprocessable Entity');
|
||||||
|
expect(await page.evaluate(() => document.body.textContent)).toBe('Yo, page!');
|
||||||
|
});
|
||||||
it('should redirect', async({page, server}) => {
|
it('should redirect', async({page, server}) => {
|
||||||
await page.setRequestInterception(true);
|
await page.setRequestInterception(true);
|
||||||
page.on('request', request => {
|
page.on('request', request => {
|
||||||
|
Loading…
Reference in New Issue
Block a user