mirror of
https://github.com/avwo/whistle.git
synced 2026-10-21 16:56:05 +08:00
44 lines
1.1 KiB
JavaScript
44 lines
1.1 KiB
JavaScript
var hagent = require('hagent');
|
|
var tls = require('tls');
|
|
var ca = require('./ca');
|
|
|
|
var createTLSServer = function(options, listener) {
|
|
return tls.createServer(options, listener);
|
|
};
|
|
var getTLSServer = hagent.create(createTLSServer, 41500);
|
|
var callbacks = [];
|
|
var TIMEOUT = 3000;
|
|
var sniPort;
|
|
|
|
var SNICallback = function(serverName, cb) {
|
|
serverName = ca.getDomain(serverName);
|
|
cb(null, ca.createCertificate(serverName));
|
|
};
|
|
|
|
exports.getSNIServer = function(listener, callback) {
|
|
if (sniPort) {
|
|
return callback(sniPort);
|
|
}
|
|
getTLSServer({ SNICallback: SNICallback }, listener, function(server, port) {
|
|
var removeServer = function() {
|
|
sniPort = null;
|
|
try {
|
|
server.close();
|
|
} catch(e) {} //重复关闭会导致异常
|
|
};
|
|
server.on('error', removeServer);
|
|
var timeout = setTimeout(removeServer, TIMEOUT);
|
|
server.once('secureConnection', function() {
|
|
clearTimeout(timeout);
|
|
});
|
|
sniPort = port;
|
|
callbacks.forEach(function(cb) {
|
|
cb(sniPort);
|
|
});
|
|
});
|
|
};
|
|
|
|
exports.getDomain = ca.getDomain;
|
|
exports.existsCustomCert = ca.existsCustomCert;
|
|
exports.getRootCAFile = ca.getRootCAFile;
|