diff --git a/.changeset/chilly-bananas-talk.md b/.changeset/chilly-bananas-talk.md new file mode 100644 index 000000000..a53e9adca --- /dev/null +++ b/.changeset/chilly-bananas-talk.md @@ -0,0 +1,5 @@ +--- +"@lion/ajax": patch +--- + +fix: avoid JSON.parsing empty responses diff --git a/packages/ajax/src/Ajax.js b/packages/ajax/src/Ajax.js index bce865dd6..4b6e5e1a1 100644 --- a/packages/ajax/src/Ajax.js +++ b/packages/ajax/src/Ajax.js @@ -193,9 +193,11 @@ export class Ajax { /** @type {any} */ let body = responseText; + if ( - !response.headers.get('content-type') || - response.headers.get('content-type')?.includes('json') + body.length && + (!response.headers.get('content-type') || + response.headers.get('content-type')?.includes('json')) ) { try { body = JSON.parse(responseText); diff --git a/packages/ajax/test/Ajax.test.js b/packages/ajax/test/Ajax.test.js index 2c7f46d32..1a4b88c45 100644 --- a/packages/ajax/test/Ajax.test.js +++ b/packages/ajax/test/Ajax.test.js @@ -221,6 +221,13 @@ describe('Ajax', () => { } expect(thrown).to.be.true; }); + + it('doesnt throw on empty response', async () => { + fetchStub.returns(Promise.resolve(new Response('', responseInit()))); + + const { response } = await ajax.fetchJson('/foo'); + expect(response.ok); + }); }); describe('request and response interceptors', () => {