我智商爆棚
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

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;
}