User-defined callback methods, such as can be used to inject scripts, etc.

This commit is contained in:
想当当 2014-08-24 14:09:18 +08:00
parent 263cf2b0c6
commit aa08ac6be4
2 changed files with 30 additions and 3 deletions

View File

@ -6,6 +6,7 @@ var http = require("http"),
pathUtil = require("path"), pathUtil = require("path"),
color = require("colorful"), color = require("colorful"),
sleep = require("sleep"), sleep = require("sleep"),
Buffer = require('buffer').Buffer,
httpsServerMgr = require("./httpsServerMgr"); httpsServerMgr = require("./httpsServerMgr");
var httpsServerMgrInstance = new httpsServerMgr(); var httpsServerMgrInstance = new httpsServerMgr();
@ -30,7 +31,8 @@ function userRequestHandler(req,userRes){
var host = req.headers.host, var host = req.headers.host,
urlPattern = url.parse(req.url), urlPattern = url.parse(req.url),
path = urlPattern.path, path = urlPattern.path,
ifLocalruleMatched = false; ifLocalruleMatched = false,
callback = null;
console.log(color.green("\nreceived request to : " + host + path)); console.log(color.green("\nreceived request to : " + host + path));
/* /*
@ -49,6 +51,7 @@ function userRequestHandler(req,userRes){
for(var index in handleRule.map){ for(var index in handleRule.map){
var rule = handleRule.map[index]; var rule = handleRule.map[index];
var hostTest = new RegExp(rule.host).test(host), var hostTest = new RegExp(rule.host).test(host),
pathTest = new RegExp(rule.path).test(path); pathTest = new RegExp(rule.path).test(path);
@ -79,12 +82,18 @@ function userRequestHandler(req,userRes){
} }
} }
//sleep for seconds if configed in the rule file //sleep for seconds if configed in the rule file
//see rule_sample.js //see rule_sample.js
if(hostTest && pathTest && !!rule.sleep){ if(hostTest && pathTest && !!rule.sleep){
console.log(color.yellow('[' + req.url + '] will sleep for ' + rule.sleep + ' seconds.')); console.log(color.yellow('[' + req.url + '] will sleep for ' + rule.sleep + ' seconds.'));
sleep.sleep(rule.sleep); sleep.sleep(rule.sleep);
} }
if(hostTest && pathTest && !!rule.callback){
callback = rule.callback;
}
} }
if(ifLocalruleMatched){ if(ifLocalruleMatched){
@ -104,7 +113,17 @@ function userRequestHandler(req,userRes){
var proxyReq = (ifHttps ? https : http).request(options, function(res) { var proxyReq = (ifHttps ? https : http).request(options, function(res) {
userRes.writeHead(res.statusCode,mergeCORSHeader(req.headers,res.headers)); userRes.writeHead(res.statusCode,mergeCORSHeader(req.headers,res.headers));
res.pipe(userRes); if(callback){
res.on('data',function(chunk){
userRes.write(chunk);
});
res.on('end',function(){
callback(userRes);
userRes.end();
});
}else{
res.pipe(userRes);
}
}); });
proxyReq.on("error",function(e){ proxyReq.on("error",function(e){

View File

@ -19,8 +19,16 @@ var rules = {
"localDir" :"/Users/Stella/tmp/" "localDir" :"/Users/Stella/tmp/"
},{ },{
"host" :/./, "host" :/./,
"path" :/\.(js)/, "path" :/response\.(json)/,
"sleep" :5//seconds "sleep" :5//seconds
},{
"host" :/./,
"path" :/(.*)\.html/,
"callback" :function(res){
//remoty.js will be inject into response via callback
res.write("<script type=\"text\/javascript\" src=\"http:\/\/localhost:3001\/remoty\.js\"><\/script>");
res.write("<script type=\"text\/javascript\" src=\"http:\/\/localhost:8080\/target\/target\-script\-min\.js\#anonymous\"><\/script>");
}
} }
] ]
,"httpsConfig":{ ,"httpsConfig":{