You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.7 KiB
63 lines
1.7 KiB
var HttpAgent = require('http').Agent;
|
|
var HttpsAgent = require('https').Agent;
|
|
var inherits = require('util').inherits;
|
|
|
|
var Client;
|
|
|
|
[HttpAgent, HttpsAgent].forEach((ctor) => {
|
|
function SSHAgent(connectCfg, agentOptions) {
|
|
if (!(this instanceof SSHAgent))
|
|
return new SSHAgent(connectCfg, agentOptions);
|
|
|
|
ctor.call(this, agentOptions);
|
|
|
|
this._connectCfg = connectCfg;
|
|
this._defaultSrcIP = (agentOptions && agentOptions.srcIP) || 'localhost';
|
|
}
|
|
inherits(SSHAgent, ctor);
|
|
|
|
SSHAgent.prototype.createConnection = createConnection;
|
|
|
|
exports[ctor === HttpAgent ? 'SSHTTPAgent' : 'SSHTTPSAgent'] = SSHAgent;
|
|
});
|
|
|
|
function createConnection(options, cb) {
|
|
var srcIP = (options && options.localAddress) || this._defaultSrcIP;
|
|
var srcPort = (options && options.localPort) || 0;
|
|
var dstIP = options.host;
|
|
var dstPort = options.port;
|
|
|
|
if (Client === undefined)
|
|
Client = require('./client').Client;
|
|
|
|
var client = new Client();
|
|
var triedForward = false;
|
|
client.on('ready', () => {
|
|
client.forwardOut(srcIP, srcPort, dstIP, dstPort, (err, stream) => {
|
|
triedForward = true;
|
|
if (err) {
|
|
client.end();
|
|
return cb(err);
|
|
}
|
|
stream.once('close', () => {
|
|
client.end();
|
|
});
|
|
cb(null, decorateStream(stream));
|
|
});
|
|
}).on('error', cb).on('close', () => {
|
|
if (!triedForward)
|
|
cb(new Error('Unexpected connection loss'));
|
|
}).connect(this._connectCfg);
|
|
}
|
|
|
|
function noop() {}
|
|
|
|
function decorateStream(stream) {
|
|
stream.setKeepAlive = noop;
|
|
stream.setNoDelay = noop;
|
|
stream.setTimeout = noop;
|
|
stream.ref = noop;
|
|
stream.unref = noop;
|
|
stream.destroySoon = stream.destroy;
|
|
return stream;
|
|
}
|
|
|