diff --git a/README.md b/README.md index 0a50e1e4..b0921354 100644 --- a/README.md +++ b/README.md @@ -167,14 +167,14 @@ 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', + // `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. // 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 - // `transformRequest` allows changes to the request data before it is sent to the server // This is only applicable for request methods 'PUT', 'POST', and 'PATCH' // The last function in the array must return a string or an ArrayBuffer @@ -221,6 +221,12 @@ These are the available config options for making requests. Only the `url` is re // should be made using credentials withCredentials: false, // default + // `adapter` allows custom handling of requests which makes testing easier. + // Call `resolve` or `reject` and supply a valid response (see [response docs](#response-api)). + adapter: function (resolve, reject, config) { + /* ... */ + }, + // `auth` indicates that HTTP Basic auth should be used, and supplies credentials. // This will set an `Authorization` header, overwriting any existing // `Authorization` custom headers you have set using `headers`. diff --git a/lib/core/dispatchRequest.js b/lib/core/dispatchRequest.js index 3e566d1b..a6b50dea 100644 --- a/lib/core/dispatchRequest.js +++ b/lib/core/dispatchRequest.js @@ -10,12 +10,21 @@ module.exports = function dispatchRequest(config) { return new Promise(function executor(resolve, reject) { try { - if ((typeof XMLHttpRequest !== 'undefined') || (typeof ActiveXObject !== 'undefined')) { + var adapter; + + if (typeof config.adapter === 'function') { + // For custom adapter support + adapter = config.adapter; + } else if (typeof XMLHttpRequest !== 'undefined') { // For browsers use XHR adapter - require('../adapters/xhr')(resolve, reject, config); + adapter = require('../adapters/xhr'); } else if (typeof process !== 'undefined') { // For node use HTTP adapter - require('../adapters/http')(resolve, reject, config); + adapter = require('../adapters/http'); + } + + if (typeof adapter === 'function') { + adapter(resolve, reject, config); } } catch (e) { reject(e); diff --git a/test/specs/adapter.spec.js b/test/specs/adapter.spec.js new file mode 100644 index 00000000..3db34be1 --- /dev/null +++ b/test/specs/adapter.spec.js @@ -0,0 +1,20 @@ +var axios = require('../../index'); + +describe('adapter', function () { + it('should support custom adapter', function (done) { + var called = false; + + axios({ + url: '/foo', + adapter: function (resolve, reject, config) { + called = true; + } + }); + + setTimeout(function () { + expect(called).toBe(true); + done(); + }, 0); + }); +}); +