Mercurial > hg
diff mercurial/httpclient/__init__.py @ 19038:36733ab7fa05
http2: sane readline
It turns out that it pays off to read more than a byte at a time with
a select in between :)
author | Brendan Cully <brendan@kublai.com> |
---|---|
date | Fri, 01 Feb 2013 15:00:23 -0800 |
parents | 31f32a96e1e3 |
children | fae47ecaa952 |
line wrap: on
line diff
--- a/mercurial/httpclient/__init__.py Fri Feb 01 14:41:35 2013 -0800 +++ b/mercurial/httpclient/__init__.py Fri Feb 01 15:00:23 2013 -0800 @@ -125,24 +125,16 @@ This may block until either a line ending is found or the response is complete. """ - # TODO: move this into the reader interface where it can be - # smarter (and probably avoid copies) - bytes = [] - while not bytes: - try: - bytes = [self._reader.read(1)] - except _readers.ReadNotReady: - self._select() - while bytes[-1] != '\n' and not self.complete(): + blocks = [] + while True: + self._reader.readto('\n', blocks) + + if blocks and blocks[-1][-1] == '\n' or self.complete(): + break + self._select() - bytes.append(self._reader.read(1)) - if bytes[-1] != '\n': - next = self._reader.read(1) - while next and next != '\n': - bytes.append(next) - next = self._reader.read(1) - bytes.append(next) - return ''.join(bytes) + + return ''.join(blocks) def read(self, length=None): # if length is None, unbounded read