fix: only "swallow" the json() parsing error if the response is empty (#47493)

This commit is contained in:
Levente Balogh 2022-05-26 13:01:53 +02:00 committed by GitHub
parent 8c477a288a
commit 84b7efb393
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 5 deletions

View File

@ -135,7 +135,12 @@ describe('parseCredentials', () => {
});
describe('parseResponseBody', () => {
const rsp = {} as unknown as Response;
let rsp: Response;
beforeEach(() => {
rsp = new Response();
});
it('parses json', async () => {
const value = { hello: 'world' };
const body = await parseResponseBody(
@ -148,6 +153,24 @@ describe('parseResponseBody', () => {
expect(body).toEqual(value);
});
it('returns an empty object {} when the response is empty but is declared as JSON type', async () => {
rsp.headers.set('Content-Length', '0');
jest.spyOn(console, 'warn').mockImplementation();
const json = jest.fn();
const body = await parseResponseBody(
{
...rsp,
json,
},
'json'
);
expect(body).toEqual({});
expect(json).not.toHaveBeenCalled();
expect(console.warn).toHaveBeenCalledTimes(1);
});
it('parses text', async () => {
const value = 'RAW TEXT';
const body = await parseResponseBody(

View File

@ -106,13 +106,15 @@ export async function parseResponseBody<T>(
return response.blob() as any;
case 'json':
try {
return await response.json();
} catch (err) {
console.warn(`${response.url} returned an invalid JSON -`, err);
// An empty string is not a valid JSON.
// Sometimes (unfortunately) our APIs declare their Content-Type as JSON, however they return an empty body.
if (response.headers.get('Content-Length') === '0') {
console.warn(`${response.url} returned an invalid JSON`);
return {} as unknown as T;
}
return await response.json();
case 'text':
return response.text() as any;
}