diff --git a/index.js b/index.js index 015a3aed9..bcae54c7d 100644 --- a/index.js +++ b/index.js @@ -7,6 +7,7 @@ module.exports = { IncomingWebhook: require('./lib/clients/incoming-webhook/client'), LegacyRtmClient: require('./lib/clients/default/legacy-rtm'), MemoryDataStore: require('./lib/data-store/memory-data-store'), + requestOptionsTransport: require('./lib/clients/transports/request').requestOptionsTransport, CLIENT_EVENTS: { WEB: events.CLIENT_EVENTS.WEB, RTM: events.CLIENT_EVENTS.RTM diff --git a/lib/clients/transports/request.js b/lib/clients/transports/request.js index 67fca7949..5f42a41cc 100644 --- a/lib/clients/transports/request.js +++ b/lib/clients/transports/request.js @@ -5,9 +5,9 @@ var HttpsProxyAgent = require('https-proxy-agent'); var has = require('lodash').has; var partial = require('lodash').partial; +var defaults = require('lodash').defaults; var request = require('request'); - var handleRequestTranportRes = function handleRequestTranportRes(cb, err, response, body) { var headers; var statusCode; @@ -50,12 +50,18 @@ var proxiedRequestTransport = function proxiedRequestTransport(proxyURL) { }; }; +var requestOptionsTransport = function requestOptionsTransport(options) { + return function _requestOptionsTransport(args, cb) { + var requestArgs = defaults(options, getRequestTransportArgs(args)); + request.post(requestArgs, partial(handleRequestTranportRes, cb)); + }; +}; var requestTransport = function requestTransport(args, cb) { var requestArgs = getRequestTransportArgs(args); request.post(requestArgs, partial(handleRequestTranportRes, cb)); }; - module.exports.proxiedRequestTransport = proxiedRequestTransport; +module.exports.requestOptionsTransport = requestOptionsTransport; module.exports.requestTransport = requestTransport; diff --git a/test/clients/web/client.js b/test/clients/web/client.js index fe9bf7c34..d8d4d9713 100644 --- a/test/clients/web/client.js +++ b/test/clients/web/client.js @@ -11,6 +11,7 @@ var retryPolicies = require('../../../lib/clients/retry-policies'); var defaultHTTPResponseHandler = require('../../../lib/clients/transports/call-transport').handleHttpResponse; +var requestTransport = require('../../../lib/clients/transports/request'); var mockTransport = function (args, cb) { cb(args.data.err, args.headers, args.data.statusCode, args.data.body); @@ -109,6 +110,37 @@ describe('Web API Client', function () { client._makeAPICall('test', { test: 'test' }, null, null); }); + it('should accept overriding of request options', function () { + + // Add Basic Auth + + var options = { + auth: { + user: 'slack', + pass: 'slack' + } + }; + + var requestOptionsTransport = requestTransport.requestOptionsTransport(options); + + var client = new WebAPIClient('test-token', { transport: requestOptionsTransport }); + + // Mock a result where Basic Auth was passed + + nock('https://slack.com/api', { + reqheaders: { + authorization: /Basic [0-9A-Za-z]+/i + } + }) + .post('/test') + .reply(200, '{"test":"test"}'); + + client._makeAPICall('test', {}, null, function (e, results) { + expect(results.test).to.equal('test'); + }); + + }); + describe('it should retry failed or rate-limited requests', function () { var attemptAPICall = function (done) {