-import cgi
+import urllib.parse
from . import proto
__all__ = ["formdata"]
-class formwrap(object):
- def __init__(self, req):
- if req.ihead.get("Content-Type") == "application/x-www-form-urlencoded":
- self.cf = cgi.parse(environ = req.env, fp = req.env["wsgi.input"])
- else:
- self.cf = cgi.parse(environ = req.env)
-
- def __getitem__(self, key):
- return self.cf[key][0]
-
- def get(self, key, default = ""):
- if key in self:
- return self.cf[key][0]
- return default
-
- def __contains__(self, key):
- return key in self.cf and len(self.cf[key]) > 0
-
- def __iter__(self):
- return iter(self.cf)
-
- def items(self):
- def iter():
- for key, list in self.cf.items():
- for val in list:
- yield key, val
- return list(iter())
-
- def keys(self):
- return list(self.cf.keys())
-
- def values(self):
- return [val for key, val in self.items()]
+def formparse(req):
+ buf = {}
+ buf.update(urllib.parse.parse_qsl(req.query))
+ if req.ihead.get("Content-Type") == "application/x-www-form-urlencoded":
+ if req.input.limit > 2 ** 20:
+ raise ValueError("x-www-form-urlencoded data is absurdly long")
+ rbody = req.input.read()
+ buf.update(urllib.parse.parse_qsl(rbody))
+ return buf
class badmultipart(Exception):
pass
if sz >= 0 and len(self.buf) >= sz:
break
while len(self.form.buf) <= len(lboundary):
- ret = req.env["wsgi.input"].read(8192)
+ ret = req.input.read(8192)
if ret == "":
raise badmultipart("Missing last multipart boundary")
self.form.buf += ret
- def read(self, limit = -1):
+ def read(self, limit=-1):
self.fillbuf(limit)
if limit >= 0:
ret = self.buf[:limit]
self.buf = ""
return ret
- def readline(self, limit = -1):
+ def readline(self, limit=-1):
last = 0
while True:
p = self.buf.find(b'\n', last)
return self
def __exit__(self, *excinfo):
+ self.close()
return False
def parsehead(self, charset):
return self.lastpart
def formdata(req):
- return req.item(formwrap)
+ return req.item(formparse)