Skip to content

Commit

Permalink
feat: Add config for ignoring absolute URLs (axios#5902) (axios#6192)
Browse files Browse the repository at this point in the history
* fix: prevent request url override

prevent request URL from overriding preconfigured base URL

BREAKING CHANGE: code relying on the above will now combine the URLs instead of prefer request URL

* feat: add config option for allowing absolute URLs

* fix: add default value for allowAbsoluteUrls in buildFullPath

* fix: typo in flow control when setting allowAbsoluteUrls

* feat: update tests supporting issue axios#5902 functionality

* feat: update README.md with allowAbsoluteUrls

* fix: properly group conditions in buildFullPath.js to avoid undefined error when baseUrl undefined

* Update README.md fix typo

* fix: update build full path logic to address failing test case

* fix: update base URL test

* fix: remove problem test (works locally, will not work in the pipeline)

* fix: update https test to use github.com instead of google.com

* fix: revert previous commit

* fix: add back problem test

* chore: remove un-needed passed var to URL class instanciation

---------

Co-authored-by: Austin Ryan Lawson <ryan.lawson2@gmail.com>
Co-authored-by: Jay <jasonsaayman@gmail.com>
  • Loading branch information
3 people authored Feb 12, 2025
1 parent 4a3e26c commit 32c7bcc
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 8 deletions.
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -375,11 +375,16 @@ These are the available config options for making requests. Only the `url` is re
// `method` is the request method to be used when making the request
method: 'get', // default

// `baseURL` will be prepended to `url` unless `url` is absolute.
// `baseURL` will be prepended to `url` unless `url` is absolute and option `allowAbsoluteUrls` is set to true.
// It can be convenient to set `baseURL` for an instance of axios to pass relative URLs
// to methods of that instance.
baseURL: 'https://some-domain.com/api/',

// `allowAbsoluteUrls` determines whether or not absolute URLs will override a configured `baseUrl`.
// When set to true (default), absolute values for `url` will override `baseUrl`.
// When set to false, absolute values for `url` will always be prepended by `baseUrl`.
allowAbsoluteUrls: true,

// `transformRequest` allows changes to the request data before it is sent to the server
// This is only applicable for request methods 'PUT', 'POST', 'PATCH' and 'DELETE'
// The last function in the array must return a string or an instance of Buffer, ArrayBuffer,
Expand Down
11 changes: 10 additions & 1 deletion lib/core/Axios.js
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,15 @@ class Axios {
}
}

// Set config.allowAbsoluteUrls
if (config.allowAbsoluteUrls !== undefined) {
// do nothing
} else if (this.defaults.allowAbsoluteUrls !== undefined) {
config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;
} else {
config.allowAbsoluteUrls = true;
}

validator.assertOptions(config, {
baseUrl: validators.spelling('baseURL'),
withXsrfToken: validators.spelling('withXSRFToken')
Expand Down Expand Up @@ -192,7 +201,7 @@ class Axios {

getUri(config) {
config = mergeConfig(this.defaults, config);
const fullPath = buildFullPath(config.baseURL, config.url);
const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);
return buildURL(fullPath, config.params, config.paramsSerializer);
}
}
Expand Down
5 changes: 3 additions & 2 deletions lib/core/buildFullPath.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@ import combineURLs from '../helpers/combineURLs.js';
*
* @returns {string} The combined full path
*/
export default function buildFullPath(baseURL, requestedURL) {
if (baseURL && !isAbsoluteURL(requestedURL)) {
export default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {
let isRelativeUrl = !isAbsoluteURL(requestedURL);
if (baseURL && isRelativeUrl || allowAbsoluteUrls == false) {
return combineURLs(baseURL, requestedURL);
}
return requestedURL;
Expand Down
6 changes: 5 additions & 1 deletion test/specs/core/buildFullPath.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,14 @@ describe('helpers::buildFullPath', function () {
expect(buildFullPath('https://api.github.com', '/users')).toBe('https://api.github.com/users');
});

it('should return the requestedURL when it is absolute', function () {
it('should not combine the URLs when the requestedURL is absolute', function () {
expect(buildFullPath('https://api.github.com', 'https://api.example.com/users')).toBe('https://api.example.com/users');
});

it('should combine the URLs when the requestedURL is absolute and allowAbsoluteUrls is false', function () {
expect(buildFullPath('https://api.github.com', 'https://api.example.com/users', false)).toBe('https://api.github.com/https://api.example.com/users');
});

it('should not combine URLs when the baseURL is not configured', function () {
expect(buildFullPath(undefined, '/users')).toBe('/users');
});
Expand Down
21 changes: 18 additions & 3 deletions test/specs/options.spec.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import AxiosHeaders from "../../lib/core/AxiosHeaders.js";
// import AxiosHeaders from "../../lib/core/AxiosHeaders.js";
// import isAbsoluteURL from '../../lib/helpers/isAbsoluteURL.js';

describe('options', function () {
beforeEach(function () {
Expand Down Expand Up @@ -63,8 +64,7 @@ describe('options', function () {
baseURL: 'http://test.com/'
});

instance.get('/foo');

instance.get('/foo')
getAjaxRequest().then(function (request) {
expect(request.url).toBe('http://test.com/foo');
done();
Expand Down Expand Up @@ -100,6 +100,21 @@ describe('options', function () {
});
});

it('should combine the URLs if base url and request url exist and allowAbsoluteUrls is false', function (done) {
const instance = axios.create({
baseURL: 'http://someurl.com/',
allowAbsoluteUrls: false
});

instance.get('http://someotherurl.com/');

getAjaxRequest().then(function (request) {
expect(request.url).toBe('http://someotherurl.com/');
done();
});

});

it('should change only the baseURL of the specified instance', function() {
const instance1 = axios.create();
const instance2 = axios.create();
Expand Down

0 comments on commit 32c7bcc

Please sign in to comment.