diff --git a/packages/apollo-datasource-rest/src/RESTDataSource.ts b/packages/apollo-datasource-rest/src/RESTDataSource.ts index fc12f508884..107709a84b4 100644 --- a/packages/apollo-datasource-rest/src/RESTDataSource.ts +++ b/packages/apollo-datasource-rest/src/RESTDataSource.ts @@ -104,6 +104,9 @@ export abstract class RESTDataSource extends DataSource { protected parseBody(response: Response): Promise { const contentType = response.headers.get('Content-Type'); if ( + // As one might expect, a "204 No Content" is empty! This means there + // isn't enough to `JSON.parse`, and trying will result in an error. + response.status !== 204 && contentType && (contentType.startsWith('application/json') || contentType.startsWith('application/hal+json')) diff --git a/packages/apollo-datasource-rest/src/__tests__/RESTDataSource.test.ts b/packages/apollo-datasource-rest/src/__tests__/RESTDataSource.test.ts index 477ad4cc384..d079618c5df 100644 --- a/packages/apollo-datasource-rest/src/__tests__/RESTDataSource.test.ts +++ b/packages/apollo-datasource-rest/src/__tests__/RESTDataSource.test.ts @@ -473,6 +473,24 @@ describe('RESTDataSource', () => { expect(data).toEqual('bar'); }); + + it('returns data as a string when response status code is 204 no content', async () => { + const dataSource = new class extends RESTDataSource { + baseURL = 'https://api.example.com'; + + getFoo() { + return this.get(''); + } + }(); + + dataSource.httpCache = httpCache; + + fetch.mockResponseOnce('', { 'Content-Type': 'application/json' }, 204); + + const data = await dataSource.getFoo(); + + expect(data).toEqual(''); + }); }); describe('memoization', () => {