1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 import urlparse
19 import urllib
20
21 from twisted.web import http
22
23 DEFAULT_PORTS = {'http': 80,
24 'https': 443}
25
26 DEFAULT_SCHEME = 'http'
30 result = []
31 for name, values in query.items():
32 qname = urllib.quote(name)
33 for value in values:
34 result.append(qname + "=" + urllib.quote(value))
35 return "&".join(result)
36
40
41
42 -class Url(object):
43 """
44 Represents an HTTP URL.
45 Can parse and can be serialized to string.
46 """
47
48 @classmethod
100
101 - def __init__(self, scheme=None, hostname=None, path="/",
102 params="", query={}, fragment="",
103 username=None, password=None, port=None):
104
105 self.path = path
106 self.params = params
107 self.query = query
108 self.fragment = fragment
109
110 if hostname:
111
112 if username:
113 if password:
114 netloc = username + ':' + password + '@' + hostname
115 else:
116 netloc = username + '@' + hostname
117 else:
118 netloc = hostname
119
120 if not scheme:
121 scheme = DEFAULT_SCHEME
122
123 host = hostname
124
125 defport = DEFAULT_PORTS.get(scheme, None)
126
127 if port:
128 if port != defport:
129 netloc = netloc + ':' + str(port)
130 host = host + ':' + str(port)
131 else:
132 port = defport
133
134 self.scheme = scheme
135 self.netloc = netloc
136 self.host = host
137 self.hostname = hostname
138 self.username = username
139 self.password = password
140 self.port = port
141
142 else:
143
144 self.scheme = ""
145 self.netloc = ""
146 self.host = ""
147 self.hostname = ""
148 self.username = None
149 self.password = None
150 self.port = None
151
152 query_string = unparse_qs(self.query)
153 quoted_path = urllib.quote(self.path)
154
155 self.location = urlparse.urlunparse(('', '', quoted_path, self.params,
156 query_string, self.fragment))
157
158 self.url = urlparse.urlunparse((self.scheme, self.netloc, quoted_path,
159 self.params, query_string,
160 self.fragment))
161
164
167
168 if __name__ == "__main__":
169 import sys
170
171 url = Url.fromString(sys.argv[1])
172 for a, v in url.__dict__.items():
173 print a, ":", v
174