diff --git a/lib/client.js b/lib/client.js index e907af060..ae0dc8f38 100644 --- a/lib/client.js +++ b/lib/client.js @@ -394,9 +394,18 @@ Response.prototype.setHeaderProperties = function(header){ Response.prototype.parseBody = function(str){ var parse = request.parse[this.type]; - return parse && str && (str.length || str instanceof Object) - ? parse(str) - : null; + var result; + + if (parse && str && (str.length || str instanceof Object)) { + try{ + result = parse(str); + } catch(e) { + result = str; + } + } else { + result = null; + } + return result; }; /** diff --git a/lib/node/index.js b/lib/node/index.js index b99102b3e..6e417bc88 100644 --- a/lib/node/index.js +++ b/lib/node/index.js @@ -1008,11 +1008,11 @@ Request.prototype.end = function(fn){ if (parse) { try { parse(res, function(err, obj){ - if (err && !self._aborted) self.callback(err); res.body = obj; + if (err && !self._aborted) self.callback(err, res); }); } catch (err) { - self.callback(err); + self.callback(err, res); return; } } diff --git a/lib/node/parsers/json.js b/lib/node/parsers/json.js index 7eb605466..c0e1a24d6 100644 --- a/lib/node/parsers/json.js +++ b/lib/node/parsers/json.js @@ -4,12 +4,14 @@ module.exports = function parseJSON(res, fn){ res.setEncoding('utf8'); res.on('data', function(chunk){ res.text += chunk;}); res.on('end', function(){ + var body; try { - var body = res.text && JSON.parse(res.text); + body = res.text && JSON.parse(res.text); } catch (e) { var err = e; // issue #675: return the raw response if the response parsing fails err.rawResponse = res.text || null; + body = res.text; } finally { fn(err, body); } diff --git a/test/client/request.js b/test/client/request.js index e718d6ec1..3c6ee5af5 100644 --- a/test/client/request.js +++ b/test/client/request.js @@ -2,7 +2,7 @@ var assert = require('assert'); var request = require('../../'); describe('request', function() { - this.timeout(10000); + this.timeout(15000); it('request() error object', function(next) { request('GET', '/error').end(function(err, res) { @@ -73,8 +73,8 @@ it('GET invalid json', function(next) { request .get('/invalid-json') .end(function(err, res) { - assert(err.parse); - assert.deepEqual(err.rawResponse, ")]}', {'header':{'code':200,'text':'OK','version':'1.0'},'data':'some data'}"); + assert(res); + assert.deepEqual(res.body, ")]}', {'header':{'code':200,'text':'OK','version':'1.0'},'data':'some data'}"); next(); }); }); diff --git a/test/json.js b/test/json.js index 863a6c5ca..48d2901a0 100644 --- a/test/json.js +++ b/test/json.js @@ -140,11 +140,12 @@ describe('res.body', function(){ }); describe('Invalid JSON response', function(){ - it('should return the raw response', function(done){ + it('should return the raw response in the request body', function(done){ request .get(uri + '/invalid-json') .end(function(err, res){ - assert.deepEqual(err.rawResponse, ")]}', {'header':{'code':200,'text':'OK','version':'1.0'},'data':'some data'}"); + assert(res); + assert.deepEqual(res.body, ")]}', {'header':{'code':200,'text':'OK','version':'1.0'},'data':'some data'}"); done(); }); });