+class closed(IOError):
+ def __init__(self):
+ super().__init__("The client has closed the connection.")
+
+cwd = os.getcwd()
+def absolutify(path):
+ if path[0] != '/':
+ return os.path.join(cwd, path)
+ return path
+
+def unquoteurl(url):
+ buf = bytearray()
+ i = 0
+ while i < len(url):
+ c = url[i]
+ i += 1
+ if c == ord(b'%'):
+ if len(url) >= i + 2:
+ c = 0
+ if ord(b'0') <= url[i] <= ord(b'9'):
+ c |= (url[i] - ord(b'0')) << 4
+ elif ord(b'a') <= url[i] <= ord(b'f'):
+ c |= (url[i] - ord(b'a') + 10) << 4
+ elif ord(b'A') <= url[i] <= ord(b'F'):
+ c |= (url[i] - ord(b'A') + 10) << 4
+ else:
+ raise ValueError("Illegal URL escape character")
+ if ord(b'0') <= url[i + 1] <= ord(b'9'):
+ c |= url[i + 1] - ord('0')
+ elif ord(b'a') <= url[i + 1] <= ord(b'f'):
+ c |= url[i + 1] - ord(b'a') + 10
+ elif ord(b'A') <= url[i + 1] <= ord(b'F'):
+ c |= url[i + 1] - ord(b'A') + 10
+ else:
+ raise ValueError("Illegal URL escape character")
+ buf.append(c)
+ i += 2
+ else:
+ raise ValueError("Incomplete URL escape character")
+ else:
+ buf.append(c)
+ return buf
+