From 16aa2ce7fa42e7c46407b78966b7521d8e588a72 Mon Sep 17 00:00:00 2001 From: Cr <631807682@qq.com> Date: Thu, 2 Jul 2020 01:14:52 +0800 Subject: [PATCH] Fixing response with utf-8 BOM can not parse to json (#2419) * fix: remove byte order marker (UTF-8 BOM) when transform response * fix: remove BOM only utf-8 * test: utf-8 BOM * fix: incorrect param name Co-authored-by: Jay --- lib/adapters/http.js | 3 +++ lib/utils.js | 16 +++++++++++++++- test/unit/adapters/http.js | 20 ++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/lib/adapters/http.js b/lib/adapters/http.js index 32ef61b..135c93a 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 dd098b2..83eb1c6 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 a5c6c74..52fa155 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';