Fixes issue #6838: use a list to accumulate the value instead of repeatedly concatenating strings.

This commit is contained in:
Chris Withers 2009-09-04 16:12:32 +00:00
parent 7d4f8fda49
commit 68c6e92fd4
1 changed files with 9 additions and 12 deletions

View File

@ -554,10 +554,7 @@ class HTTPResponse:
def _read_chunked(self, amt):
assert self.chunked != _UNKNOWN
chunk_left = self.chunk_left
value = ''
# XXX This accumulates chunks by repeated string concatenation,
# which is not efficient as the number or size of chunks gets big.
value = []
while True:
if chunk_left is None:
line = self.fp.readline()
@ -570,22 +567,22 @@ class HTTPResponse:
# close the connection as protocol synchronisation is
# probably lost
self.close()
raise IncompleteRead(value)
raise IncompleteRead(''.join(value))
if chunk_left == 0:
break
if amt is None:
value += self._safe_read(chunk_left)
value.append(self._safe_read(chunk_left))
elif amt < chunk_left:
value += self._safe_read(amt)
value.append(self._safe_read(amt))
self.chunk_left = chunk_left - amt
return value
return ''.join(value)
elif amt == chunk_left:
value += self._safe_read(amt)
value.append(self._safe_read(amt))
self._safe_read(2) # toss the CRLF at the end of the chunk
self.chunk_left = None
return value
return ''.join(value)
else:
value += self._safe_read(chunk_left)
value.append(self._safe_read(chunk_left))
amt -= chunk_left
# we read the whole chunk, get another
@ -606,7 +603,7 @@ class HTTPResponse:
# we read everything; close the "file"
self.close()
return value
return ''.join(value)
def _safe_read(self, amt):
"""Read the number of bytes requested, compensating for partial reads.