mirror of
https://github.com/alibaba/anyproxy.git
synced 2025-04-22 12:01:25 +00:00
96 lines
3.0 KiB
JavaScript
96 lines
3.0 KiB
JavaScript
//manage https servers
|
|
var getPort = require('./getPort'),
|
|
async = require("async"),
|
|
http = require('http'),
|
|
https = require('https'),
|
|
fs = require('fs'),
|
|
net = require('net'),
|
|
url = require('url'),
|
|
certMgr = require("./certMgr"),
|
|
requestHandler = require("./requestHandler");
|
|
|
|
if(!fs.existsSync("cert/tmpCert")){
|
|
fs.mkdirSync("cert/tmpCert");
|
|
}
|
|
|
|
var DEFAULT_RELEASE_TIME = 120*1000;
|
|
|
|
module.exports =function(){
|
|
var self = this;
|
|
self.serverList = {
|
|
/* schema sample
|
|
"www.alipay.com":{
|
|
port:123,
|
|
server : serverInstance,
|
|
lastestUse: 99999 //unix time stamp
|
|
}
|
|
*/
|
|
};
|
|
|
|
//fetch a port for https server with hostname
|
|
this.fetchPort = function(hostname,userCB){
|
|
var serverInfo = self.serverList[hostname],
|
|
port;
|
|
|
|
//server exists
|
|
if(serverInfo){
|
|
console.log("exists :" + hostname );
|
|
serverInfo.lastestUse = new Date().getTime();
|
|
port = serverInfo.port;
|
|
userCB && userCB(null,port);
|
|
|
|
//create server with corresponding CA
|
|
}else{
|
|
console.log("creating :" + hostname );
|
|
async.series([
|
|
//find a clean port
|
|
function(callback){
|
|
getPort(function(cleanPort){
|
|
port = cleanPort;
|
|
callback(null,port);
|
|
});
|
|
}
|
|
|
|
//create server
|
|
,function(callback){
|
|
certMgr.getCertificate(hostname,function(err,keyContent,crtContent){
|
|
var server = createHttpsServer(port,keyContent,crtContent);
|
|
self.serverList[hostname] = {
|
|
port : port,
|
|
server : server,
|
|
lastestUse : new Date().getTime()
|
|
};
|
|
console.log("https server @port __portNum for __HOST established".replace(/__portNum/,port).replace(/__HOST/,hostname));
|
|
callback && callback(null,port);
|
|
|
|
});
|
|
}
|
|
],function(err,result){
|
|
userCB && userCB(err,result[result.length - 1]);
|
|
});
|
|
}
|
|
};
|
|
|
|
//clear servers which have been idle for some time
|
|
setInterval(function(){
|
|
var timeNow = new Date().getTime();
|
|
for(var serverName in self.serverList){
|
|
var item = self.serverList[serverName];
|
|
if( (timeNow - item.lastestUse) > DEFAULT_RELEASE_TIME){
|
|
item.server.close();
|
|
delete self.serverList[serverName];
|
|
console.log("https server released : " + serverName);
|
|
}
|
|
}
|
|
|
|
},DEFAULT_RELEASE_TIME);
|
|
}
|
|
|
|
function createHttpsServer(port,keyContent,crtContent){
|
|
return https.createServer({
|
|
key : keyContent,
|
|
cert: crtContent
|
|
},requestHandler).listen(port);
|
|
}
|
|
|