Project

General

Profile

« Previous | Next » 

Revision 5c583de8

Added by koszko almost 2 years ago

start implementing more efficient querying of URL patterns

View differences:

common/patterns.js
17 17
const proto_regex = /^(\w+):\/\/(.*)$/;
18 18

  
19 19
const user_re = "[^/?#@]+@"
20
const domain_re = "[.a-zA-Z0-9-]+";
20
const domain_re = "[.*a-zA-Z0-9-]+";
21 21
const path_re = "[^?#]*";
22 22
const query_re = "\\??[^#]*";
23 23

  
24 24
const http_regex = new RegExp(`^(${domain_re})(${path_re})(${query_re}).*`);
25 25

  
26
const file_regex = new RegExp(`^(${path_re}).*`);
26
const file_regex = new RegExp(`^(/${path_re}).*`);
27 27

  
28 28
const ftp_regex = new RegExp(`^(${user_re})?(${domain_re})(${path_re}).*`);
29 29

  
30
function match_or_throw(regex, string, error_msg)
31
{
32
    const match = regex.exec(string);
33
    if (match === null)
34
	throw error_msg;
35

  
36
    return match;
37
}
38

  
30 39
function deconstruct_url(url, use_limits=true)
31 40
{
32 41
    const max = MAX;
......
35 44
	    max[key] = Infinity;
36 45
    }
37 46

  
38
    const proto_match = proto_regex.exec(url);
39
    if (proto_match === null)
40
	throw `bad url '${url}'`;
47
    const matcher = (re, str) => match_or_throw(re, str, `bad url '${url}'`)
41 48

  
49
    const proto_match = matcher(proto_regex, url);
42 50
    const deco = {proto: proto_match[1]};
43 51

  
44 52
    if (deco.proto === "file") {
45
	deco.path = file_regex.exec(proto_match[2])[1];
53
	deco.path = matcher(file_regex, proto_match[2])[1];
46 54
    } else if (deco.proto === "ftp") {
47
	[deco.domain, deco.path] = ftp_regex.exec(proto_match[2]).slice(2, 4);
55
	[deco.domain, deco.path] =
56
	    matcher(ftp_regex, proto_match[2]).slice(2, 4);
48 57
    } else if (deco.proto === "http" || deco.proto === "https") {
49
	const http_match = http_regex.exec(proto_match[2]);
50
	if (!http_match)
51
	    return undefined;
52
	[deco.domain, deco.path, deco.query] = http_match.slice(1, 4);
58
	[deco.domain, deco.path, deco.query] =
59
	    matcher(http_regex, proto_match[2]).slice(1, 4);
53 60
	deco.domain = deco.domain.toLowerCase();
54 61
    } else {
55 62
	throw `unsupported protocol in url '${url}'`;

Also available in: Unified diff