Mercurial > hg
comparison mercurial/keepalive.py @ 39816:1cf1680b0554
keepalive: be more careful about self._rbuf when calling super impls
In Python 3, HTTPResponse implements read() in terms of readinto(),
which was calling back into our readinto(), which duplicates
self._rbuf if it's not empty. Before calling into super's read(),
ensure self._rbuf is empty.
Inheritance is bad, and undocumented self-use of your public API is
one of many reasons.
Differential Revision: https://phab.mercurial-scm.org/D4728
author | Augie Fackler <augie@google.com> |
---|---|
date | Mon, 24 Sep 2018 22:45:32 -0400 |
parents | d6d094259d9c |
children | f2dffa1359c6 |
comparison
equal
deleted
inserted
replaced
39815:d3d333ab167a | 39816:1cf1680b0554 |
---|---|
415 amt -= L | 415 amt -= L |
416 else: | 416 else: |
417 s = self._rbuf[:amt] | 417 s = self._rbuf[:amt] |
418 self._rbuf = self._rbuf[amt:] | 418 self._rbuf = self._rbuf[amt:] |
419 return s | 419 return s |
420 | 420 # Careful! http.client.HTTPResponse.read() on Python 3 is |
421 s = self._rbuf + self._raw_read(amt) | 421 # implemented using readinto(), which can duplicate self._rbuf |
422 # if it's not empty. | |
423 s = self._rbuf | |
422 self._rbuf = '' | 424 self._rbuf = '' |
425 s += self._raw_read(amt) | |
423 return s | 426 return s |
424 | 427 |
425 # stolen from Python SVN #68532 to fix issue1088 | 428 # stolen from Python SVN #68532 to fix issue1088 |
426 def _read_chunked(self, amt): | 429 def _read_chunked(self, amt): |
427 chunk_left = self.chunk_left | 430 chunk_left = self.chunk_left |