33 lines
1.1 KiB
Python
33 lines
1.1 KiB
Python
from ucollections import namedtuple
|
|
|
|
URI = namedtuple('URI', ('cheme', 'netloc', 'path', 'params', 'query', 'fragment'))
|
|
|
|
def quote(string, safe='_.-~+'):
|
|
""" A simple implementation of URL quoting"""
|
|
string = string.replace(' ', '+')
|
|
result = ""
|
|
for char in string:
|
|
if ('a' <= char <= 'z') or ('A' <= char <= 'Z') or ('0' <= char<= '9') or (char in safe):
|
|
result += char
|
|
else:
|
|
result += "%{:02X}".format(ord(char))
|
|
return result
|
|
|
|
def urlencode(query, safe='_.-~+'):
|
|
"""A simple urlencode function"""
|
|
return '&'.join('{}={}'.format(quote(k, safe), quote(v, safe)) for k, v in query.items())
|
|
|
|
def urlparse(url):
|
|
"""A simple urlparse (cheme, netloc, path, params, query, fragment)"""
|
|
parts = [''] * 6
|
|
for i, sep in enumerate(['://', '#', '?', ';']):
|
|
if sep in url:
|
|
left, right = url.split(sep, 1)
|
|
parts[i], url = left, right
|
|
if '/' in url:
|
|
parts[1], parts[2] = url.split('/', 1)
|
|
parts[2] = '/' + parts[2]
|
|
else:
|
|
parts[1] = url
|
|
return URI(*parts)
|