53 lines
1.4 KiB
JavaScript
53 lines
1.4 KiB
JavaScript
/* jshint node:true */
|
|
'use strict';
|
|
|
|
var util = require('util');
|
|
var http = require('http');
|
|
var HttpAgent = http.Agent;
|
|
var https = require('https');
|
|
var HttpsAgent = https.Agent;
|
|
|
|
var pick = require('lodash/pick');
|
|
|
|
/**
|
|
* Proxy some traffic over HTTP.
|
|
*/
|
|
function OuterHttpAgent(opts) {
|
|
HttpAgent.call(this, opts);
|
|
mixinProxying(this, opts.proxy);
|
|
}
|
|
util.inherits(OuterHttpAgent, HttpAgent);
|
|
exports.OuterHttpAgent = OuterHttpAgent;
|
|
|
|
/**
|
|
* Proxy some traffic over HTTPS.
|
|
*/
|
|
function OuterHttpsAgent(opts) {
|
|
HttpsAgent.call(this, opts);
|
|
mixinProxying(this, opts.proxy);
|
|
}
|
|
util.inherits(OuterHttpsAgent, HttpsAgent);
|
|
exports.OuterHttpsAgent = OuterHttpsAgent;
|
|
|
|
/**
|
|
* Override createConnection and addRequest methods on the supplied agent.
|
|
* http.Agent and https.Agent will set up createConnection in the constructor.
|
|
*/
|
|
function mixinProxying(agent, proxyOpts) {
|
|
agent.proxy = proxyOpts;
|
|
|
|
var orig = pick(agent, 'createConnection', 'addRequest');
|
|
|
|
// Make the tcp or tls connection go to the proxy, ignoring the
|
|
// destination host:port arguments.
|
|
agent.createConnection = function(port, host, options) {
|
|
return orig.createConnection.call(this, this.proxy.port, this.proxy.host, options);
|
|
};
|
|
|
|
agent.addRequest = function(req, options) {
|
|
req.path =
|
|
this.proxy.innerProtocol + '//' + options.host + ':' + options.port + req.path;
|
|
return orig.addRequest.call(this, req, options);
|
|
};
|
|
}
|