diff --git a/lib/adapters/http.js b/lib/adapters/http.js index 32ef61b988..135c93a35f 100755 --- a/lib/adapters/http.js +++ b/lib/adapters/http.js @@ -235,6 +235,9 @@ module.exports = function httpAdapter(config) { var responseData = Buffer.concat(responseBuffer); if (config.responseType !== 'arraybuffer') { responseData = responseData.toString(config.responseEncoding); + if (!config.responseEncoding || config.responseEncoding === 'utf8') { + responseData = utils.stripBOM(responseData); + } } response.data = responseData; diff --git a/lib/utils.js b/lib/utils.js index dd098b2b49..83eb1c6282 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -312,6 +312,19 @@ function extend(a, b, thisArg) { return a; } +/** + * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) + * + * @param {string} content with BOM + * @return {string} content value without BOM + */ +function stripBOM(content) { + if (content.charCodeAt(0) === 0xFEFF) { + content = content.slice(1); + } + return content; +} + module.exports = { isArray: isArray, isArrayBuffer: isArrayBuffer, @@ -333,5 +346,6 @@ module.exports = { forEach: forEach, merge: merge, extend: extend, - trim: trim + trim: trim, + stripBOM: stripBOM }; diff --git a/test/unit/adapters/http.js b/test/unit/adapters/http.js index a5c6c74026..52fa155392 100644 --- a/test/unit/adapters/http.js +++ b/test/unit/adapters/http.js @@ -74,6 +74,26 @@ describe('supports http with nodejs', function () { }); }); + it('should allow passing JSON with BOM', function (done) { + var data = { + firstName: 'Fred', + lastName: 'Flintstone', + emailAddr: 'fred@example.com' + }; + + server = http.createServer(function (req, res) { + res.setHeader('Content-Type', 'application/json;charset=utf-8'); + var bomBuffer = Buffer.from([0xEF, 0xBB, 0xBF]) + var jsonBuffer = Buffer.from(JSON.stringify(data)); + res.end(Buffer.concat([bomBuffer, jsonBuffer])); + }).listen(4444, function () { + axios.get('http://localhost:4444/').then(function (res) { + assert.deepEqual(res.data, data); + done(); + }); + }); + }); + it('should redirect', function (done) { var str = 'test response';