var config={
//不想访问的东西,节约流量
"404":[
"http://qidian.qpic.cn/qdbimg"
],
//奇数为需要下载的,偶数为不需要下载的
needLoad:[
//匹配需要下载的
[
"/*.js",
"/*.css",
"/*.png"
],
//匹配不需要下载的
[
"/a.js"
]
],
//修改文件保存的地方,默认按照url来的
saveFiles:[
//防止太深文件夹
["(//*/*/*/*/*/)**/","$1"],
//过滤无效文件夹字符
[/(\/\w*)\?+(\w*\/)/gi,"$1$2"]
],
//代理的端口号
port:100
} function regDir(str){
var reg=str
if(typeof reg=="string"){
reg=reg.replace(/[\[\]\\\^\:\.\?\+]/g,function(m){
return "\\"+m;
})
reg=reg.replace(/\*\*|\*/g,function(m){
if(m=="**"){
return "[\\w\\W]*";
}else{
return "[^\\\/]*";
} })
reg=new RegExp(reg,"gi")
}
return reg
}
String.prototype.Test=function(regStr){
var reg=regDir(regStr)
return reg.test(this)
}
String.prototype.Replace=function(regStr,fn){
var reg=regDir(regStr)
return this.replace(reg,fn);
}
var fs=require("fs")
function mkdir(filepath){
var path=require("path")
if(!fs.existsSync(path.dirname(filepath))){
mkdir(path.dirname(filepath))
}
if(!fs.existsSync(filepath)){
fs.mkdirSync(filepath)
}
} function eachHeader (obj, fn) {
if (Array.isArray(obj.rawHeaders)) {
// ideal scenario... >= node v0.11.x
// every even entry is a "key", every odd entry is a "value"
var key = null;
obj.rawHeaders.forEach(function (v) {
if (key === null) {
key = v;
} else {
fn(key, v);
key = null;
}
});
} else {
// otherwise we can *only* proxy the header names as lowercase'd
var headers = obj.headers;
if (!headers) return;
Object.keys(headers).forEach(function (key) {
var value = headers[key];
if (Array.isArray(value)) {
// set-cookie
value.forEach(function (val) {
fn(key, val);
});
} else {
fn(key, value);
}
});
}
}
var hopByHopHeaders = [
'Connection',
'Keep-Alive',
'Proxy-Authenticate',
'Proxy-Authorization',
'TE',
'Trailers',
'Transfer-Encoding',
'Upgrade'
];
// create a case-insensitive RegExp to match "hop by hop" headers
var isHopByHop = new RegExp('^(' + hopByHopHeaders.join('|') + ')$', 'i');
//伪造http
function parse (req, server) { var parsed = require("url").parse(req.url);
var socket = req.socket;
parsed.uri=parsed.href;
parsed.gzip=true;
// proxy the request HTTP method
parsed.method = req.method; // setup outbound proxy request HTTP headers
var headers = {};
var hasXForwardedFor = false;
parsed.headers = headers;
eachHeader(req, function (key, value) {
var keyLower = key.toLowerCase();
if (!hasXForwardedFor && 'x-forwarded-for' === keyLower) {
// append to existing "X-Forwarded-For" header
// http://en.wikipedia.org/wiki/X-Forwarded-For
hasXForwardedFor = true;
value += ', ' + socket.remoteAddress;
}
if (isHopByHop.test(key)) {
} else {
var v = headers[key];
if (Array.isArray(v)) {
v.push(value);
} else if (null != v) {
headers[key] = [ v, value ];
} else {
headers[key] = value;
}
}
}); if (!hasXForwardedFor) {
headers['X-Forwarded-For'] = socket.remoteAddress;
}
if (null == parsed.port) {
// default the port number if not specified, for >= node v0.11.6...
// https://github.com/joyent/node/issues/6199
parsed.port = 80;
}
return parsed
} function getPath(url){
var filename=url.Replace("(**)?*","$1").Replace("http://(**/*)","$1")
var dirname=filename.Replace("(**)/*","$1")
mkdir("www/"+dirname)
return "www/"+filename
}
var api={
parse:parse,
mkdir:mkdir,
getPath:getPath
}
/************************************/
var http = require('http');
var fs=require("fs")
var request = require('request'); var server = http.createServer();
server.listen(config.port||100, function () {
var port = server.address().port;
console.log('HTTP(s) proxy server listening on port %d', port);
}); server.on('request', function (req, res) { var url=req.url
var arr404=config["404"]
var is404=false
arr404.forEach(function(v,k){
if(url.Test(v)){
is404=true
}
})
if(is404){
res.end()
return
}
var parsed=api.parse(req,this)
//是否下载
var isLoaded=false; //是否下载的列表
var regArr=config.needLoad
var back=false
regArr.forEach(function(v,k){
back=!back
v.forEach(function(v2,k2){
if(url.Test(v2)){
isLoaded=back
}
})
})
//修改保存文件路径
/*
* 匹配规则
* 修改后 */
var saveFiles=config.saveFiles
// isLoaded=false
if(isLoaded){
saveFiles.forEach(function(v,k){
url=url.Replace(v[0],v[1])
})
console.log(url)
var path=api.getPath(url)
console.log(path)
//下载
var reque=request(parsed,function(err,resp,body){
if(err){
return
}
if(path.Test("/*.css")){
res.writeHead(200,{
"content-type":"text/css"
})
}
fs.createReadStream(path).pipe(res)
})
reque.pipe(fs.createWriteStream(path))
reque.on("error",function(){
console.error(url)
}) }else{
//不下载
var reque=request(parsed)
reque.pipe(res)
reque.on("error",function(){
console.error(url)
}) } })

  

最新文章

  1. PHP输出控制(Output Control)函数
  2. 复习练习(03)jquery Css方法一步步升级
  3. [CareerCup] 11.8 The Rank of Number 数的排行
  4. Android读取Manifest文件下Application等节点下的metadata自定义数据
  5. c/c++ 传统数组的缺点
  6. 在.Net中进行跨线程的控件操作(上篇:Control.Invoke)
  7. STL algorithmi算法s_sorted和is_sorted_until(28)
  8. tomcat创建一个windows服务
  9. 多个git账户生成多份rsa秘钥实现多个账户同时使用配置
  10. logback配置文件详解
  11. AngularJS学习篇(九)
  12. 转://oracle 软件的收费模式
  13. 理解pytorch中的softmax中的dim参数
  14. ERROR 3009 (HY000): Column count of mysql.user is wrong…..
  15. zabbix邮件报警功能的验证
  16. Chrome视频解析插件
  17. 《算法》第四章部分程序 part 19
  18. sqlserver 死锁相关
  19. 存折打印机测量和毫米方式Form配置说明
  20. 在pycharm和tensorflow环境下运行nmt

热门文章

  1. CF1073F Choosing Two Paths
  2. mac安装nose,command not found:nosetests
  3. iPhone的home键进果汁了,按起来粘粘的感觉
  4. HDU 6055 Regular polygon (暴力)
  5. mysql5.6数据库双机热备、主从备份
  6. .Net Core 项目区域请求设置
  7. 严选 Android 路由框架优化(下篇)
  8. 七、CommonJS规范和Note.js模块概念的介绍
  9. WPF中XAML的触发器的属性,事件 都有那些?以及如何寻找
  10. 《Thinking in Java》 10~