var utils = require("./util"), bodyParser = require("body-parser"), path = require("path"), fs = require("fs"), Promise = require("promise"); var isRootCAFileExists = require("./certMgr.js").isRootCAFileExists(), interceptFlag = false; //e.g. [ { keyword: 'aaa', local: '/Users/Stella/061739.pdf' } ] var mapConfig = [], configFile = "mapConfig.json"; function saveMapConfig(content,cb){ new Promise(function(resolve,reject){ var anyproxyHome = utils.getAnyProxyHome(), mapCfgPath = path.join(anyproxyHome,configFile); if(typeof content == "object"){ content = JSON.stringify(content); } resolve({ path :mapCfgPath, content :content }); }) .then(function(config){ return new Promise(function(resolve,reject){ fs.writeFile(config.path, config.content, function(e){ if(e){ reject(e); }else{ resolve(); } }); }); }) .catch(function(e){ cb && cb(e); }) .done(function(){ cb && cb(); }); } function getMapConfig(cb){ var read = Promise.denodeify(fs.readFile); new Promise(function(resolve,reject){ var anyproxyHome = utils.getAnyProxyHome(), mapCfgPath = path.join(anyproxyHome,configFile); resolve(mapCfgPath); }) .then(read) .then(function(content){ return JSON.parse(content); }) .catch(function(e){ cb && cb(e); }) .done(function(obj){ cb && cb(null,obj); }); } setTimeout(function(){ //load saved config file getMapConfig(function(err,result){ if(result){ mapConfig = result; } }); },1000); module.exports = { summary:function(){ var tip = "the default rule for AnyProxy which supports CORS."; if(!isRootCAFileExists){ tip += "\nRoot CA does not exist, will not intercept any https requests."; } return tip; }, shouldUseLocalResponse : function(req,reqBody){ //intercept all options request if(req.method == "OPTIONS"){ return true; }else{ var simpleUrl = (req.headers.host || "") + (req.url || ""); mapConfig.map(function(item){ var key = item.keyword; if(simpleUrl.indexOf(key) >= 0){ req.anyproxy_map_local = item.local; return false; } }); return !!req.anyproxy_map_local; } }, dealLocalResponse : function(req,reqBody,callback){ if(req.method == "OPTIONS"){ callback(200,mergeCORSHeader(req.headers),""); }else if(req.anyproxy_map_local){ fs.readFile(req.anyproxy_map_local,function(err,buffer){ if(err){ callback(200, {}, "[AnyProxy failed to load local file] " + err); }else{ callback(200, {}, buffer); } }); } }, replaceRequestProtocol:function(req,protocol){ }, replaceRequestOption : function(req,option){ }, replaceRequestData: function(req,data){ }, replaceResponseStatusCode: function(req,res,statusCode){ }, replaceResponseHeader: function(req,res,header){ return mergeCORSHeader(req.headers, header); }, // Deprecated // replaceServerResData: function(req,res,serverResData){ // return serverResData; // }, replaceServerResDataAsync: function(req,res,serverResData,callback){ callback(serverResData); }, pauseBeforeSendingResponse: function(req,res){ }, shouldInterceptHttpsReq:function(req){ return interceptFlag; }, //[beta] //fetch entire traffic data fetchTrafficData: function(id,info){}, setInterceptFlag: function(flag){ interceptFlag = flag && isRootCAFileExists; }, _plugIntoWebinterface: function(app,cb){ app.get("/filetree",function(req,res){ try{ var root = req.query.root || utils.getUserHome() || "/"; utils.filewalker(root,function(err, info){ res.json(info); }); }catch(e){ res.end(e); } }); app.use(bodyParser.json()); app.get("/getMapConfig",function(req,res){ res.json(mapConfig); }); app.post("/setMapConfig",function(req,res){ mapConfig = req.body; res.json(mapConfig); saveMapConfig(mapConfig); }); cb(); }, _getCustomMenu : function(){ return [ // { // name:"test", // icon:"uk-icon-lemon-o", // url :"http://anyproxy.io" // } ]; } }; function mergeCORSHeader(reqHeader,originHeader){ var targetObj = originHeader || {}; delete targetObj["Access-Control-Allow-Credentials"]; delete targetObj["Access-Control-Allow-Origin"]; delete targetObj["Access-Control-Allow-Methods"]; delete targetObj["Access-Control-Allow-Headers"]; targetObj["access-control-allow-credentials"] = "true"; targetObj["access-control-allow-origin"] = reqHeader['origin'] || reqHeader['Origin'] || "-___-||"; targetObj["access-control-allow-methods"] = "GET, POST, PUT"; targetObj["access-control-allow-headers"] = reqHeader['access-control-request-headers'] || "-___-||"; return targetObj; }