diff --git a/mercurial/httppeer.py b/mercurial/httppeer.py --- a/mercurial/httppeer.py +++ b/mercurial/httppeer.py @@ -712,7 +712,7 @@ def _handleresponse(self, handler, resp): # Called in a thread to read the response. - while handler.readframe(resp): + while handler.readdata(resp): pass # TODO implement interface for version 2 peers diff --git a/mercurial/wireprotov2peer.py b/mercurial/wireprotov2peer.py --- a/mercurial/wireprotov2peer.py +++ b/mercurial/wireprotov2peer.py @@ -148,6 +148,7 @@ self._requests = {} self._futures = {} self._responses = {} + self._frameseof = False def callcommand(self, command, args, f): """Register a request to call a command. @@ -180,18 +181,23 @@ return meta['framegen'] - def readframe(self, fh): - """Attempt to read and process a frame. + def readdata(self, framefh): + """Attempt to read data and do work. - Returns None if no frame was read. Presumably this means EOF. + Returns None if no data was read. Presumably this means we're + done with all read I/O. """ - frame = wireprotoframing.readframe(fh) - if frame is None: - # TODO tell reactor? - return + if not self._frameseof: + frame = wireprotoframing.readframe(framefh) + if frame is None: + # TODO tell reactor? + self._frameseof = True + else: + self._ui.note(_('received %r\n') % frame) + self._processframe(frame) - self._ui.note(_('received %r\n') % frame) - self._processframe(frame) + if self._frameseof: + return None return True