Refactored sizing in body readers.

This commit is contained in:
Paul J. Davis 2010-06-07 20:45:37 -04:00
parent c55d367317
commit 37e909767a

View File

@ -19,27 +19,22 @@ class ChunkedReader(object):
self.parser = self.parse_chunked(unreader) self.parser = self.parse_chunked(unreader)
self.buf = StringIO() self.buf = StringIO()
def read(self, size=None): def read(self, size):
if not isinstance(size, (int, long)):
raise TypeError("size must be an integral type")
if size <= 0:
raise ValueError("Size must be positive.")
if size == 0: if size == 0:
return "" return ""
if size < 0:
size = None
if not self.parser: if self.parser:
return self.buf.getvalue() while self.buf.tell() < size:
try:
self.buf.write(self.parser.next())
except StopIteration:
self.parser = None
break
while size is None or self.buf.tell() < size:
try:
self.buf.write(self.parser.next())
except StopIteration:
self.parser = None
break
if size is None or self.buf.tell() < size:
ret = self.buf.getvalue()
self.buf.truncate(0)
return ret
data = self.buf.getvalue() data = self.buf.getvalue()
ret, rest = data[:size], data[size:] ret, rest = data[:size], data[size:]
self.buf.truncate(0) self.buf.truncate(0)
@ -115,14 +110,15 @@ class LengthReader(object):
self.unreader = unreader self.unreader = unreader
self.length = length self.length = length
def read(self, size=None): def read(self, size):
if size is not None and not isinstance(size, (int, long)): if not isinstance(size, (int, long)):
raise TypeError("size must be an integral type") raise TypeError("size must be an integral type")
if size < 0:
if size == 0 or self.length <= 0: raise ValueError("Size must be positive.")
if size == 0:
return "" return ""
if size < 0 or size is None: size = min(self.length, size)
size = self.length print "READING: %s of %d" % (size, self.length)
buf = StringIO() buf = StringIO()
data = self.unreader.read() data = self.unreader.read()
@ -144,26 +140,28 @@ class EOFReader(object):
self.buf = StringIO() self.buf = StringIO()
self.finished = False self.finished = False
def read(self, size=None): def read(self, size):
if size == 0 or self.finished: if not isinstance(size, (int, long)):
return "" raise TypeError("size must be an integral type")
if size < 0: if size < 0:
size = None raise ValueError("Size must be positive.")
if size == 0:
return ""
data = self.unreader.read() data = self.unreader.read()
while data: while data:
self.buf.write(data) self.buf.write(data)
if size is not None and self.buf.tell() > size: if self.buf.tell() > size:
data = self.buf.getvalue() break
ret, rest = data[:size], data[size:]
self.buf.truncate(0)
self.buf.write(rest)
return ret
data = self.unreader.read() data = self.unreader.read()
self.finished = True if not data:
ret = self.buf.getvalue() self.finished = True
data = self.buf.getvalue()
ret, rest = data[:size], data[size:]
self.buf.truncate(0) self.buf.truncate(0)
self.buf.write(rest)
return ret return ret
class Body(object): class Body(object):