From 9807d1ec4025893c0e0374fd8406cbf9b667dfe3 Mon Sep 17 00:00:00 2001 From: Guillaume FORTAINE Date: Sun, 5 Sep 2021 19:24:51 +0200 Subject: [PATCH] fix json transform when data is pre-stringified --- lib/defaults.js | 17 ++++++++++++++++- test/specs/defaults.spec.js | 13 +++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/defaults.js b/lib/defaults.js index fb96bdbd13..55e69d9ae5 100644 --- a/lib/defaults.js +++ b/lib/defaults.js @@ -26,6 +26,21 @@ function getDefaultAdapter() { return adapter; } +function stringifySafely(rawValue, parser, encoder) { + if (utils.isString(rawValue)) { + try { + (parser || JSON.parse)(rawValue); + return utils.trim(rawValue); + } catch (e) { + if (e.name !== 'SyntaxError') { + throw e; + } + } + } + + return (encoder || JSON.stringify)(rawValue); +} + var defaults = { transitional: { @@ -58,7 +73,7 @@ var defaults = { } if (utils.isObject(data) || (headers && headers['Content-Type'] === 'application/json')) { setContentTypeIfUnset(headers, 'application/json'); - return JSON.stringify(data); + return stringifySafely(data); } return data; }], diff --git a/test/specs/defaults.spec.js b/test/specs/defaults.spec.js index d71cd66a4e..ff0f15febe 100644 --- a/test/specs/defaults.spec.js +++ b/test/specs/defaults.spec.js @@ -20,6 +20,19 @@ describe('defaults', function () { expect(defaults.transformRequest[0]({foo: 'bar'})).toEqual('{"foo":"bar"}'); }); + it("should also transform request json when 'Content-Type' is 'application/json'", function () { + var headers = { + 'Content-Type': 'application/json', + }; + expect(defaults.transformRequest[0](JSON.stringify({ foo: 'bar' }), headers)).toEqual('{"foo":"bar"}'); + expect(defaults.transformRequest[0]([42, 43], headers)).toEqual('[42,43]'); + expect(defaults.transformRequest[0]('foo', headers)).toEqual('"foo"'); + expect(defaults.transformRequest[0](42, headers)).toEqual('42'); + expect(defaults.transformRequest[0](true, headers)).toEqual('true'); + expect(defaults.transformRequest[0](false, headers)).toEqual('false'); + expect(defaults.transformRequest[0](null, headers)).toEqual('null'); + }); + it('should do nothing to request string', function () { expect(defaults.transformRequest[0]('foo=bar')).toEqual('foo=bar'); });