Merge branch 'master' of git://git.dolda.net/wrw
authorFredrik Tolf <fredrik@dolda2000.com>
Sun, 19 Mar 2017 17:15:32 +0000 (18:15 +0100)
committerFredrik Tolf <fredrik@dolda2000.com>
Sun, 19 Mar 2017 17:15:32 +0000 (18:15 +0100)
1  2 
wrw/proto.py

diff --combined wrw/proto.py
@@@ -1,4 -1,4 +1,4 @@@
- import time, calendar
+ import time, calendar, collections, binascii, base64
  
  statusinfo = {
      400: ("Bad Request", "Invalid HTTP request."),
@@@ -106,7 -106,7 +106,7 @@@ def urlq(url)
      if isinstance(url, str):
          url = url.encode("utf-8")
      ret = ""
 -    invalid = b";&=#?/\"'"
 +    invalid = b"%;&=#?/\"'"
      for c in url:
          if c in invalid or (c <= 32) or (c >= 128):
              ret += "%%%02X" % c
@@@ -195,3 -195,37 +195,37 @@@ 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).decode("us-ascii")
+ def unhex(es):
+     if not isinstance(es, collections.ByteString):
+         try:
+             es = es.encode("us-ascii")
+         except UnicodeError:
+             raise binascii.Error("non-ascii character in hex-string")
+     return base64.b16decode(es)
+ def enb32(bs):
+     return base64.b32encode(bs).decode("us-ascii")
+ def unb32(es):
+     if not isinstance(es, collections.ByteString):
+         try:
+             es = es.encode("us-ascii")
+         except UnicodeError:
+             raise binascii.Error("non-ascii character in base32-string")
+     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).decode("us-ascii")
+ def unb64(es):
+     if not isinstance(es, collections.ByteString):
+         try:
+             es = es.encode("us-ascii")
+         except UnicodeError:
+             raise binascii.Error("non-ascii character in base64-string")
+     if (len(es) % 4) != 0:
+         es += b"=" * (4 - (len(es) % 4))
+     return base64.b64decode(es)