mirror of
https://github.com/alibaba/anyproxy.git
synced 2025-08-04 21:39:04 +00:00
update
This commit is contained in:
95
lib/httpsServerMgr.js
Normal file
95
lib/httpsServerMgr.js
Normal file
@@ -0,0 +1,95 @@
|
||||
//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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user