V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
cattyhouse
V2EX  ›  JavaScript

javascript PAC 代码分析理解

  •  
  •   cattyhouse · 2015-07-24 23:49:14 +08:00 · 2561 次点击
    这是一个创建于 3401 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以下是一个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;
    }
    
    第 1 条附言  ·  2015-07-26 01:19:54 +08:00
    不纠结了, 把gfwlist2pac搞成白名单了,https://www.v2ex.com/t/208369#reply0
    16 条回复    2015-07-25 11:18:07 +08:00
    jugelizi
        1
    jugelizi  
       2015-07-25 00:06:20 +08:00
    先小写啊,然后两次循环那个二维数组,如果域名和数组里的值相等或者能匹配到就直接连啊
    cattyhouse
        2
    cattyhouse  
    OP
       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
        3
    cattyhouse  
    OP
       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
        4
    cattyhouse  
    OP
       2015-07-25 00:30:34 +08:00
    @jugelizi 为什么要两次循环呢?什么叫做二维数组?
    luoway
        5
    luoway  
       2015-07-25 00:34:54 +08:00 via Android
    @cattyhouse 可以,不过相应的循环要改
    luoway
        6
    luoway  
       2015-07-25 00:35:35 +08:00 via Android
    @cattyhouse 这是算法问题,建议从C语言学起…
    cattyhouse
        7
    cattyhouse  
    OP
       2015-07-25 00:40:50 +08:00
    @luoway 我不懂任何语言。。。哦,不对,懂一点shell。 您觉得这个pac有没有可以改进的地方以提高性能?
    chhx
        8
    chhx  
       2015-07-25 00:57:25 +08:00
    @cattyhouse 参考 https://github.com/clowwindy/gfwlist2pac 例子有两种写法。fast 应该和你需要的类似
    cattyhouse
        9
    cattyhouse  
    OP
       2015-07-25 01:03:55 +08:00 via iPhone
    @chhx gfwlist2pac 是黑名单模式,不知道怎么改成白名单。
    linhua
        10
    linhua  
       2015-07-25 01:07:16 +08:00   ❤️ 1
    bramblex
        11
    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
        12
    bramblex  
       2015-07-25 09:51:19 +08:00
    浏览器打开了以后pac只跑一遍的。所以第一次跑的效率无所谓,FindProxyForURL接口的效率才比较重要。
    cattyhouse
        13
    cattyhouse  
    OP
       2015-07-25 10:40:40 +08:00
    @bramblex 你这个也是黑名单吧。。。我想做白名单,因为现在被x的网站每天都在增长。
    bramblex
        14
    bramblex  
       2015-07-25 10:51:10 +08:00
    @cattyhouse

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

    直接把 dafault 换成地理地址,把rules那里的代理换成direct就成白名单了呀
    bramblex
        15
    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
        16
    orzfly  
       2015-07-25 11:18:07 +08:00
    @linhua (我觉得)这个不应叫格式,应该叫接口约定吧。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5974 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 02:29 · PVG 10:29 · LAX 18:29 · JFK 21:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.