diff --git a/backbone.fetch.js b/backbone.fetch.js index 542d33d..7c5449b 100644 --- a/backbone.fetch.js +++ b/backbone.fetch.js @@ -29,7 +29,7 @@ }; var getData = function(response, dataType) { - return dataType === 'json' ? response.json() : response.text(); + return dataType === 'json' && response.status !== 204 ? response.json() : response.text(); }; var ajax = function(options) { @@ -49,7 +49,9 @@ return fetch(options.url, options) .then(function(response) { - var promise = getData(response, options.dataType); + var promise = options.type === 'HEAD' + ? Promise.resolve(null) + : getData(response, options.dataType); if (response.ok) return promise; diff --git a/test/fetch.js b/test/fetch.js index db8d076..0b2115c 100644 --- a/test/fetch.js +++ b/test/fetch.js @@ -178,6 +178,38 @@ describe('backbone.fetch', function() { return promise; }); + it('should produce an error for invalid json', function(done) { + var promise = ajax({ + dataType: 'json', + url: 'test', + type: 'GET', + }); + + promise.then(function() { + throw new Error('this request should fail'); + }).catch(function(error) { + expect(error).to.be.an.instanceof(SyntaxError); + expect(error).not.to.have.property('response'); + done(); + }).catch(function(error) { + done(error); + }); + + server.respond([200, {}, '']); + return promise; + }); + + it('should not parse json for 204 responses', function() { + var promise = ajax({ + dataType: 'json', + url: 'test', + type: 'GET', + }); + + server.respond([204, {}, '']); + return promise; + }); + it('should parse json as property of Error on failing request', function(done) { var promise = ajax({ dataType: 'json',