diff options
Diffstat (limited to 'libbe/util/wsgi.py')
-rw-r--r-- | libbe/util/wsgi.py | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/libbe/util/wsgi.py b/libbe/util/wsgi.py index 41d625c..e649bac 100644 --- a/libbe/util/wsgi.py +++ b/libbe/util/wsgi.py @@ -38,6 +38,8 @@ except ImportError: import libbe.util.encoding import libbe.command import libbe.command.base +import libbe.storage + if libbe.TESTING == True: import copy @@ -264,6 +266,25 @@ class ExceptionApp (WSGI_Middleware): raise +class BEExceptionApp (WSGI_Middleware): + """Translate BE-specific exceptions + """ + def __init__(self, *args, **kwargs): + super(BEExceptionApp, self).__init__(*args, **kwargs) + self.http_user_error = 418 + + def _call(self, environ, start_response): + try: + return self.app(environ, start_response) + except libbe.storage.NotReadable as e: + raise libbe.util.wsgi.HandlerError(403, 'Read permission denied') + except libbe.storage.NotWriteable as e: + raise libbe.util.wsgi.HandlerError(403, 'Write permission denied') + except libbe.storage.InvalidID as e: + raise libbe.util.wsgi.HandlerError( + self.http_user_error, 'InvalidID {}'.format(e)) + + class UppercaseHeaderApp (WSGI_Middleware): """WSGI middleware that uppercases incoming HTTP headers. @@ -597,6 +618,7 @@ class ServerCommand (libbe.command.base.Command): 'socket-name':params['host'], 'port':params['port'], } + app = BEExceptionApp(app, logger=self.logger) app = ExceptionApp(app, logger=self.logger) if params['ssl'] == True: details['protocol'] = 'HTTPS' |