X-Git-Url: http://dolda2000.com/gitweb/?p=wrw.git;a=blobdiff_plain;f=wrw%2Fform.py;h=76abab674bc0123deb3809fc1f3b332dba3ac89c;hp=7905dc65bb64be956d6a60b140864cbbf4faf365;hb=b6f62b898efdc272130d3dbdd6742c5b785e7c7d;hpb=e1e1218fd66230e4ac8c7fca36a4c9a7b2496cf5 diff --git a/wrw/form.py b/wrw/form.py index 7905dc6..76abab6 100644 --- a/wrw/form.py +++ b/wrw/form.py @@ -1,11 +1,11 @@ -import urllib.parse -from . import proto +import urlparse +import proto __all__ = ["formdata"] def formparse(req): buf = {} - buf.update(urllib.parse.parse_qsl(req.query)) + buf.update(urlparse.parse_qsl(req.query)) if req.ihead.get("Content-Type") == "application/x-www-form-urlencoded": try: rbody = req.input.read(2 ** 20) @@ -13,7 +13,7 @@ def formparse(req): return exc if len(rbody) >= 2 ** 20: return ValueError("x-www-form-urlencoded data is absurdly long") - buf.update(urllib.parse.parse_qsl(rbody.decode("latin1"))) + buf.update(urlparse.parse_qsl(rbody)) return buf class badmultipart(Exception): @@ -22,7 +22,7 @@ class badmultipart(Exception): class formpart(object): def __init__(self, form): self.form = form - self.buf = b"" + self.buf = "" self.eof = False self.head = {} @@ -31,8 +31,8 @@ class formpart(object): def fillbuf(self, sz): req = self.form.req - mboundary = b"\r\n--" + self.form.boundary + b"\r\n" - lboundary = b"\r\n--" + self.form.boundary + b"--\r\n" + mboundary = "\r\n--" + self.form.boundary + "\r\n" + lboundary = "\r\n--" + self.form.boundary + "--\r\n" while not self.eof: p = self.form.buf.find(mboundary) if p >= 0: @@ -53,7 +53,7 @@ class formpart(object): break while len(self.form.buf) <= len(lboundary): ret = req.input.read(8192) - if ret == b"": + if ret == "": raise badmultipart("Missing last multipart boundary") self.form.buf += ret @@ -64,17 +64,17 @@ class formpart(object): self.buf = self.buf[limit:] else: ret = self.buf - self.buf = b"" + self.buf = "" return ret def readline(self, limit=-1): last = 0 while True: - p = self.buf.find(b'\n', last) + p = self.buf.find('\n', last) if p < 0: if self.eof: ret = self.buf - self.buf = b"" + self.buf = "" return ret last = len(self.buf) self.fillbuf(last + 128) @@ -85,7 +85,7 @@ class formpart(object): def close(self): while True: - if self.read(8192) == b"": + if self.read(8192) == "": break def __enter__(self): @@ -95,15 +95,12 @@ class formpart(object): self.close() return False - def parsehead(self, charset): + def parsehead(self): def headline(): ln = self.readline(256) - if ln[-1] != ord(b'\n'): + if ln[-1] != '\n': raise badmultipart("Too long header line in part") - try: - return ln.decode(charset).rstrip() - except UnicodeError: - raise badmultipart("Form part header is not in assumed charset") + return ln.rstrip() ln = headline() while True: @@ -135,33 +132,29 @@ class formpart(object): raise badmultipart("Form part uses unexpected transfer encoding: %r" % encoding) class multipart(object): - def __init__(self, req, charset): + def __init__(self, req): val, par = proto.pmimehead(req.ihead.get("Content-Type", "")) if req.method != "POST" or val != "multipart/form-data": raise badmultipart("Request is not a multipart form") if "boundary" not in par: raise badmultipart("Multipart form lacks boundary") - try: - self.boundary = par["boundary"].encode("us-ascii") - except UnicodeError: - raise badmultipart("Multipart boundary must be ASCII string") + self.boundary = par["boundary"] self.req = req - self.buf = b"\r\n" + self.buf = "\r\n" self.eof = False - self.headcs = charset self.lastpart = formpart(self) self.lastpart.close() def __iter__(self): return self - def __next__(self): + def next(self): if not self.lastpart.eof: raise RuntimeError("All form parts must be read entirely") if self.eof: raise StopIteration() self.lastpart = formpart(self) - self.lastpart.parsehead(self.headcs) + self.lastpart.parsehead() return self.lastpart def formdata(req, onerror=Exception):