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(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):
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
self.buf = self.buf[limit:]
else:
ret = self.buf
- self.buf = ""
+ self.buf = b""
return ret
def readline(self, limit=-1):
if p < 0:
if self.eof:
ret = self.buf
- self.buf = ""
+ self.buf = b""
return ret
last = len(self.buf)
self.fillbuf(last + 128)
return ret
def close(self):
- self.fillbuf(-1)
+ while True:
+ if self.read(8192) == b"":
+ break
def __enter__(self):
return self
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