From: Fredrik Tolf Date: Thu, 30 Aug 2012 08:20:25 +0000 (+0200) Subject: Merge branch 'master' into python3 X-Git-Url: http://dolda2000.com/gitweb/?a=commitdiff_plain;h=f54a3465e5aaf03fe394d2702be6889cb06f37c6;hp=-c;p=wrw.git Merge branch 'master' into python3 --- f54a3465e5aaf03fe394d2702be6889cb06f37c6 diff --combined wrw/req.py index f703e0f,4b9dd71..469c5b8 --- a/wrw/req.py +++ b/wrw/req.py @@@ -1,3 -1,5 +1,5 @@@ + import io + __all__ = ["request"] class headdict(object): @@@ -17,7 -19,7 +19,7 @@@ 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: @@@ -49,6 -51,71 +51,71 @@@ def fixcase(str) 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 == "": ++ if ret == b"": + raise IOError("Unexpected EOF") + self.buf.extend(ret) + self.rb += len(ret) - ret = str(self.buf[:ra]) ++ 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('\n', off) ++ p = self.buf.find(b'\n', off) + if p >= 0: - ret = str(self.buf[:p + 1]) ++ 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 = str(self.buf[:size]) ++ ret = bytes(self.buf[:size]) + self.buf = self.buf[size:] + return ret + if self.rb == self.limit: - ret = str(self.buf) ++ 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 == "": ++ 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): ++ def __next__(self): + ret = rd.readline() - if ret == "": ++ if ret == b"": + raise StopIteration() + return ret + return lineiter() + class request(object): def copy(self): return copyrequest(self) @@@ -73,10 -140,15 +140,15 @@@ class origrequest(request) 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: - self.ihead["Content-Length"] = env["CONTENT_LENGTH"] + 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("") ++ self.input = io.BytesIO(b"") self.ohead = headdict() for k, v in env.items(): if k[:5] == "HTTP_":