diff -r f5a05bb48116 -r ed919b90acda mercurial/wireprotoframing.py --- a/mercurial/wireprotoframing.py Wed Sep 26 15:53:49 2018 -0700 +++ b/mercurial/wireprotoframing.py Wed Sep 26 17:16:27 2018 -0700 @@ -22,6 +22,7 @@ encoding, error, util, + wireprototypes, ) from .utils import ( cborutil, @@ -840,10 +841,22 @@ yield createcommandresponseokframe(stream, requestid) emitted = True - for chunk in cborutil.streamencode(o): - for frame in emitter.send(chunk): + # Objects emitted by command functions can be serializable + # data structures or special types. + # TODO consider extracting the content normalization to a + # standalone function, as it may be useful for e.g. cachers. + + # A pre-encoded object is sent directly to the emitter. + if isinstance(o, wireprototypes.encodedresponse): + for frame in emitter.send(o.data): yield frame + # A regular object is CBOR encoded. + else: + for chunk in cborutil.streamencode(o): + for frame in emitter.send(chunk): + yield frame + except Exception as e: for frame in createerrorframe(stream, requestid, '%s' % e,