-
-
Notifications
You must be signed in to change notification settings - Fork 141
/
blockDomains.js
83 lines (68 loc) · 2.24 KB
/
blockDomains.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/**
* Aborts requests to external resources or given domains
*
* Does not emit any metrics
*/
exports.version = '0.1';
exports.module = function(phantomas) {
var ourDomain = false,
// --no-externals
noExternalsMode = (phantomas.getParam('no-externals') === true),
// --allow-domain .fastly.net,.googleapis.com
allowedDomains = phantomas.getParam('allow-domain'),
allowedDomainsRegExp,
// --block-domain google-analytics.com
blockedDomains = phantomas.getParam('block-domain'),
blockedDomainsRegExp;
function checkBlock(domain) {
var blocked = false;
// --no-externals
if (noExternalsMode && ourDomain !== false && domain !== ourDomain) {
blocked = true;
}
// match blacklist (--block-domain)
if (blockedDomainsRegExp && blockedDomainsRegExp.test(domain)) {
blocked = true;
}
// match whitelist (--allow-domain)
if (allowedDomainsRegExp && allowedDomainsRegExp.test(domain)) {
blocked = false;
}
return blocked;
}
// parse settings
function parseParameter(value) {
return value.
split(',').
map(function(item) {
return item.trim();
});
}
allowedDomains = (typeof allowedDomains === 'string') ? parseParameter(allowedDomains) : false;
blockedDomains = (typeof blockedDomains === 'string') ? parseParameter(blockedDomains) : false;
if (noExternalsMode) {
phantomas.log('Block domains: working in --no-externals mode');
}
if (allowedDomains !== false) {
phantomas.log('Block domains: whitelist - ' + allowedDomains.join(', '));
allowedDomainsRegExp = new RegExp('(' + allowedDomains.join('|') + ')$');
}
if (blockedDomains !== false) {
phantomas.log('Block domains: blacklist - ' + blockedDomains.join(', '));
blockedDomainsRegExp = new RegExp('(' + blockedDomains.join('|') + ')$');
}
// get the "main" domain from the first request not being a redirect (issue #197)
phantomas.on('responseEnd', function(entry, res) {
ourDomain = entry.domain;
phantomas.log('Block domains: assuming "%s" to be the main domain', ourDomain);
});
// check each request before sending
phantomas.on('beforeSend', function(entry) {
if (checkBlock(entry.domain)) {
entry.block();
// stats
phantomas.incrMetric('blockedRequests');
phantomas.addOffender('blockedRequests', entry.url);
}
});
};