util:wsgi: add BEExceptionApp for translating storage exceptions.
authorW. Trevor King <wking@tremily.us>
Wed, 29 Aug 2012 20:24:03 +0000 (16:24 -0400)
committerW. Trevor King <wking@tremily.us>
Thu, 30 Aug 2012 03:29:56 +0000 (23:29 -0400)
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.

libbe/command/serve.py
libbe/storage/http.py
libbe/util/wsgi.py

index d1c7b9a6b3534da3232cad1eab2085e2bddd377e..28a8a81b371af21aa46b00b64c268043f2223a3b 100644 (file)
@@ -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.
index 511e63fe9081a5f547dece7a39046be2196bd4bf..5fe0dfcad5f6c20ff20f75daa0ddb0d98c15edca 100644 (file)
@@ -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
index 41d625c71cd8036d7b56fa0fc488eed5d5e44344..e649bac430f64451a08274172e842bdc262b3c8c 100644 (file)
@@ -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'