Add an exception for unsupported middleware wrapping for better failure

handling.
This commit is contained in:
Nate Coraor
2017-03-20 10:56:44 -04:00
parent 131aeb66b4
commit d18b4d13cb
4 changed files with 76 additions and 38 deletions
+15 -8
View File
@@ -19,7 +19,12 @@ import galaxy.model.mapping
import galaxy.datatypes.registry
import galaxy.web.framework
import galaxy.web.framework.webapp
from galaxy.webapps.util import build_template_error_formatters, wrap_if_allowed
from galaxy.webapps.util import (
MiddlewareWrapUnsupported,
build_template_error_formatters,
wrap_if_allowed,
wrap_if_allowed_or_fail
)
from galaxy import util
from galaxy.util import asbool
from galaxy.util.properties import load_app_properties
@@ -912,13 +917,15 @@ def wrap_in_middleware( app, global_conf, application_stack, **local_conf ):
# Interactive exception debugging, scary dangerous if publicly
# accessible, if not enabled we'll use the regular error printing
# middleware.
from weberror import evalexception
import galaxy.web.framework.middleware.error
app = wrap_if_allowed( app, stack, evalexception.EvalException,
args=(conf,),
kwargs=dict(templating_formatters=build_template_error_formatters()),
alt_wrap=galaxy.web.framework.middleware.error.ErrorMiddleware,
alt_args=(conf,) )
try:
from weberror import evalexception
app = wrap_if_allowed_or_fail( app, stack, evalexception.EvalException,
args=(conf,),
kwargs=dict(templating_formatters=build_template_error_formatters()) )
except MiddlewareWrapUnsupported as exc:
log.warning(str(exc))
import galaxy.web.framework.middleware.error
app = wrap_if_allowed( app, stack, galaxy.web.framework.middleware.error.ErrorMiddleware, args=(conf,) )
else:
# Not in interactive debug mode, just use the regular error middleware
import galaxy.web.framework.middleware.error
+15 -9
View File
@@ -11,8 +11,12 @@ from inspect import isclass
from paste import httpexceptions
from galaxy.util import asbool
from galaxy.webapps.util import build_template_error_formatters, wrap_if_allowed
from galaxy.webapps.util import (
MiddlewareWrapUnsupported,
build_template_error_formatters,
wrap_if_allowed,
wrap_if_allowed_or_fail
)
import galaxy.model
import galaxy.model.mapping
import galaxy.web.framework.webapp
@@ -119,13 +123,15 @@ def wrap_in_middleware( app, global_conf, application_stack, **local_conf ):
# Interactive exception debugging, scary dangerous if publicly
# accessible, if not enabled we'll use the regular error printing
# middleware.
from weberror import evalexception
import galaxy.web.framework.middleware.error
app = wrap_if_allowed( app, stack, evalexception.EvalException,
args=(conf,),
kwargs=dict(templating_formatters=build_template_error_formatters()),
alt_wrap=galaxy.web.framework.middleware.error.ErrorMiddleware,
alt_args=(conf,) )
try:
from weberror import evalexception
app = wrap_if_allowed_or_fail( app, stack, evalexception.EvalException,
args=(conf,),
kwargs=dict(templating_formatters=build_template_error_formatters()) )
except MiddlewareWrapUnsupported as exc:
log.warning(str(exc))
import galaxy.web.framework.middleware.error
app = wrap_if_allowed( app, stack, galaxy.web.framework.middleware.error.ErrorMiddleware, args=(conf,) )
else:
# Not in interactive debug mode, just use the regular error middleware
import galaxy.web.framework.middleware.error
+16 -8
View File
@@ -14,7 +14,12 @@ from galaxy.util import asbool
import galaxy.webapps.tool_shed.model
import galaxy.webapps.tool_shed.model.mapping
import galaxy.web.framework.webapp
from galaxy.webapps.util import build_template_error_formatters, wrap_if_allowed
from galaxy.webapps.util import (
MiddlewareWrapUnsupported,
build_template_error_formatters,
wrap_if_allowed,
wrap_if_allowed_or_fail
)
from galaxy import util
from galaxy.util.properties import load_app_properties
from routes.middleware import RoutesMiddleware
@@ -237,13 +242,16 @@ def wrap_in_middleware( app, global_conf, application_stack, **local_conf ):
# Interactive exception debugging, scary dangerous if publicly
# accessible, if not enabled we'll use the regular error printing
# middleware.
from weberror import evalexception
import galaxy.web.framework.middleware.error
app = wrap_if_allowed( app, stack, evalexception.EvalException,
args=(conf,),
kwargs=dict(templating_formatters=build_template_error_formatters()),
alt_wrap=galaxy.web.framework.middleware.error.ErrorMiddleware,
alt_args=(conf,) )
try:
from weberror import evalexception
app = wrap_if_allowed_or_fail( app, stack, evalexception.EvalException,
args=(conf,),
kwargs=dict(templating_formatters=build_template_error_formatters()) )
except MiddlewareWrapUnsupported as exc:
log.warning(str(exc))
import galaxy.web.framework.middleware.error
app = wrap_if_allowed( app, stack, galaxy.web.framework.middleware.error.ErrorMiddleware, args=(conf,) )
else:
# Not in interactive debug mode, just use the regular error middleware
import galaxy.web.framework.middleware.error
+30 -13
View File
@@ -8,6 +8,10 @@ import mako.exceptions
log = logging.getLogger(__name__)
class MiddlewareWrapUnsupported(Exception):
pass
def build_template_error_formatters():
"""
Build a list of template error formatters for WebError. When an error
@@ -26,8 +30,26 @@ def build_template_error_formatters():
return formatters
def wrap_if_allowed(app, stack, wrap, name=None, args=None, kwargs=None,
alt_wrap=None, alt_name=None, alt_args=None, alt_kwargs=None):
def wrap_if_allowed_or_fail(app, stack, wrap, name=None, args=None, kwargs=None):
"""
Wrap the application with the given method if the application stack allows for it.
Arguments are the same as for :func:`wrap_if_allowed`.
Raises :exception:`MiddlewareWrapUnsupported` if the stack does not allow the middleware.
"""
name = name or wrap.__name__
if not stack.allowed_middleware(wrap):
raise MiddlewareWrapUnsupported(
"'%s' is enabled in your configuration but the %s application stack does not support it, this "
"middleware has been disabled" % (name, stack.name))
args = args or []
kwargs = kwargs or {}
log.debug("Enabling '%s' middleware", name)
return wrap(app, *args, **kwargs)
def wrap_if_allowed(app, stack, wrap, name=None, args=None, kwargs=None):
"""
Wrap the application with the given method if the application stack allows for it.
@@ -43,16 +65,11 @@ def wrap_if_allowed(app, stack, wrap, name=None, args=None, kwargs=None,
:param args: arguments to pass to `wrap` (not including `app` itself)
:type kwargs: dict
:param kwargs: keyword arguments to pass to `wrap`
Returns `app` unmodified if the stack does not allow the middleware.
"""
name = name or wrap.__name__
if stack.allowed_middleware(wrap):
args = args or []
kwargs = kwargs or {}
log.debug("Enabling '%s' middleware", name)
return wrap(app, *args, **kwargs)
else:
log.warning("'%s' is enabled in your configuration but the %s application stack does not support it, this "
"middleware has been disabled", name, stack.name)
if alt_wrap:
app = wrap_if_allowed(app, stack, alt_wrap, name=alt_name, args=alt_args, kwargs=alt_kwargs)
try:
return wrap_if_allowed_or_fail(app, stack, wrap, name=name, args=args, kwargs=kwargs)
except MiddlewareWrapUnsupported as exc:
log.warning(str(exc))
return app