From 770d495440daba56713f53ca024cd34a5075c693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8A=A0=E9=87=8C?= Date: Sat, 9 Aug 2014 14:16:59 +0800 Subject: [PATCH] add https server mode --- index.js | 58 ++++++++++++++++++++++++++++++++++++----------- lib/createCert.js | 15 ++++++++++++ lib/serverMgr.js | 14 ++---------- 3 files changed, 62 insertions(+), 25 deletions(-) create mode 100644 lib/createCert.js diff --git a/index.js b/index.js index f5d22fa..c873693 100644 --- a/index.js +++ b/index.js @@ -1,16 +1,50 @@ -var PROXY_PORT = 8001; - var http = require('http'), https = require('https'), fs = require('fs'), net = require('net'), url = require('url'), 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 options = { hostname : urlPattern.host, @@ -20,6 +54,7 @@ var httpProxyServer = http.createServer(function (req, res) { headers : req.headers }; + //forward to real server var directReq = http.request(options,function(directRes){ res.writeHead(directRes.statusCode , directRes.headers); directRes.pipe(res); @@ -30,11 +65,11 @@ var httpProxyServer = http.createServer(function (req, res) { res.end(); }); - 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]; //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); } }); -}); - -httpProxyServer.listen(PROXY_PORT); -console.log("proxy started at port " + PROXY_PORT); \ No newline at end of file +} diff --git a/lib/createCert.js b/lib/createCert.js new file mode 100644 index 0000000..d427741 --- /dev/null +++ b/lib/createCert.js @@ -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); + } + }); +} \ No newline at end of file diff --git a/lib/serverMgr.js b/lib/serverMgr.js index 2331506..b4f8c09 100644 --- a/lib/serverMgr.js +++ b/lib/serverMgr.js @@ -6,7 +6,7 @@ var getPort = require('./getPort'), fs = require('fs'), net = require('net'), url = require('url'), - exec = require('child_process').exec; + createCert= require("./createCert"); if(!fs.existsSync("cert/tmpCert")){ fs.mkdirSync("cert/tmpCert"); @@ -50,17 +50,7 @@ module.exports =function(){ //create a cert for this hostname if not exists function(callback){ if(!fs.existsSync(keyFile) || !fs.existsSync(crtFile)){ - 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); - } - }); + createCert(hostname,callback) }else{ callback(null); }