diff --git a/lib/defaults/index.js b/lib/defaults/index.js index cc14a8b..b2288ae 100644 --- a/lib/defaults/index.js +++ b/lib/defaults/index.js @@ -108,7 +108,7 @@ const defaults = { if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) { const silentJSONParsing = transitional && transitional.silentJSONParsing; - const strictJSONParsing = !silentJSONParsing && JSONRequested; + const strictJSONParsing = !silentJSONParsing; try { return JSON.parse(data, this.parseReviver); @@ -158,4 +158,4 @@ utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => { defaults.headers[method] = {}; }); -export default defaults; +export default defaults; \ No newline at end of file diff --git a/test/regression_silent_json.js b/test/regression_silent_json.js new file mode 100644 index 0000000..37ecb83 --- /dev/null +++ b/test/regression_silent_json.js @@ -0,0 +1,69 @@ + +import assert from 'assert'; +import axios from '../index.js'; + +describe('Regression: Silent JSON Parsing', function () { + + beforeEach(function () { + // Mock adapter to return invalid JSON + axios.defaults.adapter = async (config) => { + return { + data: '{ invalid json }', + status: 200, + statusText: 'OK', + headers: {}, + config + }; + }; + }); + + afterEach(function () { + delete axios.defaults.adapter; + }); + + it('should throw SyntaxError when silentJSONParsing is false', async function () { + try { + await axios.get('/test', { + transitional: { + silentJSONParsing: false + } + }); + assert.fail('Should have thrown error'); + } catch (err) { + assert.ok(err.name === 'SyntaxError' || err.code === 'ERR_BAD_RESPONSE', 'Error should be SyntaxError or ERR_BAD_RESPONSE'); + } + }); + + it('should return raw string when silentJSONParsing is true (default)', async function () { + const response = await axios.get('/test', { + transitional: { + silentJSONParsing: true + } + }); + assert.strictEqual(response.data, '{ invalid json }'); + }); + + it('should throw SyntaxError when responseType is json (legacy behavior)', async function () { + try { + await axios.get('/test', { + responseType: 'json', + transitional: { + silentJSONParsing: false + } + }); + assert.fail('Should have thrown error'); + } catch (err) { + assert.ok(err.name === 'SyntaxError' || err.code === 'ERR_BAD_RESPONSE', 'Error should be SyntaxError or ERR_BAD_RESPONSE'); + } + }); + + it('should swallow error when silentJSONParsing is true and responseType is json (legacy behavior)', async function () { + const response = await axios.get('/test', { + responseType: 'json', + transitional: { + silentJSONParsing: true + } + }); + assert.strictEqual(response.data, '{ invalid json }'); + }); +});