From d8b4ca0ea5f2f05efa4edfe1e7684593f9f68273 Mon Sep 17 00:00:00 2001 From: Dmitriy Mozgovoy Date: Fri, 25 Aug 2023 21:07:51 +0300 Subject: [PATCH] fix(headers): added support for setting header names that overlap with class methods; (#5831) --- .eslintrc.cjs | 1 + lib/core/AxiosHeaders.js | 12 +++++++++++- lib/utils.js | 5 +++-- test/unit/core/AxiosHeaders.js | 11 +++++++++++ 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 11c8ad99db..2b7e9f207a 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -10,5 +10,6 @@ module.exports = { "sourceType": "module" }, "rules": { + "no-cond-assign": 0 } } diff --git a/lib/core/AxiosHeaders.js b/lib/core/AxiosHeaders.js index 361d340c52..558ad8fc1d 100644 --- a/lib/core/AxiosHeaders.js +++ b/lib/core/AxiosHeaders.js @@ -282,7 +282,17 @@ class AxiosHeaders { AxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']); -utils.freezeMethods(AxiosHeaders.prototype); +// reserved names hotfix +utils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => { + let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set` + return { + get: () => value, + set(headerValue) { + this[mapped] = headerValue; + } + } +}); + utils.freezeMethods(AxiosHeaders); export default AxiosHeaders; diff --git a/lib/utils.js b/lib/utils.js index ccf31b17cc..a386b77fbc 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -540,8 +540,9 @@ const reduceDescriptors = (obj, reducer) => { const reducedDescriptors = {}; forEach(descriptors, (descriptor, name) => { - if (reducer(descriptor, name, obj) !== false) { - reducedDescriptors[name] = descriptor; + let ret; + if ((ret = reducer(descriptor, name, obj)) !== false) { + reducedDescriptors[name] = ret || descriptor; } }); diff --git a/test/unit/core/AxiosHeaders.js b/test/unit/core/AxiosHeaders.js index 23f824ed94..bc751233c6 100644 --- a/test/unit/core/AxiosHeaders.js +++ b/test/unit/core/AxiosHeaders.js @@ -76,6 +76,17 @@ describe('AxiosHeaders', function () { }) }); + it('should support uppercase name mapping for names overlapped by class methods', () => { + const headers = new AxiosHeaders({ + set: 'foo' + }); + + headers.set('get', 'bar'); + + assert.strictEqual(headers.get('Set'), 'foo'); + assert.strictEqual(headers.get('Get'), 'bar'); + }); + describe('get', function () { describe('filter', function() { it('should support RegExp', function () {