X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=wrw%2Fform.py;h=f821ea1aad560bdc5471afec65da3c7e3cd37315;hb=cbb2bf5852924803bdb13779dc0e8e88000925d6;hp=7f4930dfd944b26bd4677eb17ecec725fe21cce2;hpb=1d2999321bd5fd204905b86936fb3dc13b07d574;p=wrw.git diff --git a/wrw/form.py b/wrw/form.py index 7f4930d..f821ea1 100644 --- a/wrw/form.py +++ b/wrw/form.py @@ -5,15 +5,18 @@ __all__ = ["formdata"] def formparse(req): buf = {} - buf.update(urllib.parse.parse_qsl(req.query)) + buf.update(urllib.parse.parse_qsl(req.query, keep_blank_values=True)) 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") - buf.update(urllib.parse.parse_qsl(rbody.decode("latin1"))) + return ValueError("x-www-form-urlencoded data is absurdly long") + buf.update(urllib.parse.parse_qsl(rbody.decode("latin1"), keep_blank_values=True)) return buf -class badmultipart(Exception): +class badmultipart(IOError): pass class formpart(object): @@ -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