javascript PAC 代码分析理解

2015-07-24 23:49:14 +08:00
 cattyhouse

以下是一个PAC文件,一个基本的白名单,可以通过添加域名扩展,我不是很懂Javascript,就一些代码的意思做了google,只是理解了其中一部分比如: if (/^\d+\.\d+\.\d+\.\d+$/g.test(host)) return 'DIRECT'; 用到了正则表达式,如果碰到纯ip的请求,就直连。
但是从 var vhost = host.toLowerCase(); 这一行开始我就懵了,有没有熟悉的能用白话文解释一下吗?多谢。

function FindProxyForURL(url, host) {
    var PROXY = 'SOCKS5 127.0.0.1:9999;SOCKS 127.0.0.1:9999';
    if (isPlainHostName(host)) return 'DIRECT';
    if (/^\d+\.\d+\.\d+\.\d+$/g.test(host)) return 'DIRECT';
    var rules = [
        [
            'cn',
            'lan',
            'local',
            'xn--fiqs8s'
        ], [
            'sinaapp.com',
            'qunar.com',
            'yihaodian.com',
        ], [
            'baixing.com',
            'xiami.com',
        ], [
            'mydrivers.com',
            'alisoft.com',
            '51jobcdn.com'
        ], [
            'zhi.hu',
        ]
    ];
    var vhost = host.toLowerCase();
    var rules_len = rules.length;
    for (var j = 0; j < rules_len; j++) {
        var rule_list = rules[j];
        var rule_list_len = rule_list.length;
        for (var i = 0; i < rule_list_len; i++) {
            var rule_entry = rule_list[i];
            var rule_dot = '.' + rule_entry;
            if (vhost === rule_entry || vhost.indexOf(rule_dot, vhost.length - rule_dot.length) !== -1) {
                return 'DIRECT';
            }
        }
    }
    return PROXY;
}
2594 次点击
所在节点    JavaScript
16 条回复
jugelizi
2015-07-25 00:06:20 +08:00
先小写啊,然后两次循环那个二维数组,如果域名和数组里的值相等或者能匹配到就直接连啊
cattyhouse
2015-07-25 00:24:49 +08:00
@jugelizi 那个rules 可以写成这样吗?

``` javascript

var rules = [
'cn',
'lan',
'local',
'xn--fiqs8s'
'sinaapp.com',
'qunar.com',
'yihaodian.com',
'baixing.com',
'xiami.com',
'mydrivers.com',
'alisoft.com',
'51jobcdn.com'
'zhi.hu',
];

```
cattyhouse
2015-07-25 00:26:35 +08:00
@jugelizi 回复不能用mardown?

var rules = [
'cn',
'lan',
'local',
'xn--fiqs8s'
'sinaapp.com',
'qunar.com',
'yihaodian.com',
'baixing.com',
'xiami.com',
'mydrivers.com',
'alisoft.com',
'51jobcdn.com'
'zhi.hu',
];
cattyhouse
2015-07-25 00:30:34 +08:00
@jugelizi 为什么要两次循环呢?什么叫做二维数组?
luoway
2015-07-25 00:34:54 +08:00
@cattyhouse 可以,不过相应的循环要改
luoway
2015-07-25 00:35:35 +08:00
@cattyhouse 这是算法问题,建议从C语言学起…
cattyhouse
2015-07-25 00:40:50 +08:00
@luoway 我不懂任何语言。。。哦,不对,懂一点shell。 您觉得这个pac有没有可以改进的地方以提高性能?
chhx
2015-07-25 00:57:25 +08:00
@cattyhouse 参考 https://github.com/clowwindy/gfwlist2pac 例子有两种写法。fast 应该和你需要的类似
cattyhouse
2015-07-25 01:03:55 +08:00
@chhx gfwlist2pac 是黑名单模式,不知道怎么改成白名单。
linhua
2015-07-25 01:07:16 +08:00
bramblex
2015-07-25 09:48:07 +08:00
//================= Config Start ======================

// proxy config
var rules = [];
var direct = 'DIRECT';
var defalut = direct;

// SSLEdge Proxy
rules.push({
proxy: 'PROXY 127.0.0.1:8119',
list: [
//google
'google.com',
'google.co.jp',
'gmail.com',
'gstatic.com',
'googleusercontent.com',
'googleapis.com',
'goo.gl',
'googlecode.com',

//youtube
'youtube.com',
'ytimg.com',
'ggpht.com',

//facebook
'facebook.com',
'facebook.net',
'akamaihd.net',

//wikipedia.org
'wikipedia.org',

// porn
'redtube.com',

// onedrive
'live.com',
'dropbox.com',
'sourceforge.net',

// github
'github.com',

// disqus
'disqus.com',

// wordpress
'w.org',

'twitter.com',
'twimg.com',
]
});

//================= Config End ======================

// cache white list into a hash
var _rules = {};
rules.forEach(function(rule){
var list = rule.list;
var length = list.length;
var proxy = rule.proxy;
for (var i = 0; i < length; i++){
_rules[list[i]] = proxy;
}
});

// get the root domain from a url
var reg = /https?:\/\/[^\/]*?(\w+\.\w+)\/.*/i;
var getRootDomain = function getRootDomain(url){
return url.match(reg)[1];
};

// interface for PAC
var FindProxyForURL = function FindProxyForURL(url, host) {
return _rules[getRootDomain(url)] || defalut;
};


我手写的
bramblex
2015-07-25 09:51:19 +08:00
浏览器打开了以后pac只跑一遍的。所以第一次跑的效率无所谓,FindProxyForURL接口的效率才比较重要。
cattyhouse
2015-07-25 10:40:40 +08:00
@bramblex 你这个也是黑名单吧。。。我想做白名单,因为现在被x的网站每天都在增长。
bramblex
2015-07-25 10:51:10 +08:00
@cattyhouse

很简单啊,rules那里不是有配置代理的吗?

直接把 dafault 换成地理地址,把rules那里的代理换成direct就成白名单了呀
bramblex
2015-07-25 10:54:27 +08:00
@cattyhouse

// proxy config
var rules = [];
var direct = 'DIRECT';

// => 这里把defalut改成代理
var defalut = 'PROXY 127.0.0.1:8119';

// SSLEdge Proxy
rules.push({

// => 这里把配置改成direct
proxy: direct,

list: [
//google
'google.com',
.......
orzfly
2015-07-25 11:18:07 +08:00
@linhua (我觉得)这个不应叫格式,应该叫接口约定吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/208174

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX