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
transparently.
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.
--- a/mercurial/httppeer.py Sat Nov 19 17:11:12 2016 -0800
+++ b/mercurial/httppeer.py Sat Nov 19 18:31:40 2016 -0800
@@ -90,7 +90,7 @@
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 @@
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 @@
os.unlink(filename)
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