Files
whistle/lib/https/util.js
T
2018-06-07 19:01:24 +08:00

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;