diff --git a/mercurial/wireproto.py b/mercurial/wireproto.py --- a/mercurial/wireproto.py +++ b/mercurial/wireproto.py @@ -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. diff --git a/mercurial/wireprotoserver.py b/mercurial/wireprotoserver.py --- a/mercurial/wireprotoserver.py +++ b/mercurial/wireprotoserver.py @@ -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.""" diff --git a/mercurial/wireprototypes.py b/mercurial/wireprototypes.py --- a/mercurial/wireprototypes.py +++ b/mercurial/wireprototypes.py @@ -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. + """