forked from firewalla/firewalla
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgetLookupExpressions.js
67 lines (51 loc) · 1.67 KB
/
getLookupExpressions.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
var StringCursor = require('./StringCursor');
var HOSTNAME_IP_PATTERN = /\d+\.\d+\.\d+\.\d+/;
var HOSTNAME_SEPARATOR = '.';
var MAX_HOSTNAME_SEGMENTS = 5;
var PATH_SEPARATOR = '/';
var MAX_PATH_SEGMENTS = 4;
function getHostnameExpressions(hostname) {
if (HOSTNAME_IP_PATTERN.test(hostname)) {
return [hostname];
}
var baseExpression = hostname
.split(HOSTNAME_SEPARATOR)
.reverse()
.slice(0, MAX_HOSTNAME_SEGMENTS)
.reverse();
var numExpressions = Math.min(MAX_HOSTNAME_SEGMENTS, baseExpression.length) - 1;
var expressions = [hostname];
for (var i = 0; i < numExpressions; i++) {
expressions.push(baseExpression.slice(i).join('.'));
}
return expressions;
}
function getPathExpressions(pathname, search) {
var baseExpression = pathname
.split(PATH_SEPARATOR)
.slice(0, MAX_PATH_SEGMENTS);
var numExpressions = Math.min(MAX_PATH_SEGMENTS, baseExpression.length);
var expressions = [
pathname + search,
pathname
];
for (var i = 0; i < numExpressions; i++) {
expressions.push(baseExpression.slice(0, i).join('/'));
}
return expressions.sort();
}
function getLookupExpressions(canonicalized) {
var cursor = new StringCursor(canonicalized);
// Drop the scheme.
cursor.chompUntil(':');
cursor.skip(2);
var hostname = cursor.chompUntil('/');
var pathname = cursor.chompUntil('?');
var search = cursor.chompRemaining();
var hostnames = getHostnameExpressions(hostname);
var paths = getPathExpressions(pathname, search && '?' + search);
return hostnames.reduce(function(exprs, hostname) {
return exprs.concat(paths.map((path) => hostname + '/' + path));
}, []);
}
module.exports = getLookupExpressions;