From: Fredrik Tolf Date: Sun, 8 Nov 2015 02:53:18 +0000 (+0100) Subject: Merge branch 'master' of ansgar.seatribe.se:/usr/local/src/wrw X-Git-Url: http://dolda2000.com/gitweb/?p=wrw.git;a=commitdiff_plain;h=e1e1218fd66230e4ac8c7fca36a4c9a7b2496cf5;hp=dff9b8aa90e1f93807ab301675de3be1bf1f0ad8 Merge branch 'master' of ansgar.seatribe.se:/usr/local/src/wrw --- diff --git a/wrw/form.py b/wrw/form.py index 53fc82d..7905dc6 100644 --- a/wrw/form.py +++ b/wrw/form.py @@ -7,9 +7,12 @@ def formparse(req): buf = {} buf.update(urllib.parse.parse_qsl(req.query)) if req.ihead.get("Content-Type") == "application/x-www-form-urlencoded": - rbody = req.input.read(2 ** 20) + try: + rbody = req.input.read(2 ** 20) + except IOError as exc: + return exc if len(rbody) >= 2 ** 20: - raise ValueError("x-www-form-urlencoded data is absurdly long") + return ValueError("x-www-form-urlencoded data is absurdly long") buf.update(urllib.parse.parse_qsl(rbody.decode("latin1"))) return buf @@ -50,7 +53,7 @@ class formpart(object): break while len(self.form.buf) <= len(lboundary): ret = req.input.read(8192) - if ret == "": + if ret == b"": raise badmultipart("Missing last multipart boundary") self.form.buf += ret @@ -61,7 +64,7 @@ class formpart(object): self.buf = self.buf[limit:] else: ret = self.buf - self.buf = "" + self.buf = b"" return ret def readline(self, limit=-1): @@ -71,7 +74,7 @@ class formpart(object): if p < 0: if self.eof: ret = self.buf - self.buf = "" + self.buf = b"" return ret last = len(self.buf) self.fillbuf(last + 128) @@ -81,7 +84,9 @@ class formpart(object): return ret def close(self): - self.fillbuf(-1) + while True: + if self.read(8192) == b"": + break def __enter__(self): return self @@ -159,5 +164,10 @@ class multipart(object): self.lastpart.parsehead(self.headcs) return self.lastpart -def formdata(req): - return req.item(formparse) +def formdata(req, onerror=Exception): + data = req.item(formparse) + if isinstance(data, Exception): + if onerror is Exception: + raise data + return onerror + return data diff --git a/wrw/util.py b/wrw/util.py index 460344f..a1dcc6c 100644 --- a/wrw/util.py +++ b/wrw/util.py @@ -10,7 +10,10 @@ def wsgiwrap(callable): def formparams(callable): spec = inspect.getargspec(callable) def wrapper(req): - data = form.formdata(req) + try: + data = form.formdata(req) + except IOError: + raise resp.httperror(400, "Invalid request", "Form data was incomplete") args = dict(data.items()) args["req"] = req if not spec.keywords: