Skip to content

Commit

Permalink
Adding support for beforeRedirect config option (#3852)
Browse files Browse the repository at this point in the history
* Adding support for beforeRedirect config option

* Adding tests for beforeRedirect

* Update README.md

Co-authored-by: Prabodh Meshram <prabodh.meshram7@gmail.com>

* fix types

Co-authored-by: Prabodh Meshram <prabodh.meshram7@gmail.com>
Co-authored-by: Jay <jasonsaayman@gmail.com>
  • Loading branch information
3 people committed Mar 7, 2022
1 parent 3d13b67 commit 412d3bd
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 3 deletions.
13 changes: 12 additions & 1 deletion README.md
Expand Up @@ -414,7 +414,18 @@ These are the available config options for making requests. Only the `url` is re

// `maxRedirects` defines the maximum number of redirects to follow in node.js.
// If set to 0, no redirects will be followed.
maxRedirects: 5, // default
maxRedirects: 21, // default

// `beforeRedirect` defines a function that will be called before redirect.
// Use this to adjust the request options upon redirecting,
// to inspect the latest response headers,
// or to cancel the request by throwing an error
// If maxRedirects is set to 0, `beforeRedirect` is not used.
beforeRedirect: (options, { headers }) => {
if (options.hostname === "example.com") {
options.auth = "user:password";
}
};

// `socketPath` defines a UNIX Socket to be used in node.js.
// e.g. '/var/run/docker.sock' to send requests to the docker daemon.
Expand Down
2 changes: 1 addition & 1 deletion index.d.ts
@@ -1,5 +1,4 @@
// TypeScript Version: 3.0

export type AxiosRequestHeaders = Record<string, string | number | boolean>;

export type AxiosResponseHeaders = Record<string, string> & {
Expand Down Expand Up @@ -98,6 +97,7 @@ export interface AxiosRequestConfig<D = any> {
validateStatus?: ((status: number) => boolean) | null;
maxBodyLength?: number;
maxRedirects?: number;
beforeRedirect?: (options: Record<string, any>, responseDetails: {headers: Record<string, string>}) => void;
socketPath?: string | null;
httpAgent?: any;
httpsAgent?: any;
Expand Down
5 changes: 4 additions & 1 deletion lib/adapters/http.js
Expand Up @@ -227,6 +227,9 @@ module.exports = function httpAdapter(config) {
if (config.maxRedirects) {
options.maxRedirects = config.maxRedirects;
}
if (config.beforeRedirect) {
options.beforeRedirect = config.beforeRedirect;
}
transport = isHttpsProxy ? httpsFollow : httpFollow;
}

Expand Down Expand Up @@ -326,7 +329,7 @@ module.exports = function httpAdapter(config) {

// Handle errors
req.on('error', function handleRequestError(err) {
if (req.aborted && err.code !== 'ERR_FR_TOO_MANY_REDIRECTS') return;
if (req.aborted && err.code !== 'ERR_FR_TOO_MANY_REDIRECTS') reject(err);
reject(enhanceError(err, config, null, req));
});

Expand Down
1 change: 1 addition & 0 deletions lib/core/mergeConfig.js
Expand Up @@ -80,6 +80,7 @@ module.exports = function mergeConfig(config1, config2) {
'decompress': defaultToConfig2,
'maxContentLength': defaultToConfig2,
'maxBodyLength': defaultToConfig2,
'beforeRedirect': defaultToConfig2,
'transport': defaultToConfig2,
'httpAgent': defaultToConfig2,
'httpsAgent': defaultToConfig2,
Expand Down
20 changes: 20 additions & 0 deletions test/unit/adapters/http.js
Expand Up @@ -241,6 +241,26 @@ describe('supports http with nodejs', function () {
});
});

it('should support beforeRedirect', function (done) {
server = http.createServer(function (req, res) {
res.setHeader('Location', '/foo');
res.statusCode = 302;
res.end();
}).listen(4444, function () {
axios.get('http://localhost:4444/', {
maxRedirects: 3,
beforeRedirect: function (options) {
if (options.path === '/foo') {
throw new Error('path not allowed');
}
}
}).catch(function (error) {
assert.equal(error.toJSON().message, 'path not allowed')
done();
});
});
});

it('should preserve the HTTP verb on redirect', function (done) {
server = http.createServer(function (req, res) {
if (req.method.toLowerCase() !== "head") {
Expand Down

0 comments on commit 412d3bd

Please sign in to comment.