2
0
mirror of https://github.com/tenrok/axios.git synced 2026-06-23 20:40:40 +03:00

fix: added a option to choose between legacy and the new request/response interceptor ordering

* test: add request interceptor tests for legacy and ordered execution

* feat: add legacy interceptor request/response ordering option

---------

Co-authored-by: Jay <jasonsaayman@gmail.com>
This commit is contained in:
Willian Agostini
2026-01-30 03:12:04 -03:00
committed by GitHub
parent 44b7c9f0c4
commit 569f028a58
6 changed files with 89 additions and 17 deletions
+3
View File
@@ -615,6 +615,9 @@ These are the available config options for making requests. Only the `url` is re
// throw ETIMEDOUT error instead of generic ECONNABORTED on request timeouts
clarifyTimeoutError: false,
// use the legacy interceptor request/response ordering
legacyInterceptorReqResOrdering: true, // default
},
env: {
+1
View File
@@ -302,6 +302,7 @@ declare namespace axios {
silentJSONParsing?: boolean;
forcedJSONParsing?: boolean;
clarifyTimeoutError?: boolean;
legacyInterceptorReqResOrdering?: boolean;
}
interface GenericAbortSignal {
Vendored
+1
View File
@@ -332,6 +332,7 @@ export interface TransitionalOptions {
silentJSONParsing?: boolean;
forcedJSONParsing?: boolean;
clarifyTimeoutError?: boolean;
legacyInterceptorReqResOrdering?: boolean;
}
export interface GenericAbortSignal {
+10 -1
View File
@@ -8,6 +8,7 @@ import mergeConfig from './mergeConfig.js';
import buildFullPath from './buildFullPath.js';
import validator from '../helpers/validator.js';
import AxiosHeaders from './AxiosHeaders.js';
import transitionalDefaults from '../defaults/transitional.js';
const validators = validator.validators;
@@ -80,7 +81,8 @@ class Axios {
validator.assertOptions(transitional, {
silentJSONParsing: validators.transitional(validators.boolean),
forcedJSONParsing: validators.transitional(validators.boolean),
clarifyTimeoutError: validators.transitional(validators.boolean)
clarifyTimeoutError: validators.transitional(validators.boolean),
legacyInterceptorReqResOrdering: validators.transitional(validators.boolean)
}, false);
}
@@ -139,7 +141,14 @@ class Axios {
synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
const transitional = config.transitional || transitionalDefaults;
const legacyInterceptorReqResOrdering = transitional && transitional.legacyInterceptorReqResOrdering;
if (legacyInterceptorReqResOrdering) {
requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
} else {
requestInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
}
});
const responseInterceptorChain = [];
+2 -1
View File
@@ -3,5 +3,6 @@
export default {
silentJSONParsing: true,
forcedJSONParsing: true,
clarifyTimeoutError: false
clarifyTimeoutError: false,
legacyInterceptorReqResOrdering: true
};
+57
View File
@@ -91,6 +91,63 @@ describe('interceptors', function () {
});
});
it('should execute request interceptor in legacy order', function (done) {
let sequence = '';
axios.interceptors.request.use(function (config) {
sequence += '1';
return config;
});
axios.interceptors.request.use(function (config) {
sequence += '2';
return config;
});
axios.interceptors.request.use(function (config) {
sequence += '3';
return config;
});
axios({
url: '/foo',
});
getAjaxRequest().then(function (request) {
expect(sequence).toBe('321');
done();
});
});
it('should execute request interceptor in order', function (done) {
let sequence = '';
axios.interceptors.request.use(function (config) {
sequence += '1';
return config;
});
axios.interceptors.request.use(function (config) {
sequence += '2';
return config;
});
axios.interceptors.request.use(function (config) {
sequence += '3';
return config;
});
axios({
url: '/foo',
transitional: {
legacyInterceptorReqResOrdering: false
}
});
getAjaxRequest().then(function (request) {
expect(sequence).toBe('123');
done();
});
});
it('runs the interceptor if runWhen function is provided and resolves to true', function (done) {
function onGetCall(config) {
return config.method === 'get';