Mercurial > hg-stable
changeset 36642:6e585bca962e
wireproto: add transport specific capabilities in the transport
We add a method to the protocol handler interface that allows
specific implementations to add their own capabilities.
The SSH implementation is a no-op.
The HTTP implementation adds the HTTP-specific capabilities.
The end result is transport specific capabilities now live in the
transport code instead of in some generic function in the wireproto
module.
Differential Revision: https://phab.mercurial-scm.org/D2512
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Tue, 27 Feb 2018 16:24:02 -0800 |
parents | e89959970a08 |
children | 1fa02265fae2 |
files | mercurial/wireproto.py mercurial/wireprotoserver.py mercurial/wireprototypes.py |
diffstat | 3 files changed, 31 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/wireproto.py Tue Feb 27 15:23:04 2018 -0800 +++ b/mercurial/wireproto.py Tue Feb 27 16:24:02 2018 -0800 @@ -819,23 +819,7 @@ caps.append('bundle2=' + urlreq.quote(capsblob)) caps.append('unbundle=%s' % ','.join(bundle2.bundlepriority)) - if proto.name == 'http-v1': - caps.append('httpheader=%d' % - repo.ui.configint('server', 'maxhttpheaderlen')) - if repo.ui.configbool('experimental', 'httppostargs'): - caps.append('httppostargs') - - # FUTURE advertise 0.2rx once support is implemented - # FUTURE advertise minrx and mintx after consulting config option - caps.append('httpmediatype=0.1rx,0.1tx,0.2tx') - - compengines = supportedcompengines(repo.ui, util.SERVERROLE) - if compengines: - comptypes = ','.join(urlreq.quote(e.wireprotosupport().name) - for e in compengines) - caps.append('compression=%s' % comptypes) - - return caps + return proto.addcapabilities(repo, caps) # If you are writing an extension and consider wrapping this function. Wrap # `_capabilities` instead.
--- a/mercurial/wireprotoserver.py Tue Feb 27 15:23:04 2018 -0800 +++ b/mercurial/wireprotoserver.py Tue Feb 27 16:24:02 2018 -0800 @@ -121,6 +121,24 @@ urlreq.quote(self._req.env.get('REMOTE_HOST', '')), urlreq.quote(self._req.env.get('REMOTE_USER', ''))) + def addcapabilities(self, repo, caps): + caps.append('httpheader=%d' % + repo.ui.configint('server', 'maxhttpheaderlen')) + if repo.ui.configbool('experimental', 'httppostargs'): + caps.append('httppostargs') + + # FUTURE advertise 0.2rx once support is implemented + # FUTURE advertise minrx and mintx after consulting config option + caps.append('httpmediatype=0.1rx,0.1tx,0.2tx') + + compengines = wireproto.supportedcompengines(repo.ui, util.SERVERROLE) + if compengines: + comptypes = ','.join(urlreq.quote(e.wireprotosupport().name) + for e in compengines) + caps.append('compression=%s' % comptypes) + + return caps + # This method exists mostly so that extensions like remotefilelog can # disable a kludgey legacy method only over http. As of early 2018, # there are no other known users, so with any luck we can discard this @@ -368,6 +386,9 @@ client = encoding.environ.get('SSH_CLIENT', '').split(' ', 1)[0] return 'remote:ssh:' + client + def addcapabilities(self, repo, caps): + return caps + class sshv2protocolhandler(sshv1protocolhandler): """Protocol handler for version 2 of the SSH protocol."""
--- a/mercurial/wireprototypes.py Tue Feb 27 15:23:04 2018 -0800 +++ b/mercurial/wireprototypes.py Tue Feb 27 16:24:02 2018 -0800 @@ -137,3 +137,12 @@ @abc.abstractmethod def client(self): """Returns a string representation of this client (as bytes).""" + + @abc.abstractmethod + def addcapabilities(self, repo, caps): + """Adds advertised capabilities specific to this protocol. + + Receives the list of capabilities collected so far. + + Returns a list of capabilities. The passed in argument can be returned. + """