mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
fix: only "swallow" the json() parsing error if the response is empty (#47493)
This commit is contained in:
parent
8c477a288a
commit
84b7efb393
@ -135,7 +135,12 @@ describe('parseCredentials', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe('parseResponseBody', () => {
|
describe('parseResponseBody', () => {
|
||||||
const rsp = {} as unknown as Response;
|
let rsp: Response;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
rsp = new Response();
|
||||||
|
});
|
||||||
|
|
||||||
it('parses json', async () => {
|
it('parses json', async () => {
|
||||||
const value = { hello: 'world' };
|
const value = { hello: 'world' };
|
||||||
const body = await parseResponseBody(
|
const body = await parseResponseBody(
|
||||||
@ -148,6 +153,24 @@ describe('parseResponseBody', () => {
|
|||||||
expect(body).toEqual(value);
|
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 () => {
|
it('parses text', async () => {
|
||||||
const value = 'RAW TEXT';
|
const value = 'RAW TEXT';
|
||||||
const body = await parseResponseBody(
|
const body = await parseResponseBody(
|
||||||
|
@ -106,13 +106,15 @@ export async function parseResponseBody<T>(
|
|||||||
return response.blob() as any;
|
return response.blob() as any;
|
||||||
|
|
||||||
case 'json':
|
case 'json':
|
||||||
try {
|
// An empty string is not a valid JSON.
|
||||||
return await response.json();
|
// Sometimes (unfortunately) our APIs declare their Content-Type as JSON, however they return an empty body.
|
||||||
} catch (err) {
|
if (response.headers.get('Content-Length') === '0') {
|
||||||
console.warn(`${response.url} returned an invalid JSON -`, err);
|
console.warn(`${response.url} returned an invalid JSON`);
|
||||||
return {} as unknown as T;
|
return {} as unknown as T;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return await response.json();
|
||||||
|
|
||||||
case 'text':
|
case 'text':
|
||||||
return response.text() as any;
|
return response.text() as any;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user