diff options
author | W. Trevor King <wking@tremily.us> | 2012-08-29 16:24:03 -0400 |
---|---|---|
committer | W. Trevor King <wking@tremily.us> | 2012-08-29 23:29:56 -0400 |
commit | 5a32d82284e54facf2f5dcb03ba37afe3805a609 (patch) | |
tree | 3252239fcf095bfdf89708fce55cd359b7d9ca52 /libbe | |
parent | 2950a115fb106ae73b87f87dc4865156d9311f8e (diff) | |
download | bugseverywhere-5a32d82284e54facf2f5dcb03ba37afe3805a609.tar.gz |
util:wsgi: add BEExceptionApp for translating storage exceptions.
This fixes .test_get_initial_value for the HTTP backend, because the
tests use TestingHTTP.getURL, which only catch HandlerError, not the
more specific storage exceptions.
Diffstat (limited to 'libbe')
-rw-r--r-- | libbe/command/serve.py | 10 | ||||
-rw-r--r-- | libbe/storage/http.py | 4 | ||||
-rw-r--r-- | libbe/util/wsgi.py | 22 |
3 files changed, 25 insertions, 11 deletions
diff --git a/libbe/command/serve.py b/libbe/command/serve.py index d1c7b9a..28a8a81 100644 --- a/libbe/command/serve.py +++ b/libbe/command/serve.py @@ -50,16 +50,6 @@ if libbe.TESTING: import libbe.util.wsgi -# return callback(environ, start_response) -# except libbe.storage.NotReadable, e: -# raise libbe.util.wsgi.HandlerError(403, 'Read permission denied') -# except libbe.storage.NotWriteable, e: -# raise libbe.util.wsgi.HandlerError(403, 'Write permission denied') -# except libbe.storage.InvalidID, e: -# raise libbe.util.wsgi.HandlerError( -# self.http_user_error, 'InvalidID %s' % e) - - class ServerApp (libbe.util.wsgi.WSGI_AppObject, libbe.util.wsgi.WSGI_DataObject): """WSGI server for a BE Storage instance over HTTP. diff --git a/libbe/storage/http.py b/libbe/storage/http.py index 511e63f..5fe0dfc 100644 --- a/libbe/storage/http.py +++ b/libbe/storage/http.py @@ -46,6 +46,7 @@ if TESTING == True: import libbe.bugdir import libbe.command.serve import libbe.util.http + import libbe.util.wsgi class HTTP (base.VersionedStorage): @@ -264,8 +265,9 @@ if TESTING == True: name = 'TestingHTTP' def __init__(self, repo, *args, **kwargs): self._storage_backend = base.VersionedStorage(repo) - self.app = libbe.command.serve.ServerApp( + app = libbe.command.serve.ServerApp( storage=self._storage_backend) + self.app = libbe.util.wsgi.BEExceptionApp(app=app) HTTP.__init__(self, repo='http://localhost:8000/', *args, **kwargs) self.intitialized = False # duplicated from libbe.command.serve.WSGITestCase 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' |