Merge branch 'master' into python2
[wrw.git] / wrw / proto.py
index 3dcf0d7..a67fa19 100644 (file)
@@ -1,4 +1,4 @@
-import time, calendar
+import time, calendar, collections, binascii, base64
 
 statusinfo = {
     400: ("Bad Request", "Invalid HTTP request."),
@@ -105,7 +105,7 @@ def urlq(url):
     if isinstance(url, unicode):
         url = url.encode("utf-8")
     ret = ""
-    invalid = "&=#?/\"'"
+    invalid = ";&=#?/\"'"
     for c in url:
         if c in invalid or (ord(c) <= 32) or (ord(c) >= 128):
             ret += "%%%02X" % ord(c)
@@ -194,3 +194,22 @@ def parurl(url, pars={}, **augment):
         return url + "?" + qs
     else:
         return url
+
+# Wrap these, since binascii is a bit funky. :P
+def enhex(bs):
+    return base64.b16encode(bs)
+def unhex(es):
+    return base64.b16decode(es)
+def enb32(bs):
+    return base64.b32encode(bs)
+def unb32(es):
+    if (len(es) % 8) != 0:
+        es += b"=" * (8 - (len(es) % 8))
+    es = es.upper()             # The whole point of Base32 is that it's case-insensitive :P
+    return base64.b32decode(es)
+def enb64(bs):
+    return base64.b64encode(bs)
+def unb64(es):
+    if (len(es) % 4) != 0:
+        es += b"=" * (4 - (len(es) % 4))
+    return base64.b64decode(es)