From d832391eee02021ef6ba5b97cee436612815597b Mon Sep 17 00:00:00 2001 From: benoitc Date: Sat, 18 Sep 2010 19:43:46 +0200 Subject: [PATCH] backport from restkit. Fix readline in wsgi.input --- gunicorn/__init__.py | 2 +- gunicorn/http/body.py | 58 +++++++++++++++++++++---------------------- 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/gunicorn/__init__.py b/gunicorn/__init__.py index 6850288c..24084849 100644 --- a/gunicorn/__init__.py +++ b/gunicorn/__init__.py @@ -23,6 +23,6 @@ else: minor_tag = "" -version_info = (0, 11, "1%s" % minor_tag) +version_info = (0, 11, "2%s" % minor_tag) __version__ = ".".join(map(str, version_info)) SERVER_SOFTWARE = "gunicorn/%s" % __version__ diff --git a/gunicorn/http/body.py b/gunicorn/http/body.py index eea3d481..a8ba8721 100644 --- a/gunicorn/http/body.py +++ b/gunicorn/http/body.py @@ -149,9 +149,16 @@ class EOFReader(object): raise TypeError("size must be an integral type") if size < 0: raise ValueError("Size must be positive.") - if size == 0 or self.finished: + if size == 0: return "" - + + if self.finished: + data = self.buf.getvalue() + ret, rest = data[:size], data[size:] + self.buf.truncate(0) + self.buf.write(rest) + return ret + data = self.unreader.read() while data: self.buf.write(data) @@ -161,7 +168,6 @@ class EOFReader(object): if not data: self.finished = True - return self.buf.getvalue() data = self.buf.getvalue() ret, rest = data[:size], data[size:] @@ -221,34 +227,26 @@ class Body(object): if size == 0: return "" - idx = self.buf.getvalue().find("\n") - while idx < 0: - data = self.reader.read(1024) - if not len(data): - break - self.buf.write(data) - idx = self.buf.getvalue().find("\n") - if size < self.buf.tell(): - break - - # If we didn't find it, and we got here, we've - # exceeded size or run out of data. - if idx < 0: - rlen = min(size, self.buf.tell()) - else: - rlen = idx + 1 - - # If rlen is beyond our size threshold, trim back - if rlen > size: - rlen = size - - data = self.buf.getvalue() - ret, rest = data[:rlen], data[rlen:] - + line = self.buf.getvalue() + idx = line.find("\n") + if idx >= 0: + ret = line[:idx+1] + self.buf.truncate(0) + self.buf.write(line[idx+1:]) + return ret + self.buf.truncate(0) - self.buf.write(rest) - return ret - + ch = "" + buf = [line] + lsize = len(line) + while lsize < size and ch != "\n": + ch = self.reader.read(1) + if not len(ch): + break + lsize += 1 + buf.append(ch) + return "".join(buf) + def readlines(self, size=None): ret = [] data = self.read()