diff options
| author | Chris Withers <chris@simplistix.co.uk> | 2009-09-04 16:12:32 (GMT) | 
|---|---|---|
| committer | Chris Withers <chris@simplistix.co.uk> | 2009-09-04 16:12:32 (GMT) | 
| commit | 68c6e92fd4a51988377bfb868dbd100da1559087 (patch) | |
| tree | 7949ab7d3a3fdd6f8929bf62528859ffc5c34d32 /Lib/httplib.py | |
| parent | 7d4f8fda4930219754642b0776a49759ac5716a7 (diff) | |
| download | cpython-68c6e92fd4a51988377bfb868dbd100da1559087.zip cpython-68c6e92fd4a51988377bfb868dbd100da1559087.tar.gz cpython-68c6e92fd4a51988377bfb868dbd100da1559087.tar.bz2  | |
Fixes issue #6838: use a list to accumulate the value instead of repeatedly concatenating strings.
Diffstat (limited to 'Lib/httplib.py')
| -rw-r--r-- | Lib/httplib.py | 21 | 
1 files changed, 9 insertions, 12 deletions
diff --git a/Lib/httplib.py b/Lib/httplib.py index 105daf7..30cabce 100644 --- a/Lib/httplib.py +++ b/Lib/httplib.py @@ -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.  | 
