Mercurial > hg
changeset 37783:9d818539abfa
wireproto: move supportedcompengines out of wireproto
This function is used by both version 1 and version 2. It belongs in
a common module.
"wireprototypes" may not be the best module name. I may rename it...
Differential Revision: https://phab.mercurial-scm.org/D3398
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Mon, 16 Apr 2018 22:08:13 -0700 |
parents | 99accae4cc59 |
children | ee0d5e9d77b2 |
files | mercurial/wireproto.py mercurial/wireprotoserver.py mercurial/wireprototypes.py mercurial/wireprotov2server.py |
diffstat | 4 files changed, 58 insertions(+), 52 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/wireproto.py Mon Apr 16 22:00:52 2018 -0700 +++ b/mercurial/wireproto.py Mon Apr 16 22:08:13 2018 -0700 @@ -114,55 +114,6 @@ return ui.configbool('server', 'bundle1') -def supportedcompengines(ui, role): - """Obtain the list of supported compression engines for a request.""" - assert role in (util.CLIENTROLE, util.SERVERROLE) - - compengines = util.compengines.supportedwireengines(role) - - # Allow config to override default list and ordering. - if role == util.SERVERROLE: - configengines = ui.configlist('server', 'compressionengines') - config = 'server.compressionengines' - else: - # This is currently implemented mainly to facilitate testing. In most - # cases, the server should be in charge of choosing a compression engine - # because a server has the most to lose from a sub-optimal choice. (e.g. - # CPU DoS due to an expensive engine or a network DoS due to poor - # compression ratio). - configengines = ui.configlist('experimental', - 'clientcompressionengines') - config = 'experimental.clientcompressionengines' - - # No explicit config. Filter out the ones that aren't supposed to be - # advertised and return default ordering. - if not configengines: - attr = 'serverpriority' if role == util.SERVERROLE else 'clientpriority' - return [e for e in compengines - if getattr(e.wireprotosupport(), attr) > 0] - - # If compression engines are listed in the config, assume there is a good - # reason for it (like server operators wanting to achieve specific - # performance characteristics). So fail fast if the config references - # unusable compression engines. - validnames = set(e.name() for e in compengines) - invalidnames = set(e for e in configengines if e not in validnames) - if invalidnames: - raise error.Abort(_('invalid compression engine defined in %s: %s') % - (config, ', '.join(sorted(invalidnames)))) - - compengines = [e for e in compengines if e.name() in configengines] - compengines = sorted(compengines, - key=lambda e: configengines.index(e.name())) - - if not compengines: - raise error.Abort(_('%s config option does not specify any known ' - 'compression engines') % config, - hint=_('usable compression engines: %s') % - ', '.sorted(validnames)) - - return compengines - # For version 1 transports. commands = wireprototypes.commanddict()
--- a/mercurial/wireprotoserver.py Mon Apr 16 22:00:52 2018 -0700 +++ b/mercurial/wireprotoserver.py Mon Apr 16 22:08:13 2018 -0700 @@ -149,7 +149,8 @@ # 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) + compengines = wireprototypes.supportedcompengines(repo.ui, + util.SERVERROLE) if compengines: comptypes = ','.join(urlreq.quote(e.wireprotosupport().name) for e in compengines) @@ -329,7 +330,7 @@ # Now find an agreed upon compression format. compformats = wireproto.clientcompressionsupport(proto) - for engine in wireproto.supportedcompengines(ui, util.SERVERROLE): + for engine in wireprototypes.supportedcompengines(ui, util.SERVERROLE): if engine.wireprotosupport().name in compformats: opts = {} level = ui.configint('server', '%slevel' % engine.name())
--- a/mercurial/wireprototypes.py Mon Apr 16 22:00:52 2018 -0700 +++ b/mercurial/wireprototypes.py Mon Apr 16 22:08:13 2018 -0700 @@ -12,6 +12,11 @@ from .thirdparty.zope import ( interface as zi, ) +from .i18n import _ +from . import ( + error, + util, +) # Names of the SSH protocol implementations. SSHV1 = 'ssh-v1' @@ -319,3 +324,52 @@ return False return True + +def supportedcompengines(ui, role): + """Obtain the list of supported compression engines for a request.""" + assert role in (util.CLIENTROLE, util.SERVERROLE) + + compengines = util.compengines.supportedwireengines(role) + + # Allow config to override default list and ordering. + if role == util.SERVERROLE: + configengines = ui.configlist('server', 'compressionengines') + config = 'server.compressionengines' + else: + # This is currently implemented mainly to facilitate testing. In most + # cases, the server should be in charge of choosing a compression engine + # because a server has the most to lose from a sub-optimal choice. (e.g. + # CPU DoS due to an expensive engine or a network DoS due to poor + # compression ratio). + configengines = ui.configlist('experimental', + 'clientcompressionengines') + config = 'experimental.clientcompressionengines' + + # No explicit config. Filter out the ones that aren't supposed to be + # advertised and return default ordering. + if not configengines: + attr = 'serverpriority' if role == util.SERVERROLE else 'clientpriority' + return [e for e in compengines + if getattr(e.wireprotosupport(), attr) > 0] + + # If compression engines are listed in the config, assume there is a good + # reason for it (like server operators wanting to achieve specific + # performance characteristics). So fail fast if the config references + # unusable compression engines. + validnames = set(e.name() for e in compengines) + invalidnames = set(e for e in configengines if e not in validnames) + if invalidnames: + raise error.Abort(_('invalid compression engine defined in %s: %s') % + (config, ', '.join(sorted(invalidnames)))) + + compengines = [e for e in compengines if e.name() in configengines] + compengines = sorted(compengines, + key=lambda e: configengines.index(e.name())) + + if not compengines: + raise error.Abort(_('%s config option does not specify any known ' + 'compression engines') % config, + hint=_('usable compression engines: %s') % + ', '.sorted(validnames)) + + return compengines
--- a/mercurial/wireprotov2server.py Mon Apr 16 22:00:52 2018 -0700 +++ b/mercurial/wireprotov2server.py Mon Apr 16 22:08:13 2018 -0700 @@ -393,7 +393,7 @@ transports. """ compression = [] - for engine in wireproto.supportedcompengines(repo.ui, util.SERVERROLE): + for engine in wireprototypes.supportedcompengines(repo.ui, util.SERVERROLE): compression.append({ b'name': engine.wireprotosupport().name, })