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