+import io
+
__all__ = ["request"]
class headdict(object):
del self.dict[key.lower()]
def __iter__(self):
- return iter((list[0] for list in self.dict.itervalues()))
+ return iter((list[0] for list in self.dict.values()))
def get(self, key, default = ""):
if key.lower() in self.dict:
i += 1
return str
+class limitreader(object):
+ def __init__(self, back, limit):
+ self.bk = back
+ self.limit = limit
+ self.rb = 0
+ self.buf = bytearray()
+
+ def close(self):
+ pass
+
+ def read(self, size=-1):
+ ra = self.limit - self.rb
+ if size >= 0:
+ ra = min(ra, size)
+ while len(self.buf) < ra:
+ ret = self.bk.read(ra - len(self.buf))
+ if ret == b"":
+ raise IOError("Unexpected EOF")
+ self.buf.extend(ret)
+ self.rb += len(ret)
+ ret = bytes(self.buf[:ra])
+ self.buf = self.buf[ra:]
+ return ret
+
+ def readline(self, size=-1):
+ off = 0
+ while True:
+ p = self.buf.find(b'\n', off)
+ if p >= 0:
+ ret = bytes(self.buf[:p + 1])
+ self.buf = self.buf[p + 1:]
+ return ret
+ off = len(self.buf)
+ if size >= 0 and len(self.buf) >= size:
+ ret = bytes(self.buf[:size])
+ self.buf = self.buf[size:]
+ return ret
+ if self.rb == self.limit:
+ ret = bytes(self.buf)
+ self.buf = bytearray()
+ return ret
+ ra = self.limit - self.rb
+ if size >= 0:
+ ra = min(ra, size)
+ ra = min(ra, 1024)
+ ret = self.bk.read(ra)
+ if ret == b"":
+ raise IOError("Unpexpected EOF")
+ self.buf.extend(ret)
+ self.rb += len(ret)
+
+ def readlines(self, hint=None):
+ return list(self)
+
+ def __iter__(rd):
+ class lineiter(object):
+ def __iter__(self):
+ return self
+ def __next__(self):
+ ret = rd.readline()
+ if ret == b"":
+ raise StopIteration()
+ return ret
+ return lineiter()
+
class request(object):
+ def copy(self):
+ return copyrequest(self)
+
+ def shift(self, n):
+ new = self.copy()
+ new.uriname = self.uriname + self.pathinfo[:n]
+ new.pathinfo = self.pathinfo[n:]
+ return new
+
+class origrequest(request):
def __init__(self, env):
self.env = env
+ self.method = env["REQUEST_METHOD"].upper()
self.uriname = env["SCRIPT_NAME"]
self.filename = env.get("SCRIPT_FILENAME")
self.uri = env["REQUEST_URI"]
self.query = env["QUERY_STRING"]
self.remoteaddr = env["REMOTE_ADDR"]
self.serverport = env["SERVER_PORT"]
+ self.servername = env["SERVER_NAME"]
self.https = "HTTPS" in env
self.ihead = headdict()
+ self.input = None
+ if "CONTENT_TYPE" in env:
+ self.ihead["Content-Type"] = env["CONTENT_TYPE"]
+ if "CONTENT_LENGTH" in env:
+ clen = self.ihead["Content-Length"] = env["CONTENT_LENGTH"]
+ if clen.isdigit():
+ self.input = limitreader(env["wsgi.input"], int(clen))
+ if self.input is None:
+ self.input = io.BytesIO(b"")
self.ohead = headdict()
for k, v in env.items():
if k[:5] == "HTTP_":
for val in self.ohead.getlist(nm):
hdrs.append((nm, val))
startreq("%s %s" % self.statuscode, hdrs)
+
+ def topreq(self):
+ return self
+
+class copyrequest(request):
+ def __init__(self, p):
+ self.parent = p
+ self.top = p.topreq()
+ self.env = p.env
+ self.method = p.method
+ self.uriname = p.uriname
+ self.filename = p.filename
+ self.uri = p.uri
+ self.pathinfo = p.pathinfo
+ self.query = p.query
+ self.remoteaddr = p.remoteaddr
+ self.serverport = p.serverport
+ self.https = p.https
+ self.ihead = p.ihead
+ self.ohead = p.ohead
+
+ def status(self, code, msg):
+ return self.parent.status(code, msg)
+
+ def item(self, id):
+ return self.top.item(id)
+
+ def withres(self, res):
+ return self.top.withres(res)
+
+ def oncommit(self, fn):
+ return self.top.oncommit(fn)
+
+ def topreq(self):
+ return self.parent.topreq()