Skip to content

Instantly share code, notes, and snippets.

@tiejunhu
Forked from janlay/whitelist.pac
Last active November 29, 2015 15:56
Show Gist options
  • Save tiejunhu/3614ff01adc65787b888 to your computer and use it in GitHub Desktop.
Save tiejunhu/3614ff01adc65787b888 to your computer and use it in GitHub Desktop.
A white-list based PAC.
/*
* A white-list based PAC without regexp, by @janlay
* It's just simple and fast.
* Last update: Oct 20, 2015
* Special thanks to @Paveo
*/
function FindProxyForURL(url, host) {
// REPLACE PROXY WITH YOUR OWN'S
var PROXY = "SOCKS 127.0.0.1:1080;SOCKS5 127.0.0.1:1080;PROXY 127.0.0.1:8888";
var BLACKHOLE = "127.0.0.2";
var DEFAULT = "DIRECT";
var parts = host.split('.'),
firstPart = parts[0],
// always use proxy, even if inHosts or domains are matched
overrideDomains = ['google.com', 'twitter.com', 'twimg.com', 'amazonaws.com', 'facebook.com', 'youtube.com'],
// domain/host starts with
prefixes = ['cn', 'china'],
// indexOf searching
inHosts = ['51', '58', '86', '91', '99', '100', '123', '126', '163', '168', '360', 'cn', 'bj', 'zj', 'ali', 'mayi', 'taobao', 'qq', 'tencent', 'baidu', 'china', 'local'],
// privacy trackers
blockedHosts = ['mmstat.com', 'googlesyndication.com', '127.net'],
// domains end with
domains = ['cn', 'img.com', '39.net', 'apple.com', 'baixing.com', 'go2map.com', 'blueidea.com', 'caing.com', 'ccb.com', 'comsenz.com', 'csdn.net', 'ctrip.com', 'dangdang.com', 'dianping.com', 'dingtalk.com', 'discuz.net', 'donews.com', 'douban.com', 'dream4ever.org', 'eastmoney.com', 'et8.org', 'et8.net', 'ecitic.com', 'fastspring.com', 'fengniao.com', 'futu5.com', 'ganji.com', 'gfan.com', 'gfw.io', 'gougou.com', 'hi-pda.com', 'huaban.com', 'huanqiu.com', 'hudong.com', 'iciba.com', 'ihg.com', 'img-space.com', 'infzm.com', 'ip138.com', 'jandan.net', 'jd.com', 'jiepang.com', 'ku6.com', 'lampdrive.com', 'live.net', 'etao.com', 'mapabc.com', 'mapbar.com', 'meituan.com', 'mi.com', 'miwifi.com', 'microsoft.com', 'onenote.com', 'macpaw.com', 'mozilla.org', 'mop.com', 'mtime.com', 'mydrivers.com', 'netease.com', 'nuomi.com', 'onlinedown.net', 'paipai.com', 'qiyi.com', 'qunar.com', 'renren.com', 'sanguosha.com', 'sdo.com', 'sf-express.com', 'iask.com', 'sogou.com', 'sohu.com', 'soso.com', 'soufun.com', 'stackoverflow.com', 'superuser.com', 'tenpay.com', 'tgbus.com', 'tmall.com', 'tudou.com', 'tudouui.com', 'uusee.com', 'verycd.com', 'weibo.com', 'weiphone.com', 'xiami.com', 'xiami.net', 'xinhuanet.com', 'xinnet.com', 'xunlei.com', 'yesky.com', 'yihaodian.com', 'ynet.com', 'youdao.com', 'youku.com', 'yupoo.com', 'zaobao.com', 'zhaopin.com', 'zhihu.com', 'my.cl.ly', 'synacast.com', 'xiachufang.com', 'wandoujia.com', 'chdbits.org', 'hdwing.com', 'zhihu.com', 'zhi.hu', 'join.me', 'imgur.com', 'images-amazon.com', 'smzdm.com', 'ycombinator.com', 'v2ex.com', 'verisign.com', 'laiwang.com', 'hiwifi.com', 'tanx.com'];
// ignore local host name. eg: http://localhost
if (isPlainHostName(host)) return DEFAULT;
// force proxy by url. eg: http://foo.com/?bar=1&fuckgfw
if (url.indexOf('fuckgfw') > 0) return PROXY;
// bypass plain IP
var lastChar = host.substring(host.length - 1);
if (lastChar >= '0' && lastChar <= '9')
return DEFAULT;
var i, len;
// block privacy trackers
for (i = 0, len = blockedHosts.length; i < len; i++)
if (host.substr(-blockedHosts[i].length) === blockedHosts[i]) return BLACKHOLE;
// force proxy by domain. eg: http://cn.nytimes.com
for (i = 0, len = overrideDomains.length; i < len; i++)
if (host.substr(-overrideDomains[i].length) === overrideDomains[i]) return PROXY;
// domain/ip prefix. eg: http://60.1.2.3
for (i = 0, len = prefixes.length; i < len; i++)
if (prefixes[i] === firstPart) return DEFAULT;
// match main domain. eg: http://www.verycd.com, http://ip138.com/
for (i = 0, len = domains.length; i < len; i++)
if (host.substr(-domains[i].length) === domains[i]) return DEFAULT;
// search pattern in domains. eg: https://www.51job.com, https://www.alipay.com
for (i = 0, len = inHosts.length; i < len; i++)
if (host.indexOf(inHosts[i]) >= 0) return DEFAULT;
// for all other host, default to proxy.
return PROXY;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment