# HG changeset patch # User Gregory Szorc <gregory.szorc@gmail.com> # Date 2018-04-13 19:49:47 # Node ID e6870bca1f47fa2a36fc8364609aae0fd810c44b # Parent b9502b5f2066559e462a257662af8ec928fe7ff4 wireprotoframing: record when new stream is encountered Without this, we choke after receiving the 2nd frame in a stream. Not sure how we made it this far without finding this bug. Differential Revision: https://phab.mercurial-scm.org/D3334 diff --git a/mercurial/wireprotoframing.py b/mercurial/wireprotoframing.py --- a/mercurial/wireprotoframing.py +++ b/mercurial/wireprotoframing.py @@ -1029,6 +1029,8 @@ class clientreactor(object): 'without beginning of stream flag set'), } + self._incomingstreams[frame.streamid] = stream(frame.streamid) + if frame.streamflags & STREAM_FLAG_ENCODING_APPLIED: raise error.ProgrammingError('support for decoding stream ' 'payloads not yet implemneted') diff --git a/tests/test-wireproto-clientreactor.py b/tests/test-wireproto-clientreactor.py --- a/tests/test-wireproto-clientreactor.py +++ b/tests/test-wireproto-clientreactor.py @@ -105,6 +105,26 @@ class BadFrameRecvTests(unittest.TestCas 'unhandled frame type'): sendframe(reactor, ffs(b'1 0 stream-begin text-output 0 foo')) +class StreamTests(unittest.TestCase): + def testmultipleresponseframes(self): + reactor = framing.clientreactor(buffersends=False) + + request, action, meta = reactor.callcommand(b'foo', {}) + + self.assertEqual(action, 'sendframes') + for f in meta['framegen']: + pass + + action, meta = sendframe( + reactor, + ffs(b'%d 0 stream-begin 4 0 foo' % request.requestid)) + self.assertEqual(action, 'responsedata') + + action, meta = sendframe( + reactor, + ffs(b'%d 0 0 4 eos bar' % request.requestid)) + self.assertEqual(action, 'responsedata') + if __name__ == '__main__': import silenttestrunner silenttestrunner.main(__name__)