diff --git a/salt/netapi/rest_cherrypy/app.py b/salt/netapi/rest_cherrypy/app.py index 7c5749ffa5..1993818898 100644 --- a/salt/netapi/rest_cherrypy/app.py +++ b/salt/netapi/rest_cherrypy/app.py @@ -102,6 +102,13 @@ A REST API for Salt expire_responses : True Whether to check for and kill HTTP responses that have exceeded the default timeout. + + .. deprecated:: 2016.11.9, 2017.7.3, Oxygen + + The "expire_responses" configuration setting, which corresponds + to the ``timeout_monitor`` setting in CherryPy, is no longer + supported in CherryPy versions >= 12.0.0. + max_request_body_size : ``1048576`` Maximum size for the HTTP request body. collect_stats : False @@ -606,8 +613,10 @@ import yaml # Import Salt libs import salt import salt.auth +import salt.exceptions import salt.utils.event import salt.utils.stringutils +import salt.utils.versions from salt.ext import six # Import salt-api libs @@ -854,11 +863,18 @@ def hypermedia_handler(*args, **kwargs): except (salt.exceptions.SaltDaemonNotRunning, salt.exceptions.SaltReqTimeoutError) as exc: raise cherrypy.HTTPError(503, exc.strerror) - except (cherrypy.TimeoutError, salt.exceptions.SaltClientTimeout): + except salt.exceptions.SaltClientTimeout: raise cherrypy.HTTPError(504) except cherrypy.CherryPyException: raise except Exception as exc: + # The TimeoutError exception class was removed in CherryPy in 12.0.0, but + # Still check existence of TimeoutError and handle in CherryPy < 12. + # The check was moved down from the SaltClientTimeout error line because + # A one-line if statement throws a BaseException inheritance TypeError. + if hasattr(cherrypy, 'TimeoutError') and isinstance(exc, cherrypy.TimeoutError): + raise cherrypy.HTTPError(504) + import traceback logger.debug("Error while processing request for: %s", @@ -2839,8 +2855,6 @@ class API(object): 'server.socket_port': self.apiopts.get('port', 8000), 'server.thread_pool': self.apiopts.get('thread_pool', 100), 'server.socket_queue_size': self.apiopts.get('queue_size', 30), - 'engine.timeout_monitor.on': self.apiopts.get( - 'expire_responses', True), 'max_request_body_size': self.apiopts.get( 'max_request_body_size', 1048576), 'debug': self.apiopts.get('debug', False), @@ -2858,6 +2872,14 @@ class API(object): }, } + if salt.utils.versions.version_cmp(cherrypy.__version__, '12.0.0') < 0: + # CherryPy >= 12.0 no longer supports "timeout_monitor", only set + # this config option when using an older version of CherryPy. + # See Issue #44601 for more information. + conf['global']['engine.timeout_monitor.on'] = self.apiopts.get( + 'expire_responses', True + ) + if cpstats and self.apiopts.get('collect_stats', False): conf['/']['tools.cpstats.on'] = True