Patchwork [03,of,11] httppeer: do decompression inside _callstream

mail settings
Submitter Gregory Szorc
Date Nov. 20, 2016, 10:23 p.m.
Message ID <0bef0b8fb9f44ed8568d.1479680620@ubuntu-vm-main>
Download mbox | patch
Permalink /patch/17654/
State Accepted
Headers show


Gregory Szorc - Nov. 20, 2016, 10:23 p.m.
# HG changeset patch
# User Gregory Szorc <>
# Date 1479609100 28800
#      Sat Nov 19 18:31:40 2016 -0800
# Node ID 0bef0b8fb9f44ed8568df6cfeabf162aa12b211e
# Parent  5a19e48cea056be5ece370744f3ee40bfb5d7c7e
httppeer: do decompression inside _callstream

The current HTTP transport protocol only compresses certain command
responses and requires calls to that command to call
"_callcompressable," which zlib decompresses the response

Upcoming changes will enable *any* response to be compressed with
varying compression formats. In order to handle this better, this
commit moves the decompression bits to the main function performing
the HTTP request. We introduce an underscore-prefixed argument to
denote this behavior so it doesn't conflict with a named argument
to a command.


diff --git a/mercurial/ b/mercurial/
--- a/mercurial/
+++ b/mercurial/
@@ -90,7 +90,7 @@  class httppeer(wireproto.wirepeer):
     def lock(self):
         raise error.Abort(_('operation not supported over http'))
-    def _callstream(self, cmd, **args):
+    def _callstream(self, cmd, _compressible=False, **args):
         if cmd == 'pushkey':
             args['data'] = ''
         data = args.pop('data', None)
@@ -201,6 +201,9 @@  class httppeer(wireproto.wirepeer):
                 raise error.RepoError(_("'%s' uses newer protocol %s") %
                                       (safeurl, version))
+        if _compressible:
+            return util.chunkbuffer(zgenerator(resp))
         return resp
     def _call(self, cmd, **args):
@@ -271,8 +274,7 @@  class httppeer(wireproto.wirepeer):
     def _callcompressable(self, cmd, **args):
-        stream = self._callstream(cmd, **args)
-        return util.chunkbuffer(zgenerator(stream))
+        return self._callstream(cmd, _compressible=True, **args)
     def _abort(self, exception):
         raise exception