Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for baseURL parameter #160

Merged
merged 4 commits into from
Dec 11, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ You can create a new instance of axios with a custom config.

```js
var instance = axios.create({
baseURL: 'https://some-domain.com/api/',
timeout: 1000,
headers: {'X-Custom-Header': 'foobar'}
});
Expand All @@ -165,6 +166,11 @@ These are the available config options for making requests. Only the `url` is re
{
// `url` is the server URL that will be used for the request
url: '/user',

// `baseURL` will be prepended to `url` unless `url` is absolute.
// 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/',

// `method` is the request method to be used when making the request
method: 'get', // default
Expand Down
1 change: 1 addition & 0 deletions axios.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ declare module axios {
xsrfCookieName?: string;
xsrfHeaderName?: string;
paramsSerializer?: (params: any) => string;
baseURL?: string;
}

interface RequestOptions extends InstanceOptions {
Expand Down
6 changes: 6 additions & 0 deletions lib/axios.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ var defaults = require('./defaults');
var utils = require('./utils');
var dispatchRequest = require('./core/dispatchRequest');
var InterceptorManager = require('./core/InterceptorManager');
var isAbsoluteURL = require('./helpers/isAbsoluteURL');
var combineURLs = require('./helpers/combineURLs');

function Axios (defaultConfig) {
this.defaultConfig = utils.merge({
Expand All @@ -29,6 +31,10 @@ Axios.prototype.request = function (config) {

config = utils.merge(this.defaultConfig, { method: 'get' }, config);

if (config.baseURL && !isAbsoluteURL(config.url)) {
config.url = combineURLs(config.baseURL, config.url);
}

// Don't allow overriding defaults.withCredentials
config.withCredentials = config.withCredentials || defaults.withCredentials;

Expand Down
12 changes: 12 additions & 0 deletions lib/helpers/combineURLs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
'use strict';

/**
* Creates a new URL by combining the specified URLs
*
* @param {string} baseURL The base URL
* @param {string} relativeURL The relative URL
* @returns {string} The combined URL
*/
module.exports = function combineURLs(baseURL, relativeURL) {
return baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '');
};
14 changes: 14 additions & 0 deletions lib/helpers/isAbsoluteURL.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
'use strict';

/**
* Determines whether the specified URL is absolute
*
* @param {string} url The URL to test
* @returns {boolean} True if the specified URL is absolute, otherwise false
*/
module.exports = function isAbsoluteURL(url) {
// A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
// RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
// by any combination of letters, digits, plus, period, or hyphen.
return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);
};
15 changes: 15 additions & 0 deletions test/specs/helpers/combineURLs.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
var combineURLs = require('../../../lib/helpers/combineURLs');

describe('helpers::combineURLs', function () {
it('should combine URLs', function () {
expect(combineURLs('https://api.github.com', '/users')).toBe('https://api.github.com/users');
});

it('should remove duplicate slashes', function () {
expect(combineURLs('https://api.github.com/', '/users')).toBe('https://api.github.com/users');
});

it('should insert missing slash', function () {
expect(combineURLs('https://api.github.com', 'users')).toBe('https://api.github.com/users');
});
});
23 changes: 23 additions & 0 deletions test/specs/helpers/isAbsoluteURL.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
var isAbsoluteURL = require('../../../lib/helpers/isAbsoluteURL');

describe('helpers::isAbsoluteURL', function () {
it('should return true if URL begins with valid scheme name', function () {
expect(isAbsoluteURL('https://api.github.com/users')).toBe(true);
expect(isAbsoluteURL('custom-scheme-v1.0://example.com/')).toBe(true);
expect(isAbsoluteURL('HTTP://example.com/')).toBe(true);
});

it('should return false if URL begins with invalid scheme name', function () {
expect(isAbsoluteURL('123://example.com/')).toBe(false);
expect(isAbsoluteURL('!valid://example.com/')).toBe(false);
});

it('should return true if URL is protocol-relative', function () {
expect(isAbsoluteURL('//example.com/')).toBe(true);
});

it('should return false if URL is relative', function () {
expect(isAbsoluteURL('/foo')).toBe(false);
expect(isAbsoluteURL('foo')).toBe(false);
});
});
38 changes: 38 additions & 0 deletions test/specs/options.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,42 @@ describe('options', function () {
done();
}, 0);
});

it('should accept base URL', function (done) {
var request;

const instance = axios.create({
baseURL: 'http://test.com/'
});

instance.request({
url: '/foo'
});

setTimeout(function () {
request = jasmine.Ajax.requests.mostRecent();

expect(request.url).toBe('http://test.com/foo');
done();
}, 0);
});

it('should ignore base URL if request URL is absolute', function (done) {
var request;

const instance = axios.create({
baseURL: 'http://someurl.com/'
});

instance.request({
url: 'http://someotherurl.com/'
});

setTimeout(function () {
request = jasmine.Ajax.requests.mostRecent();

expect(request.url).toBe('http://someotherurl.com/');
done();
}, 0);
});
});