--- 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,