add https server mode

This commit is contained in:
加里 2014-08-09 14:16:59 +08:00
parent 146cc6a021
commit 770d495440
3 changed files with 62 additions and 25 deletions

View File

@ -1,16 +1,50 @@
var PROXY_PORT = 8001;
var http = require('http'), var http = require('http'),
https = require('https'), https = require('https'),
fs = require('fs'), fs = require('fs'),
net = require('net'), net = require('net'),
url = require('url'), url = require('url'),
exec = require('child_process').exec, exec = require('child_process').exec,
serverMgr = require("./lib/serverMgr"); serverMgr = require("./lib/serverMgr"),
createCert= require("./lib/createCert");
var serverMgrInstance = new serverMgr(); var PROXY_PORT = 8001,
T_PROXY_HTTP = 0,
T_PROXY_HTTPS = 1,
PROXY_TYPE = T_PROXY_HTTPS,
HOSTNAME = "localhost";
var httpProxyServer = http.createServer(function (req, res) { var serverMgrInstance = new serverMgr(),
httpProxyServer;
if(PROXY_TYPE == T_PROXY_HTTP){
httpProxyServer = http.createServer(dealProxyUserHttpReq);
}else{
var keyFile = "./cert/tmpCert/__hostname.key".replace(/__hostname/,HOSTNAME),
crtFile = "./cert/tmpCert/__hostname.crt".replace(/__hostname/,HOSTNAME);
if(!fs.existsSync(keyFile) || !fs.existsSync(crtFile)){
createCert(HOSTNAME,function(){
httpProxyServer = https.createServer({
key : fs.readFileSync(keyFile),
cert: fs.readFileSync(crtFile)
},dealProxyUserHttpReq);
});
}else{
httpProxyServer = https.createServer({
key : fs.readFileSync(keyFile),
cert: fs.readFileSync(crtFile)
},dealProxyUserHttpReq);
}
}
//listen CONNECT method for https over http
httpProxyServer.on('connect',dealProxyConnectReq);
httpProxyServer.listen(PROXY_PORT);
console.log( (PROXY_TYPE == T_PROXY_HTTP ? "Http" : "Https") + " proxy started at port " + PROXY_PORT);
function dealProxyUserHttpReq(req,res){
var urlPattern = url.parse(req.url); var urlPattern = url.parse(req.url);
var options = { var options = {
hostname : urlPattern.host, hostname : urlPattern.host,
@ -20,6 +54,7 @@ var httpProxyServer = http.createServer(function (req, res) {
headers : req.headers headers : req.headers
}; };
//forward to real server
var directReq = http.request(options,function(directRes){ var directReq = http.request(options,function(directRes){
res.writeHead(directRes.statusCode , directRes.headers); res.writeHead(directRes.statusCode , directRes.headers);
directRes.pipe(res); directRes.pipe(res);
@ -31,10 +66,10 @@ var httpProxyServer = http.createServer(function (req, res) {
}); });
directReq.end(); directReq.end();
}); }
//connect method for HTTPS over http
httpProxyServer.on('connect', function(req, socket, head){ function dealProxyConnectReq(req, socket, head){
var hostname = req.url.split(":")[0]; var hostname = req.url.split(":")[0];
//forward the https-request to local https server //forward the https-request to local https server
@ -55,7 +90,4 @@ httpProxyServer.on('connect', function(req, socket, head){
console.log("err fetch HTTPS server for host:" + hostname); console.log("err fetch HTTPS server for host:" + hostname);
} }
}); });
}); }
httpProxyServer.listen(PROXY_PORT);
console.log("proxy started at port " + PROXY_PORT);

15
lib/createCert.js Normal file
View File

@ -0,0 +1,15 @@
var exec = require('child_process').exec;
module.exports = function(hostname,callback){
console.log("creating cert for :" + hostname);
var cmd = "./gen-cer "+hostname;
exec(cmd,{cwd:"./cert/"},function(err,stdout,stderr){
if(err){
callback && callback(new Error("error when generating certificate"),null);
}else{
console.log("certificate created for __HOST".replace(/__HOST/,hostname));
callback(null);
}
});
}

View File

@ -6,7 +6,7 @@ var getPort = require('./getPort'),
fs = require('fs'), fs = require('fs'),
net = require('net'), net = require('net'),
url = require('url'), url = require('url'),
exec = require('child_process').exec; createCert= require("./createCert");
if(!fs.existsSync("cert/tmpCert")){ if(!fs.existsSync("cert/tmpCert")){
fs.mkdirSync("cert/tmpCert"); fs.mkdirSync("cert/tmpCert");
@ -50,17 +50,7 @@ module.exports =function(){
//create a cert for this hostname if not exists //create a cert for this hostname if not exists
function(callback){ function(callback){
if(!fs.existsSync(keyFile) || !fs.existsSync(crtFile)){ if(!fs.existsSync(keyFile) || !fs.existsSync(crtFile)){
console.log("creating cert for :" + hostname); createCert(hostname,callback)
var cmd = "./gen-cer "+hostname;
exec(cmd,{cwd:"./cert/"},function(err,stdout,stderr){
if(err){
callback && callback(new Error("error when generating certificate"),null);
}else{
console.log("certificate created for __HOST".replace(/__HOST/,hostname));
callback(null);
}
});
}else{ }else{
callback(null); callback(null);
} }