1function join_url(url,	s, query_keys, i) {
2	s = url["scheme"] "://"
3	if (url["user"]) {
4		s = s url["user"]
5		if (url["password"]) {
6			s = s ":" url["password"]
7		}
8		s = s "@"
9	}
10	s = s url["host"]
11	if (url["port"]) {
12		s = s ":" url["port"]
13	}
14	if (url["path"]) {
15		s = s url["path"]
16	}
17	if (url["query"]) {
18		split(url["query"], query_keys)
19		s = s "?"
20		for (i = 1; i <= length(query_keys); i++) {
21			s = s query_keys[i] "=" url["query", query_keys[i]]
22			if (i != length(query_keys)) {
23				s = s ";"
24			}
25		}
26	}
27	if (url["fragment"]) {
28		s = s "#" url["fragment"]
29	}
30	return s
31}
32
33function split_url(url, s,	url_scheme, url_fragment, url_query, url_query_parts, i, url_query_part, url_authority, url_auth, url_user, url_host) {
34	delete url
35	# scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
36	split(s, url_scheme, "://")
37	url["scheme"] = url_scheme[1]
38
39	split(url_scheme[2], url_fragment, "#")
40	url["fragment"] = url_fragment[2]
41
42	split(url_fragment[1], url_query, "?")
43
44	split(url_query[2], url_query_parts, "&")
45	# url["query"] list of query keys (space separated)
46	# url["query", key] value
47	for (i = 1; i <= length(url_query_parts); i++) {
48		split(url_query_parts[i], url_query_part, "=")
49		url["query"] = url["query"] " " url_query_part[1]
50		url["query", url_query_part[1]] = url_query_part[2]
51	}
52
53	split(url_query[1], url_authority, "/")
54	url["path"] = substr(url_query[1], length(url_authority[1]) + 1)
55
56	split(url_authority[1], url_auth, "@")
57
58	if (length(url_auth) == 2) {
59		split(url_auth[1], url_user, ":")
60		url["user"] = url_user[1]
61		url["password"] = url_user[2]
62		split(url_auth[2], url_host, ":")
63	} else {
64		url["user"] = ""
65		url["password"] = ""
66		split(url_auth[1], url_host, ":")
67	}
68	url["host"] = url_host[1]
69	url["port"] = url_host[2]
70}
71