From: Fredrik Tolf Date: Sun, 19 Mar 2017 17:15:32 +0000 (+0100) Subject: Merge branch 'master' of git://git.dolda.net/wrw X-Git-Url: http://git.dolda2000.com/gitweb/?a=commitdiff_plain;h=328e9684d09e1f415622ba3d7bc7fc446f54e1a1;hp=-c;p=wrw.git Merge branch 'master' of git://git.dolda.net/wrw --- 328e9684d09e1f415622ba3d7bc7fc446f54e1a1 diff --combined wrw/proto.py index 482a23e,ad1775a..0e3c798 --- a/wrw/proto.py +++ b/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)