# HG changeset patch # User Gregory Szorc # Date 2018-10-09 00:24:28 # Node ID b5bf3dd6ec5bb7c38f96b6db6172760ada037447 # Parent ed4ebbb98ca023572ce3af37dcf9fbe86d7c0a4c wireprotov2: send content encoded frames from server Now that we have support for negotiating encodings and configuring an encoder, we can start sending content encoded frames from the server. This commit teaches the wireprotov2 server code to send content encoded frames. On the mozilla-unified repository with zstd enabled peers, this change reduces the total amount of data transferred from server to client drastically: befor: 7,190,995,812 bytes after: 1,605,508,691 bytes Differential Revision: https://phab.mercurial-scm.org/D4927 diff --git a/mercurial/wireprotoframing.py b/mercurial/wireprotoframing.py --- a/mercurial/wireprotoframing.py +++ b/mercurial/wireprotoframing.py @@ -368,17 +368,46 @@ def createcommandframes(stream, requesti def createcommandresponseokframe(stream, requestid): overall = b''.join(cborutil.streamencode({b'status': b'ok'})) + if stream.streamsettingssent: + overall = stream.encode(overall) + encoded = True + + if not overall: + return None + else: + encoded = False + return stream.makeframe(requestid=requestid, typeid=FRAME_TYPE_COMMAND_RESPONSE, flags=FLAG_COMMAND_RESPONSE_CONTINUATION, - payload=overall) + payload=overall, + encoded=encoded) -def createcommandresponseeosframe(stream, requestid): +def createcommandresponseeosframes(stream, requestid, + maxframesize=DEFAULT_MAX_FRAME_SIZE): """Create an empty payload frame representing command end-of-stream.""" - return stream.makeframe(requestid=requestid, - typeid=FRAME_TYPE_COMMAND_RESPONSE, - flags=FLAG_COMMAND_RESPONSE_EOS, - payload=b'') + payload = stream.flush() + + offset = 0 + while True: + chunk = payload[offset:offset + maxframesize] + offset += len(chunk) + + done = offset == len(payload) + + if done: + flags = FLAG_COMMAND_RESPONSE_EOS + else: + flags = FLAG_COMMAND_RESPONSE_CONTINUATION + + yield stream.makeframe(requestid=requestid, + typeid=FRAME_TYPE_COMMAND_RESPONSE, + flags=flags, + payload=chunk, + encoded=payload != b'') + + if done: + break def createalternatelocationresponseframe(stream, requestid, location): data = { @@ -395,10 +424,19 @@ def createalternatelocationresponseframe if value is not None: data[b'location'][pycompat.bytestr(a)] = value + payload = b''.join(cborutil.streamencode(data)) + + if stream.streamsettingssent: + payload = stream.encode(payload) + encoded = True + else: + encoded = False + return stream.makeframe(requestid=requestid, typeid=FRAME_TYPE_COMMAND_RESPONSE, flags=FLAG_COMMAND_RESPONSE_CONTINUATION, - payload=b''.join(cborutil.streamencode(data))) + payload=payload, + encoded=encoded) def createcommanderrorresponse(stream, requestid, message, args=None): # TODO should this be using a list of {'msg': ..., 'args': {}} so atom @@ -519,6 +557,8 @@ class bufferingcommandresponseemitter(ob yield frame return + data = self._stream.encode(data) + # There is a ton of potential to do more complicated things here. # Our immediate goal is to coalesce small chunks into big frames, # not achieve the fewest number of frames possible. So we go with @@ -548,7 +588,8 @@ class bufferingcommandresponseemitter(ob self._requestid, typeid=FRAME_TYPE_COMMAND_RESPONSE, flags=FLAG_COMMAND_RESPONSE_CONTINUATION, - payload=chunk) + payload=chunk, + encoded=True) if offset == len(data): return @@ -583,7 +624,8 @@ class bufferingcommandresponseemitter(ob self._requestid, typeid=FRAME_TYPE_COMMAND_RESPONSE, flags=FLAG_COMMAND_RESPONSE_CONTINUATION, - payload=payload) + payload=payload, + encoded=True) # TODO consider defining encoders/decoders using the util.compressionengine # mechanism. @@ -776,7 +818,9 @@ class outputstream(stream): def __init__(self, streamid, active=False): super(outputstream, self).__init__(streamid, active=active) + self.streamsettingssent = False self._encoder = None + self._encodername = None def setencoder(self, ui, name): """Set the encoder for this stream. @@ -787,6 +831,7 @@ class outputstream(stream): raise error.Abort(_('unknown stream encoder: %s') % name) self._encoder = STREAM_ENCODERS[name][0](ui) + self._encodername = name def encode(self, data): if not self._encoder: @@ -806,6 +851,45 @@ class outputstream(stream): self._encoder.finish() + def makeframe(self, requestid, typeid, flags, payload, + encoded=False): + """Create a frame to be sent out over this stream. + + Only returns the frame instance. Does not actually send it. + """ + streamflags = 0 + if not self._active: + streamflags |= STREAM_FLAG_BEGIN_STREAM + self._active = True + + if encoded: + if not self.streamsettingssent: + raise error.ProgrammingError( + b'attempting to send encoded frame without sending stream ' + b'settings') + + streamflags |= STREAM_FLAG_ENCODING_APPLIED + + if (typeid == FRAME_TYPE_STREAM_SETTINGS + and flags & FLAG_STREAM_ENCODING_SETTINGS_EOS): + self.streamsettingssent = True + + return makeframe(requestid, self.streamid, streamflags, typeid, flags, + payload) + + def makestreamsettingsframe(self, requestid): + """Create a stream settings frame for this stream. + + Returns frame data or None if no stream settings frame is needed or has + already been sent. + """ + if not self._encoder or self.streamsettingssent: + return None + + payload = b''.join(cborutil.streamencode(self._encodername)) + return self.makeframe(requestid, FRAME_TYPE_STREAM_SETTINGS, + FLAG_STREAM_ENCODING_SETTINGS_EOS, payload) + def ensureserverstream(stream): if stream.streamid % 2: raise error.ProgrammingError('server should only write to even ' @@ -995,7 +1079,9 @@ class serverreactor(object): yield frame if emitted: - yield createcommandresponseeosframe(stream, requestid) + for frame in createcommandresponseeosframes( + stream, requestid): + yield frame break except error.WireprotoCommandError as e: @@ -1022,6 +1108,10 @@ class serverreactor(object): 'alternatelocationresponse seen after initial ' 'output object') + frame = stream.makestreamsettingsframe(requestid) + if frame: + yield frame + yield createalternatelocationresponseframe( stream, requestid, o) @@ -1034,7 +1124,16 @@ class serverreactor(object): 'object follows alternatelocationresponse') if not emitted: - yield createcommandresponseokframe(stream, requestid) + # Frame is optional. + frame = stream.makestreamsettingsframe(requestid) + if frame: + yield frame + + # May be None if empty frame (due to encoding). + frame = createcommandresponseokframe(stream, requestid) + if frame: + yield frame + emitted = True # Objects emitted by command functions can be serializable @@ -1121,13 +1220,25 @@ class serverreactor(object): return self._handlesendframes(sendframes()) def makeoutputstream(self): - """Create a stream to be used for sending data to the client.""" + """Create a stream to be used for sending data to the client. + + If this is called before protocol settings frames are received, we + don't know what stream encodings are supported by the client and + we will default to identity. + """ streamid = self._nextoutgoingstreamid self._nextoutgoingstreamid += 2 s = outputstream(streamid) self._outgoingstreams[streamid] = s + # Always use the *server's* preferred encoder over the client's, + # as servers have more to lose from sub-optimal encoders being used. + for name in STREAM_ENCODERS_ORDER: + if name in self._sendersettings['contentencodings']: + s.setencoder(self._ui, name) + break + return s def _makeerrorresult(self, msg): diff --git a/mercurial/wireprotov2server.py b/mercurial/wireprotov2server.py --- a/mercurial/wireprotov2server.py +++ b/mercurial/wireprotov2server.py @@ -194,7 +194,7 @@ def _processhttpv2request(ui, repo, req, reactor = wireprotoframing.serverreactor(ui, deferoutput=True) seencommand = False - outstream = reactor.makeoutputstream() + outstream = None while True: frame = wireprotoframing.readframe(req.bodyfh) @@ -207,6 +207,11 @@ def _processhttpv2request(ui, repo, req, # Need more data before we can do anything. continue elif action == 'runcommand': + # Defer creating output stream because we need to wait for + # protocol settings frames so proper encoding can be applied. + if not outstream: + outstream = reactor.makeoutputstream() + sentoutput = _httpv2runcommand(ui, repo, req, res, authedperm, reqcommand, reactor, outstream, meta, issubsequent=seencommand) diff --git a/tests/test-http-api-httpv2.t b/tests/test-http-api-httpv2.t --- a/tests/test-http-api-httpv2.t +++ b/tests/test-http-api-httpv2.t @@ -176,11 +176,14 @@ Request to read-only command works out o s> Content-Type: application/mercurial-exp-framing-0006\r\n s> Transfer-Encoding: chunked\r\n s> \r\n + s> 11\r\n + s> \t\x00\x00\x01\x00\x02\x01\x92Hidentity + s> \r\n s> 13\r\n - s> \x0b\x00\x00\x01\x00\x02\x011\xa1FstatusBok + s> \x0b\x00\x00\x01\x00\x02\x041\xa1FstatusBok s> \r\n s> 27\r\n - s> \x1f\x00\x00\x01\x00\x02\x001X\x1dcustomreadonly bytes response + s> \x1f\x00\x00\x01\x00\x02\x041X\x1dcustomreadonly bytes response s> \r\n s> 8\r\n s> \x00\x00\x00\x01\x00\x02\x002 @@ -209,16 +212,21 @@ Request to read-only command works out o s> Content-Type: application/mercurial-exp-framing-0006\r\n s> Transfer-Encoding: chunked\r\n s> \r\n + s> 11\r\n + s> \t\x00\x00\x01\x00\x02\x01\x92 + s> Hidentity + s> \r\n + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) s> 13\r\n - s> \x0b\x00\x00\x01\x00\x02\x011 + s> \x0b\x00\x00\x01\x00\x02\x041 s> \xa1FstatusBok s> \r\n - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) s> 27\r\n - s> \x1f\x00\x00\x01\x00\x02\x001 + s> \x1f\x00\x00\x01\x00\x02\x041 s> X\x1dcustomreadonly bytes response s> \r\n - received frame(size=31; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=31; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) s> 8\r\n s> \x00\x00\x00\x01\x00\x02\x002 s> \r\n @@ -335,11 +343,14 @@ Authorized request for valid read-write s> Content-Type: application/mercurial-exp-framing-0006\r\n s> Transfer-Encoding: chunked\r\n s> \r\n + s> 11\r\n + s> \t\x00\x00\x01\x00\x02\x01\x92Hidentity + s> \r\n s> 13\r\n - s> \x0b\x00\x00\x01\x00\x02\x011\xa1FstatusBok + s> \x0b\x00\x00\x01\x00\x02\x041\xa1FstatusBok s> \r\n s> 27\r\n - s> \x1f\x00\x00\x01\x00\x02\x001X\x1dcustomreadonly bytes response + s> \x1f\x00\x00\x01\x00\x02\x041X\x1dcustomreadonly bytes response s> \r\n s> 8\r\n s> \x00\x00\x00\x01\x00\x02\x002 @@ -464,11 +475,14 @@ Multiple requests to regular command URL s> Content-Type: application/mercurial-exp-framing-0006\r\n s> Transfer-Encoding: chunked\r\n s> \r\n + s> 11\r\n + s> \t\x00\x00\x01\x00\x02\x01\x92Hidentity + s> \r\n s> 13\r\n - s> \x0b\x00\x00\x01\x00\x02\x011\xa1FstatusBok + s> \x0b\x00\x00\x01\x00\x02\x041\xa1FstatusBok s> \r\n s> 27\r\n - s> \x1f\x00\x00\x01\x00\x02\x001X\x1dcustomreadonly bytes response + s> \x1f\x00\x00\x01\x00\x02\x041X\x1dcustomreadonly bytes response s> \r\n s> 8\r\n s> \x00\x00\x00\x01\x00\x02\x002 @@ -503,20 +517,23 @@ Multiple requests to "multirequest" URL s> Content-Type: application/mercurial-exp-framing-0006\r\n s> Transfer-Encoding: chunked\r\n s> \r\n + s> 11\r\n + s> \t\x00\x00\x01\x00\x02\x01\x92Hidentity + s> \r\n s> 13\r\n - s> \x0b\x00\x00\x01\x00\x02\x011\xa1FstatusBok + s> \x0b\x00\x00\x01\x00\x02\x041\xa1FstatusBok s> \r\n s> 27\r\n - s> \x1f\x00\x00\x01\x00\x02\x001X\x1dcustomreadonly bytes response + s> \x1f\x00\x00\x01\x00\x02\x041X\x1dcustomreadonly bytes response s> \r\n s> 8\r\n s> \x00\x00\x00\x01\x00\x02\x002 s> \r\n s> 13\r\n - s> \x0b\x00\x00\x03\x00\x02\x001\xa1FstatusBok + s> \x0b\x00\x00\x03\x00\x02\x041\xa1FstatusBok s> \r\n s> 27\r\n - s> \x1f\x00\x00\x03\x00\x02\x001X\x1dcustomreadonly bytes response + s> \x1f\x00\x00\x03\x00\x02\x041X\x1dcustomreadonly bytes response s> \r\n s> 8\r\n s> \x00\x00\x00\x03\x00\x02\x002 @@ -553,20 +570,23 @@ Interleaved requests to "multirequest" a s> Content-Type: application/mercurial-exp-framing-0006\r\n s> Transfer-Encoding: chunked\r\n s> \r\n + s> 11\r\n + s> \t\x00\x00\x03\x00\x02\x01\x92Hidentity + s> \r\n s> 13\r\n - s> \x0b\x00\x00\x03\x00\x02\x011\xa1FstatusBok + s> \x0b\x00\x00\x03\x00\x02\x041\xa1FstatusBok s> \r\n s> 28\r\n - s> \x00\x00\x03\x00\x02\x001\xa3Ibookmarks@Jnamespaces@Fphases@ + s> \x00\x00\x03\x00\x02\x041\xa3Ibookmarks@Jnamespaces@Fphases@ s> \r\n s> 8\r\n s> \x00\x00\x00\x03\x00\x02\x002 s> \r\n s> 13\r\n - s> \x0b\x00\x00\x01\x00\x02\x001\xa1FstatusBok + s> \x0b\x00\x00\x01\x00\x02\x041\xa1FstatusBok s> \r\n s> 9\r\n - s> \x01\x00\x00\x01\x00\x02\x001\xa0 + s> \x01\x00\x00\x01\x00\x02\x041\xa0 s> \r\n s> 8\r\n s> \x00\x00\x00\x01\x00\x02\x002 @@ -641,16 +661,21 @@ Defining an invalid content encoding res s> Content-Type: application/mercurial-exp-framing-0006\r\n s> Transfer-Encoding: chunked\r\n s> \r\n + s> 11\r\n + s> \t\x00\x00\x01\x00\x02\x01\x92 + s> Hidentity + s> \r\n + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) s> 13\r\n - s> \x0b\x00\x00\x01\x00\x02\x011 + s> \x0b\x00\x00\x01\x00\x02\x041 s> \xa1FstatusBok s> \r\n - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) s> 1e\r\n - s> \x16\x00\x00\x01\x00\x02\x001 + s> \x16\x00\x00\x01\x00\x02\x041 s> \x81T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 s> \r\n - received frame(size=22; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=22; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) s> 8\r\n s> \x00\x00\x00\x01\x00\x02\x002 s> \r\n @@ -685,22 +710,18 @@ Defining an invalid content encoding res s> Content-Type: application/mercurial-exp-framing-0006\r\n s> Transfer-Encoding: chunked\r\n s> \r\n - s> 13\r\n - s> \x0b\x00\x00\x01\x00\x02\x011 - s> \xa1FstatusBok + s> 11\r\n + s> \t\x00\x00\x01\x00\x02\x01\x92 + s> Hzstd-8mb s> \r\n - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - s> 1e\r\n - s> \x16\x00\x00\x01\x00\x02\x001 - s> \x81T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + s> 25\r\n + s> \x1d\x00\x00\x01\x00\x02\x042 + s> (\xb5/\xfd\x00P\xa4\x00\x00p\xa1FstatusBok\x81T\x00\x01\x00\tP\x02 s> \r\n - received frame(size=22; request=1; stream=2; streamflags=; type=command-response; flags=continuation) - s> 8\r\n - s> \x00\x00\x00\x01\x00\x02\x002 - s> \r\n + received frame(size=29; request=1; stream=2; streamflags=encoded; type=command-response; flags=eos) s> 0\r\n s> \r\n - received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) response: [ b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' ] diff --git a/tests/test-http-protocol.t b/tests/test-http-protocol.t --- a/tests/test-http-protocol.t +++ b/tests/test-http-protocol.t @@ -333,16 +333,21 @@ Client with HTTPv2 enabled automatically s> Content-Type: application/mercurial-exp-framing-0006\r\n s> Transfer-Encoding: chunked\r\n s> \r\n + s> 11\r\n + s> \t\x00\x00\x01\x00\x02\x01\x92 + s> Hidentity + s> \r\n + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) s> 13\r\n - s> \x0b\x00\x00\x01\x00\x02\x011 + s> \x0b\x00\x00\x01\x00\x02\x041 s> \xa1FstatusBok s> \r\n - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) s> 1e\r\n - s> \x16\x00\x00\x01\x00\x02\x001 + s> \x16\x00\x00\x01\x00\x02\x041 s> \x81T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 s> \r\n - received frame(size=22; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=22; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) s> 8\r\n s> \x00\x00\x00\x01\x00\x02\x002 s> \r\n diff --git a/tests/test-wireproto-command-capabilities.t b/tests/test-wireproto-command-capabilities.t --- a/tests/test-wireproto-command-capabilities.t +++ b/tests/test-wireproto-command-capabilities.t @@ -453,16 +453,21 @@ capabilities command returns expected in s> Content-Type: application/mercurial-exp-framing-0006\r\n s> Transfer-Encoding: chunked\r\n s> \r\n + s> 11\r\n + s> \t\x00\x00\x01\x00\x02\x01\x92 + s> Hidentity + s> \r\n + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) s> 13\r\n - s> \x0b\x00\x00\x01\x00\x02\x011 + s> \x0b\x00\x00\x01\x00\x02\x041 s> \xa1FstatusBok s> \r\n - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) s> 508\r\n - s> \x00\x05\x00\x01\x00\x02\x001 + s> \x00\x05\x00\x01\x00\x02\x041 s> \xa4Hcommands\xaaIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullMchangesetdata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x84IbookmarksGparentsEphaseHrevisionInoderange\xa3Gdefault\xf6Hrequired\xf4DtypeDlistEnodes\xa3Gdefault\xf6Hrequired\xf4DtypeDlistJnodesdepth\xa3Gdefault\xf6Hrequired\xf4DtypeCintKpermissions\x81DpullHfiledata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x82GparentsHrevisionKhaveparents\xa3Gdefault\xf4Hrequired\xf4DtypeDboolEnodes\xa2Hrequired\xf5DtypeDlistDpath\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xa3Gdefault\xf4Hrequired\xf4DtypeDboolKpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\xa3Gdefault\x80Hrequired\xf4DtypeDlistKpermissions\x81DpullHlistkeys\xa2Dargs\xa1Inamespace\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullFlookup\xa2Dargs\xa1Ckey\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullLmanifestdata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x82GparentsHrevisionKhaveparents\xa3Gdefault\xf4Hrequired\xf4DtypeDboolEnodes\xa2Hrequired\xf5DtypeDlistDtree\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullGpushkey\xa2Dargs\xa4Ckey\xa2Hrequired\xf5DtypeEbytesInamespace\xa2Hrequired\xf5DtypeEbytesCnew\xa2Hrequired\xf5DtypeEbytesCold\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpushQframingmediatypes\x81X&application/mercurial-exp-framing-0006Rpathfilterprefixes\xd9\x01\x02\x82Epath:Lrootfilesin:Nrawrepoformats\x82LgeneraldeltaHrevlogv1 s> \r\n - received frame(size=1280; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=1280; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) s> 8\r\n s> \x00\x00\x00\x01\x00\x02\x002 s> \r\n diff --git a/tests/test-wireproto-content-redirects.t b/tests/test-wireproto-content-redirects.t --- a/tests/test-wireproto-content-redirects.t +++ b/tests/test-wireproto-content-redirects.t @@ -86,16 +86,21 @@ Redirect targets advertised when configu s> Content-Type: application/mercurial-exp-framing-0006\r\n s> Transfer-Encoding: chunked\r\n s> \r\n + s> 11\r\n + s> \t\x00\x00\x01\x00\x02\x01\x92 + s> Hidentity + s> \r\n + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) s> 13\r\n - s> \x0b\x00\x00\x01\x00\x02\x011 + s> \x0b\x00\x00\x01\x00\x02\x041 s> \xa1FstatusBok s> \r\n - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) s> 588\r\n - s> \x80\x05\x00\x01\x00\x02\x001 + s> \x80\x05\x00\x01\x00\x02\x041 s> \xa5Hcommands\xaaIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullMchangesetdata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x84IbookmarksGparentsEphaseHrevisionInoderange\xa3Gdefault\xf6Hrequired\xf4DtypeDlistEnodes\xa3Gdefault\xf6Hrequired\xf4DtypeDlistJnodesdepth\xa3Gdefault\xf6Hrequired\xf4DtypeCintKpermissions\x81DpullHfiledata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x82GparentsHrevisionKhaveparents\xa3Gdefault\xf4Hrequired\xf4DtypeDboolEnodes\xa2Hrequired\xf5DtypeDlistDpath\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xa3Gdefault\xf4Hrequired\xf4DtypeDboolKpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\xa3Gdefault\x80Hrequired\xf4DtypeDlistKpermissions\x81DpullHlistkeys\xa2Dargs\xa1Inamespace\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullFlookup\xa2Dargs\xa1Ckey\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullLmanifestdata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x82GparentsHrevisionKhaveparents\xa3Gdefault\xf4Hrequired\xf4DtypeDboolEnodes\xa2Hrequired\xf5DtypeDlistDtree\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullGpushkey\xa2Dargs\xa4Ckey\xa2Hrequired\xf5DtypeEbytesInamespace\xa2Hrequired\xf5DtypeEbytesCnew\xa2Hrequired\xf5DtypeEbytesCold\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpushQframingmediatypes\x81X&application/mercurial-exp-framing-0006Rpathfilterprefixes\xd9\x01\x02\x82Epath:Lrootfilesin:Nrawrepoformats\x82LgeneraldeltaHrevlogv1Hredirect\xa2Fhashes\x82Fsha256Dsha1Gtargets\x81\xa5DnameHtarget-aHprotocolDhttpKsnirequired\xf4Ktlsversions\x82C1.2C1.3Duris\x81Shttp://example.com/ s> \r\n - received frame(size=1408; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=1408; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) s> 8\r\n s> \x00\x00\x00\x01\x00\x02\x002 s> \r\n @@ -370,16 +375,21 @@ Unknown protocol is filtered from compat s> Content-Type: application/mercurial-exp-framing-0006\r\n s> Transfer-Encoding: chunked\r\n s> \r\n + s> 11\r\n + s> \t\x00\x00\x01\x00\x02\x01\x92 + s> Hidentity + s> \r\n + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) s> 13\r\n - s> \x0b\x00\x00\x01\x00\x02\x011 + s> \x0b\x00\x00\x01\x00\x02\x041 s> \xa1FstatusBok s> \r\n - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) s> 5a3\r\n - s> \x9b\x05\x00\x01\x00\x02\x001 + s> \x9b\x05\x00\x01\x00\x02\x041 s> \xa5Hcommands\xaaIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullMchangesetdata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x84IbookmarksGparentsEphaseHrevisionInoderange\xa3Gdefault\xf6Hrequired\xf4DtypeDlistEnodes\xa3Gdefault\xf6Hrequired\xf4DtypeDlistJnodesdepth\xa3Gdefault\xf6Hrequired\xf4DtypeCintKpermissions\x81DpullHfiledata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x82GparentsHrevisionKhaveparents\xa3Gdefault\xf4Hrequired\xf4DtypeDboolEnodes\xa2Hrequired\xf5DtypeDlistDpath\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xa3Gdefault\xf4Hrequired\xf4DtypeDboolKpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\xa3Gdefault\x80Hrequired\xf4DtypeDlistKpermissions\x81DpullHlistkeys\xa2Dargs\xa1Inamespace\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullFlookup\xa2Dargs\xa1Ckey\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullLmanifestdata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x82GparentsHrevisionKhaveparents\xa3Gdefault\xf4Hrequired\xf4DtypeDboolEnodes\xa2Hrequired\xf5DtypeDlistDtree\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullGpushkey\xa2Dargs\xa4Ckey\xa2Hrequired\xf5DtypeEbytesInamespace\xa2Hrequired\xf5DtypeEbytesCnew\xa2Hrequired\xf5DtypeEbytesCold\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpushQframingmediatypes\x81X&application/mercurial-exp-framing-0006Rpathfilterprefixes\xd9\x01\x02\x82Epath:Lrootfilesin:Nrawrepoformats\x82LgeneraldeltaHrevlogv1Hredirect\xa2Fhashes\x82Fsha256Dsha1Gtargets\x82\xa3DnameHtarget-aHprotocolDhttpDuris\x81Shttp://example.com/\xa3DnameHtarget-bHprotocolGunknownDuris\x81Vunknown://example.com/ s> \r\n - received frame(size=1435; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=1435; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) s> 8\r\n s> \x00\x00\x00\x01\x00\x02\x002 s> \r\n @@ -660,16 +670,21 @@ Missing SNI support filters targets that s> Content-Type: application/mercurial-exp-framing-0006\r\n s> Transfer-Encoding: chunked\r\n s> \r\n + s> 11\r\n + s> \t\x00\x00\x01\x00\x02\x01\x92 + s> Hidentity + s> \r\n + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) s> 13\r\n - s> \x0b\x00\x00\x01\x00\x02\x011 + s> \x0b\x00\x00\x01\x00\x02\x041 s> \xa1FstatusBok s> \r\n - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) s> 57b\r\n - s> s\x05\x00\x01\x00\x02\x001 + s> s\x05\x00\x01\x00\x02\x041 s> \xa5Hcommands\xaaIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullMchangesetdata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x84IbookmarksGparentsEphaseHrevisionInoderange\xa3Gdefault\xf6Hrequired\xf4DtypeDlistEnodes\xa3Gdefault\xf6Hrequired\xf4DtypeDlistJnodesdepth\xa3Gdefault\xf6Hrequired\xf4DtypeCintKpermissions\x81DpullHfiledata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x82GparentsHrevisionKhaveparents\xa3Gdefault\xf4Hrequired\xf4DtypeDboolEnodes\xa2Hrequired\xf5DtypeDlistDpath\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xa3Gdefault\xf4Hrequired\xf4DtypeDboolKpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\xa3Gdefault\x80Hrequired\xf4DtypeDlistKpermissions\x81DpullHlistkeys\xa2Dargs\xa1Inamespace\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullFlookup\xa2Dargs\xa1Ckey\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullLmanifestdata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x82GparentsHrevisionKhaveparents\xa3Gdefault\xf4Hrequired\xf4DtypeDboolEnodes\xa2Hrequired\xf5DtypeDlistDtree\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullGpushkey\xa2Dargs\xa4Ckey\xa2Hrequired\xf5DtypeEbytesInamespace\xa2Hrequired\xf5DtypeEbytesCnew\xa2Hrequired\xf5DtypeEbytesCold\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpushQframingmediatypes\x81X&application/mercurial-exp-framing-0006Rpathfilterprefixes\xd9\x01\x02\x82Epath:Lrootfilesin:Nrawrepoformats\x82LgeneraldeltaHrevlogv1Hredirect\xa2Fhashes\x82Fsha256Dsha1Gtargets\x81\xa4DnameNtarget-bad-tlsHprotocolEhttpsKsnirequired\xf5Duris\x81Thttps://example.com/ s> \r\n - received frame(size=1395; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=1395; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) s> 8\r\n s> \x00\x00\x00\x01\x00\x02\x002 s> \r\n @@ -940,16 +955,21 @@ Unknown tls value is filtered from compa s> Content-Type: application/mercurial-exp-framing-0006\r\n s> Transfer-Encoding: chunked\r\n s> \r\n + s> 11\r\n + s> \t\x00\x00\x01\x00\x02\x01\x92 + s> Hidentity + s> \r\n + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) s> 13\r\n - s> \x0b\x00\x00\x01\x00\x02\x011 + s> \x0b\x00\x00\x01\x00\x02\x041 s> \xa1FstatusBok s> \r\n - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) s> 581\r\n - s> y\x05\x00\x01\x00\x02\x001 + s> y\x05\x00\x01\x00\x02\x041 s> \xa5Hcommands\xaaIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullMchangesetdata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x84IbookmarksGparentsEphaseHrevisionInoderange\xa3Gdefault\xf6Hrequired\xf4DtypeDlistEnodes\xa3Gdefault\xf6Hrequired\xf4DtypeDlistJnodesdepth\xa3Gdefault\xf6Hrequired\xf4DtypeCintKpermissions\x81DpullHfiledata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x82GparentsHrevisionKhaveparents\xa3Gdefault\xf4Hrequired\xf4DtypeDboolEnodes\xa2Hrequired\xf5DtypeDlistDpath\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xa3Gdefault\xf4Hrequired\xf4DtypeDboolKpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\xa3Gdefault\x80Hrequired\xf4DtypeDlistKpermissions\x81DpullHlistkeys\xa2Dargs\xa1Inamespace\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullFlookup\xa2Dargs\xa1Ckey\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullLmanifestdata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x82GparentsHrevisionKhaveparents\xa3Gdefault\xf4Hrequired\xf4DtypeDboolEnodes\xa2Hrequired\xf5DtypeDlistDtree\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullGpushkey\xa2Dargs\xa4Ckey\xa2Hrequired\xf5DtypeEbytesInamespace\xa2Hrequired\xf5DtypeEbytesCnew\xa2Hrequired\xf5DtypeEbytesCold\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpushQframingmediatypes\x81X&application/mercurial-exp-framing-0006Rpathfilterprefixes\xd9\x01\x02\x82Epath:Lrootfilesin:Nrawrepoformats\x82LgeneraldeltaHrevlogv1Hredirect\xa2Fhashes\x82Fsha256Dsha1Gtargets\x81\xa4DnameNtarget-bad-tlsHprotocolEhttpsKtlsversions\x82B42B39Duris\x81Thttps://example.com/ s> \r\n - received frame(size=1401; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=1401; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) s> 8\r\n s> \x00\x00\x00\x01\x00\x02\x002 s> \r\n diff --git a/tests/test-wireproto-exchangev2.t b/tests/test-wireproto-exchangev2.t --- a/tests/test-wireproto-exchangev2.t +++ b/tests/test-wireproto-exchangev2.t @@ -45,11 +45,12 @@ Test basic clone sending command known: { 'nodes': [] } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=43; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=43; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) - received frame(size=11; request=3; stream=2; streamflags=; type=command-response; flags=continuation) - received frame(size=1; request=3; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=11; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=1; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=3; stream=2; streamflags=; type=command-response; flags=eos) sending 1 commands sending command changesetdata: { @@ -67,8 +68,9 @@ Test basic clone ] ] } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=941; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=941; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) add changeset 3390ef850073 add changeset 4432d83626e8 @@ -92,8 +94,9 @@ Test basic clone ], 'tree': '' } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=992; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=992; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) sending 2 commands sending command filedata: { @@ -122,11 +125,12 @@ Test basic clone ], 'path': 'b' } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=431; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=431; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) - received frame(size=11; request=3; stream=2; streamflags=; type=command-response; flags=continuation) - received frame(size=431; request=3; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=11; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=431; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=3; stream=2; streamflags=; type=command-response; flags=eos) updating the branch cache new changesets 3390ef850073:caa2a465451d (3 drafts) @@ -173,8 +177,9 @@ Cloning only a specific revision works sending command lookup: { 'key': '4432d83626e8' } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=21; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=21; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) query 1; heads sending 2 commands @@ -182,11 +187,12 @@ Cloning only a specific revision works sending command known: { 'nodes': [] } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=43; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=43; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) - received frame(size=11; request=3; stream=2; streamflags=; type=command-response; flags=continuation) - received frame(size=1; request=3; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=11; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=1; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=3; stream=2; streamflags=; type=command-response; flags=eos) sending 1 commands sending command changesetdata: { @@ -203,8 +209,9 @@ Cloning only a specific revision works ] ] } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=381; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=381; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) add changeset 3390ef850073 add changeset 4432d83626e8 @@ -222,8 +229,9 @@ Cloning only a specific revision works ], 'tree': '' } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=404; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=404; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) sending 2 commands sending command filedata: { @@ -249,11 +257,12 @@ Cloning only a specific revision works ], 'path': 'b' } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=277; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=277; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) - received frame(size=11; request=3; stream=2; streamflags=; type=command-response; flags=continuation) - received frame(size=123; request=3; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=11; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=123; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=3; stream=2; streamflags=; type=command-response; flags=eos) updating the branch cache new changesets 3390ef850073:4432d83626e8 @@ -286,11 +295,12 @@ Incremental pull works 'D2\xd86&\xe8\xa9\x86U\xf0b\xec\x1f*C\xb0\x7f\x7f\xbb\xb0' ] } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=43; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=43; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) - received frame(size=11; request=3; stream=2; streamflags=; type=command-response; flags=continuation) - received frame(size=2; request=3; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=11; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=2; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=3; stream=2; streamflags=; type=command-response; flags=eos) searching for changes all local heads known remotely @@ -312,8 +322,9 @@ Incremental pull works ] ] } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=613; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=613; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) add changeset cd2534766bec add changeset e96ae20f4188 @@ -333,8 +344,9 @@ Incremental pull works ], 'tree': '' } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=601; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=601; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) sending 2 commands sending command filedata: { @@ -362,11 +374,12 @@ Incremental pull works ], 'path': 'b' } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=277; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=277; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) - received frame(size=11; request=3; stream=2; streamflags=; type=command-response; flags=continuation) - received frame(size=431; request=3; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=11; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=431; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=3; stream=2; streamflags=; type=command-response; flags=eos) updating the branch cache new changesets cd2534766bec:caa2a465451d (3 drafts) @@ -409,11 +422,12 @@ Phase-only update works '\xca\xa2\xa4eE\x1d\xd1\xfa\xcd\xa0\xf5\xb1#\x12\xc3UXA\x88\xa1' ] } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=43; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=43; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) - received frame(size=11; request=3; stream=2; streamflags=; type=command-response; flags=continuation) - received frame(size=3; request=3; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=11; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=3; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=3; stream=2; streamflags=; type=command-response; flags=eos) searching for changes all remote heads known locally @@ -436,8 +450,9 @@ Phase-only update works ] ] } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=92; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=92; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) checking for updated bookmarks 2 local changesets published @@ -472,11 +487,12 @@ Bookmarks are transferred on clone sending command known: { 'nodes': [] } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=43; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=43; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) - received frame(size=11; request=3; stream=2; streamflags=; type=command-response; flags=continuation) - received frame(size=1; request=3; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=11; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=1; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=3; stream=2; streamflags=; type=command-response; flags=eos) sending 1 commands sending command changesetdata: { @@ -494,8 +510,9 @@ Bookmarks are transferred on clone ] ] } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=979; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=979; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) add changeset 3390ef850073 add changeset 4432d83626e8 @@ -521,8 +538,9 @@ Bookmarks are transferred on clone ], 'tree': '' } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=992; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=992; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) sending 2 commands sending command filedata: { @@ -551,11 +569,12 @@ Bookmarks are transferred on clone ], 'path': 'b' } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=431; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=431; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) - received frame(size=11; request=3; stream=2; streamflags=; type=command-response; flags=continuation) - received frame(size=431; request=3; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=11; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=431; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=3; stream=2; streamflags=; type=command-response; flags=eos) updating the branch cache new changesets 3390ef850073:caa2a465451d (1 drafts) @@ -583,11 +602,12 @@ Server-side bookmark moves are reflected '\xca\xa2\xa4eE\x1d\xd1\xfa\xcd\xa0\xf5\xb1#\x12\xc3UXA\x88\xa1' ] } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=43; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=43; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) - received frame(size=11; request=3; stream=2; streamflags=; type=command-response; flags=continuation) - received frame(size=3; request=3; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=11; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=3; request=3; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=3; stream=2; streamflags=; type=command-response; flags=eos) searching for changes all remote heads known locally @@ -610,8 +630,9 @@ Server-side bookmark moves are reflected ] ] } - received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) - received frame(size=144; request=1; stream=2; streamflags=; type=command-response; flags=continuation) + received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos) + received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) + received frame(size=144; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation) received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) checking for updated bookmarks updating bookmark book-1 diff --git a/tests/test-wireproto-serverreactor.py b/tests/test-wireproto-serverreactor.py --- a/tests/test-wireproto-serverreactor.py +++ b/tests/test-wireproto-serverreactor.py @@ -371,8 +371,9 @@ class ServerReactorTests(unittest.TestCa outstream, 1, [b'response']) self.assertaction(result, b'sendframes') self.assertframesequal(result[1][b'framegen'], [ - b'1 2 stream-begin command-response continuation %s' % OK, - b'1 2 0 command-response continuation cbor:b"response"', + b'1 2 stream-begin stream-settings eos cbor:b"identity"', + b'1 2 encoded command-response continuation %s' % OK, + b'1 2 encoded command-response continuation cbor:b"response"', b'1 2 0 command-response eos ', ]) @@ -390,10 +391,11 @@ class ServerReactorTests(unittest.TestCa outstream, 1, [first + second]) self.assertaction(result, b'sendframes') self.assertframesequal(result[1][b'framegen'], [ - b'1 2 stream-begin command-response continuation %s' % OK, - b'1 2 0 command-response continuation Y\x80d', - b'1 2 0 command-response continuation %s' % first, - b'1 2 0 command-response continuation %s' % second, + b'1 2 stream-begin stream-settings eos cbor:b"identity"', + b'1 2 encoded command-response continuation %s' % OK, + b'1 2 encoded command-response continuation Y\x80d', + b'1 2 encoded command-response continuation %s' % first, + b'1 2 encoded command-response continuation %s' % second, b'1 2 0 command-response eos ' ]) @@ -427,8 +429,9 @@ class ServerReactorTests(unittest.TestCa result = reactor.oninputeof() self.assertaction(result, b'sendframes') self.assertframesequal(result[1][b'framegen'], [ - b'1 2 stream-begin command-response continuation %s' % OK, - b'1 2 0 command-response continuation cbor:b"response"', + b'1 2 stream-begin stream-settings eos cbor:b"identity"', + b'1 2 encoded command-response continuation %s' % OK, + b'1 2 encoded command-response continuation cbor:b"response"', b'1 2 0 command-response eos ', ]) @@ -448,11 +451,12 @@ class ServerReactorTests(unittest.TestCa result = reactor.oninputeof() self.assertaction(result, b'sendframes') self.assertframesequal(result[1][b'framegen'], [ - b'1 2 stream-begin command-response continuation %s' % OK, - b'1 2 0 command-response continuation cbor:b"response1"', + b'1 2 stream-begin stream-settings eos cbor:b"identity"', + b'1 2 encoded command-response continuation %s' % OK, + b'1 2 encoded command-response continuation cbor:b"response1"', b'1 2 0 command-response eos ', - b'3 2 0 command-response continuation %s' % OK, - b'3 2 0 command-response continuation cbor:b"response2"', + b'3 2 encoded command-response continuation %s' % OK, + b'3 2 encoded command-response continuation cbor:b"response2"', b'3 2 0 command-response eos ', ]) @@ -472,14 +476,15 @@ class ServerReactorTests(unittest.TestCa result = reactor.oninputeof() self.assertaction(result, b'sendframes') self.assertframesequal(result[1][b'framegen'], [ - b'3 2 stream-begin command-response continuation %s' % OK, - b'3 2 0 command-response continuation cbor:b"response3"', + b'3 2 stream-begin stream-settings eos cbor:b"identity"', + b'3 2 encoded command-response continuation %s' % OK, + b'3 2 encoded command-response continuation cbor:b"response3"', b'3 2 0 command-response eos ', - b'1 2 0 command-response continuation %s' % OK, - b'1 2 0 command-response continuation cbor:b"response1"', + b'1 2 encoded command-response continuation %s' % OK, + b'1 2 encoded command-response continuation cbor:b"response1"', b'1 2 0 command-response eos ', - b'5 2 0 command-response continuation %s' % OK, - b'5 2 0 command-response continuation cbor:b"response5"', + b'5 2 encoded command-response continuation %s' % OK, + b'5 2 encoded command-response continuation cbor:b"response5"', b'5 2 0 command-response eos ', ])