看到node.js的httpServer和http.request,第一个想法居然是可以用它做一个代理服务器
下面代码,实现了代理的基本功能,通过网络的代理设置将你的浏览器的请求转到这个httpServer上,其接收到浏览器的http请求,转发到目的服务器,再将收到的数据转移到浏览器~~~就一二道贩子。
var _http = require(\'http\'), _util = require(\'util\'), //记录当前是第几个请求 number = 0; _http.createServer(function(req, res){ number++; res.number = number; var headers = req.headers, post = \'\', url = req.url; //_url.parse(req.url, true)--解析url console.log(\'\n======\n[\' + number + \']--http--start--[\' + req.method + \']\' + url); if(req.method == \'POST\'){ //接收post req.on(\'data\', function(chunk){ post += chunk; }); req.on(\'end\', function(){ post = _querystring.parse(post); httpRequest(res, headers, url, post); }); }else{ httpRequest(res, headers, url); } }).listen(3333); console.log(\'http server start at parth 3333\n\n\n\'); /* * 发送请求 */ function httpRequest(mainRes, headers, url, post){ var host = headers.host; host = host.split(\':\'); var options = { host : host[0], port : (host[1] ? host[1] : \'80\'), path : url, method : (post ? \'POST\' : \'GET\'), headers : headers }; //去掉gzip delete options.headers[\'accept-encoding\']; console.log(\'[\' + mainRes.number + \']----start http.request-- options:\n%s\n\', _util.inspect(options)); var req_ = _http.request(options, function(res_){ var status_ = res_.statusCode, headers_ = res_.headers, data = \'\'; console.log(\'[\' + mainRes.number + \']----export http.request-(\' + status_ + \')-headers:%s\', _util.inspect(headers_)); //写header mainRes.writeHead(status_, headers_); var encoding = \'utf8\'; //根据数据类型确定编码方式 if(headers_[\'content-type\'] && (headers_[\'content-type\'].indexOf(\'image\') >= 0 || headers_[\'content-type\'].indexOf(\'application\') >= 0 || headers_[\'content-type\'].indexOf(\'audio\') >= 0 || headers_[\'content-type\'].indexOf(\'video\') >= 0)){ encoding = \'binary\'; } res_.setEncoding(encoding); //接收数据,转给原请求 res_.on(\'data\', function(d){ console.log(\'data-------\' + d.length); var b = new Buffer(d, encoding); mainRes.write(b, encoding); }); res_.on(\'end\', function(){ //请求结束 mainRes.end(); console.log(\'[\' + mainRes.number + \']--------http.request---end----\'); }); }); req_.on(\'error\', function(e){ console.log([\' + mainRes.number + \'] + \'----ERROR----problem with request: \' + e.message); }); //发送post if(post){ req_.write(_querystring.stringify(post)); } req_.end(); } |
当然,这段代码仅仅是学习目的的,并没有什么实际意义,https、gzip的问题都没解决,如果网站是gbk的,拿它访问也会乱码
如果要拿它FQ,需要部署两个类似的服务,比如墙外A墙内B,将浏览器代理到B,由B将host隐藏起来,再转到A,A将隐藏的目的host恢复过来,再去访问最终的目的网站
用上面的目的试了试非死不可,不稳定,时不时的会出错~~等完善的再分享给大家