A fully configurable proxy in NodeJS, which can handle HTTPS requests perfectly.
A fully configurable proxy in NodeJS, which can handle HTTPS requests perfectly.
npm install -g anyproxy
, may require sudo
anyproxy
anyproxy --port 8001
anyproxy --rule /path/to/ruleFile.js
samples in rule_sample
rule__blank.js, blank rule file with some comments. You may read this before writing your own rule file.
rule_adjust_response_time.js, delay all the response for 1500ms
rule file scheme is as follows, you may also get it from rule__blank.js
module.exports = {
/*
these functions will overwrite the default ones, write your own when necessary.
*/
//whether to intercept this request by local logic
//if the return value is true, anyproxy will call dealLocalResponse to get response data and will not send request to remote server anymore
shouldUseLocalResponse : function(req,reqBody){
return false;
},
//you may deal the response locally instead of sending it to server
//this function be called when shouldUseLocalResponse returns true
//callback(statusCode,resHeader,responseData)
//e.g. callback(200,{"content-type":"text/html"},"hello world")
dealLocalResponse : function(req,reqBody,callback){
callback(statusCode,resHeader,responseData)
},
//replace the request protocol when sending to the real server
//protocol : "http" or "https"
replaceRequestProtocol:function(req,protocol){
var newProtocol = protocol;
return newProtocol;
},
//req is user's request sent to the proxy server
//option is how the proxy server will send request to the real server. i.e. require("http").request(option,function(){...})
//you may return a customized option to replace the original option
//you should not write content-length header in options, since anyproxy will handle it for you
replaceRequestOption : function(req,option){
var newOption = option;
return newOption;
},
//replace the request body
replaceRequestData: function(req,data){
return data;
},
//replace the statusCode before it's sent to the user
replaceResponseStatusCode: function(req,res,statusCode){
var newStatusCode = statusCode;
return newStatusCode;
},
//replace the httpHeader before it's sent to the user
//Here header == res.headers
replaceResponseHeader: function(req,res,header){
var newHeader = header;
return newHeader;
},
//replace the response from the server before it's sent to the user
//you may return either a Buffer or a string
//serverResData is a Buffer, you may get its content by calling serverResData.toString()
replaceServerResData: function(req,res,serverResData){
return serverResData;
},
//add a pause before sending response to user
pauseBeforeSendingResponse : function(req,res){
var timeInMS = 1; //delay all requests for 1ms
return timeInMS;
},
//should intercept https request, or it will be forwarded to real server
shouldInterceptHttpsReq :function(req){
return false;
}
};
openssl
should be exposed to your shellanyproxy --root
,follow the instructions on screencd
to that directory, add/trust the rootCA.crt file to your system keychain. In OSX, you may do that by open the *crt file directlyanyproxy --type https --host my.domain.com
host
is required with https proxy and it should be kept exactly what it it when you config your browser. Otherwise, you may get some warning about security.npm install anyproxy --save
var proxy = require("anyproxy");
!proxy.isRootCAFileExists() && proxy.generateRootCA(); //please manually trust this rootCA
new proxy.proxyServer("http","8001", "localhost" ,"path/to/rule/file.js");
anyproxy --clear