Skip to content

Commit

Permalink
Fixes issue python#6838: use a list to accumulate the value instead o…
Browse files Browse the repository at this point in the history
…f repeatedly concatenating strings.
  • Loading branch information
cjw296 committed Sep 4, 2009
1 parent 04ee867 commit 5a86acb
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 12 deletions.
21 changes: 9 additions & 12 deletions Lib/http/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -518,10 +518,7 @@ def read(self, amt=None):
def _read_chunked(self, amt):
assert self.chunked != _UNKNOWN
chunk_left = self.chunk_left
value = b""

# 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()
Expand All @@ -534,22 +531,22 @@ def _read_chunked(self, amt):
# close the connection as protocol synchronisation is
# probably lost
self.close()
raise IncompleteRead(value)
raise IncompleteRead(b''.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 b''.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 b''.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
Expand All @@ -570,7 +567,7 @@ def _read_chunked(self, amt):
# we read everything; close the "file"
self.close()

return value
return b''.join(value)

def _safe_read(self, amt):
"""Read the number of bytes requested, compensating for partial reads.
Expand Down
5 changes: 5 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ C-API
Library
-------

- Issue #6838: Use a list to accumulate the value instead of
repeatedly concatenating strings in http.client's
HTTPResponse._read_chunked providing a significant speed increase
when downloading large files servend with a Transfer-Encoding of 'chunked'.

- Have importlib raise ImportError if None is found in sys.modules for a
module.

Expand Down

0 comments on commit 5a86acb

Please sign in to comment.