1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
/* 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);
};
}
|