mirror of
https://github.com/avwo/whistle.git
synced 2026-10-18 22:51:32 +08:00
55 lines
1.4 KiB
JavaScript
55 lines
1.4 KiB
JavaScript
var hagent = require('hagent');
|
|
var tls = require('tls');
|
|
var ca = require('./ca');
|
|
|
|
var serverAgent = hagent.serverAgent;
|
|
serverAgent.createCertificate = ca.createCertificate;
|
|
exports.serverAgent = serverAgent;
|
|
|
|
var createTLSServer = function(options, listener) {
|
|
return tls.createServer(options, listener);
|
|
};
|
|
var getTLSServer = hagent.create(createTLSServer, 43900);
|
|
var callbacks = [];
|
|
var TIMEOUT = 6000;
|
|
var sniPort;
|
|
|
|
var SNICallback = function(serverName, cb) {
|
|
serverName = ca.getDomain(serverName);
|
|
var options = ca.createCertificate(serverName);
|
|
if (!options.ctx) {
|
|
options._ctx = ca.createSecureContext(options);
|
|
}
|
|
cb(null, options._ctx);
|
|
};
|
|
|
|
var removeServer = function() {
|
|
sniPort = null;
|
|
try {
|
|
this.close();
|
|
} catch(e) {} //重复关闭会导致异常
|
|
};
|
|
|
|
exports.getSNIServer = function(listener, callback) {
|
|
if (sniPort) {
|
|
return callback(sniPort);
|
|
}
|
|
getTLSServer({ SNICallback: SNICallback }, listener, function(server, port) {
|
|
server.on('error', removeServer);
|
|
var timeout = setTimeout(removeServer, TIMEOUT);
|
|
var clearup = function() {
|
|
clearTimeout(timeout);
|
|
};
|
|
server.once('tlsClientError', clearup);
|
|
server.once('secureConnection', clearup);
|
|
sniPort = port;
|
|
callbacks.forEach(function(cb) {
|
|
cb(sniPort);
|
|
});
|
|
});
|
|
};
|
|
|
|
exports.getDomain = ca.getDomain;
|
|
exports.existsCustomCert = ca.existsCustomCert;
|
|
exports.getRootCAFile = ca.getRootCAFile;
|