backport from restkit. Fix readline in wsgi.input

This commit is contained in:
benoitc 2010-09-18 19:43:46 +02:00
parent 1366b2b288
commit d832391eee
2 changed files with 29 additions and 31 deletions

View File

@ -23,6 +23,6 @@ else:
minor_tag = "" minor_tag = ""
version_info = (0, 11, "1%s" % minor_tag) version_info = (0, 11, "2%s" % minor_tag)
__version__ = ".".join(map(str, version_info)) __version__ = ".".join(map(str, version_info))
SERVER_SOFTWARE = "gunicorn/%s" % __version__ SERVER_SOFTWARE = "gunicorn/%s" % __version__

View File

@ -149,9 +149,16 @@ class EOFReader(object):
raise TypeError("size must be an integral type") raise TypeError("size must be an integral type")
if size < 0: if size < 0:
raise ValueError("Size must be positive.") raise ValueError("Size must be positive.")
if size == 0 or self.finished: if size == 0:
return "" 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() data = self.unreader.read()
while data: while data:
self.buf.write(data) self.buf.write(data)
@ -161,7 +168,6 @@ class EOFReader(object):
if not data: if not data:
self.finished = True self.finished = True
return self.buf.getvalue()
data = self.buf.getvalue() data = self.buf.getvalue()
ret, rest = data[:size], data[size:] ret, rest = data[:size], data[size:]
@ -221,34 +227,26 @@ class Body(object):
if size == 0: if size == 0:
return "" return ""
idx = self.buf.getvalue().find("\n") line = self.buf.getvalue()
while idx < 0: idx = line.find("\n")
data = self.reader.read(1024) if idx >= 0:
if not len(data): ret = line[:idx+1]
break self.buf.truncate(0)
self.buf.write(data) self.buf.write(line[idx+1:])
idx = self.buf.getvalue().find("\n") return ret
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:]
self.buf.truncate(0) self.buf.truncate(0)
self.buf.write(rest) ch = ""
return ret 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): def readlines(self, size=None):
ret = [] ret = []
data = self.read() data = self.read()