Skip to content

Instantly share code, notes, and snippets.

@undoZen
Last active August 29, 2015 14:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save undoZen/11037150 to your computer and use it in GitHub Desktop.
Save undoZen/11037150 to your computer and use it in GitHub Desktop.
'use strict';
var http = require('http');
var request = require('request');
var nth = require('co-nth-arg');
var _ = require('lodash');
module.exports = function (propName, options) {
propName = propName || 'api';
return function *apiproxy (next) {
var that = this;
this.__defineGetter__(propName, (function () {
var cache;
function () {
return cache || (cache = defaults(that, options));
}
}()));
yield next;
}
}
function defaults(ctx, options) {
var urlPrefix;
if ('urlPrefix' in options) {
urlPrefix = options.urlPrefix;
delete options.urlPrefix;
}
options = _.defaults({
agent: new http.Agent({maxSockets: 2})
}, options);
var defaultHeaders = {
Cookie: ctx.header.cookie,
'X-Forwarded-For': ctx.ips.concat([ctx.socket.remoteAddress]).join(',')
};
if (options.headers) {
options.headers = _.defaults(defaultHeaders, options.headers);
} else {
options.headers = defaultHeaders;
}
var def = function (method) {
var d = function (uri, opts, callback) {
var params = initParams(uri, opts, callback)
if (params.options.headers) {
params.options.headers = _.defaults(options.headers, params.options.headers);
}
params.options = _.defaults(options, params.options);
if (urlPrefix && !params.options.uri.match(/^https?:\/\//i)) {
params.options.uri = urlPrefix + params.options.uri;
}
return method(params.options, params.callback)
}
return nth.thunkify(1, d);
}
var de = def(request);
de.jar = request.jar;
'get patch post put head del cookie'.split(' ').forEach(function (m) {
de[m] = def(request[m]);
});
return de;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment