From 39c17cb13e005894c66daadc7317ff3d57fe2fd7 Mon Sep 17 00:00:00 2001 From: Doug Hellmann Date: Wed, 29 May 2013 19:49:29 -0400 Subject: Move wsgi module to deprecated package As we are planning to deprecate the wsgi module, move it out of the main openstack/common folder to the new "deprecated" folder. Move some of the middleware classes into the middleware package, since those are still useful and should be maintained. There's still work to do to remove the dependency of the size limit middleware on the Request class in the now deprecated wsgi module. Refer to the mailing list thread at http://lists.openstack.org/pipermail/openstack-dev/2013-May/009666.html for additional details. Change-Id: I05ff583ef37174835393905a3066390f400ffdcf Signed-off-by: Doug Hellmann --- openstack/common/middleware/base.py | 62 +++++++++++++++++++++++++++ openstack/common/middleware/context.py | 4 +- openstack/common/middleware/correlation_id.py | 4 +- openstack/common/middleware/debug.py | 60 ++++++++++++++++++++++++++ openstack/common/middleware/sizelimit.py | 5 ++- 5 files changed, 129 insertions(+), 6 deletions(-) create mode 100644 openstack/common/middleware/base.py create mode 100644 openstack/common/middleware/debug.py (limited to 'openstack/common/middleware') diff --git a/openstack/common/middleware/base.py b/openstack/common/middleware/base.py new file mode 100644 index 0000000..624a391 --- /dev/null +++ b/openstack/common/middleware/base.py @@ -0,0 +1,62 @@ +# Copyright 2011 OpenStack Foundation. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +"""Base class(es) for WSGI Middleware.""" + +import webob.dec + + +class Middleware(object): + """ + Base WSGI middleware wrapper. These classes require an application to be + initialized that will be called next. By default the middleware will + simply call its wrapped app, or you can override __call__ to customize its + behavior. + """ + + @classmethod + def factory(cls, global_conf, **local_conf): + """ + Factory method for paste.deploy + """ + + def filter(app): + return cls(app) + + return filter + + def __init__(self, application): + self.application = application + + def process_request(self, req): + """ + Called on each request. + + If this returns None, the next application down the stack will be + executed. If it returns a response then that response will be returned + and execution will stop here. + """ + return None + + def process_response(self, response): + """Do whatever you'd like to the response.""" + return response + + @webob.dec.wsgify + def __call__(self, req): + response = self.process_request(req) + if response: + return response + response = req.get_response(self.application) + return self.process_response(response) diff --git a/openstack/common/middleware/context.py b/openstack/common/middleware/context.py index ac94190..2636e8e 100644 --- a/openstack/common/middleware/context.py +++ b/openstack/common/middleware/context.py @@ -21,10 +21,10 @@ Middleware that attaches a context to the WSGI request from openstack.common import context from openstack.common import importutils -from openstack.common import wsgi +from openstack.common.middleware import base -class ContextMiddleware(wsgi.Middleware): +class ContextMiddleware(base.Middleware): def __init__(self, app, options): self.options = options super(ContextMiddleware, self).__init__(app) diff --git a/openstack/common/middleware/correlation_id.py b/openstack/common/middleware/correlation_id.py index a3efe34..bffa0d7 100644 --- a/openstack/common/middleware/correlation_id.py +++ b/openstack/common/middleware/correlation_id.py @@ -17,11 +17,11 @@ """Middleware that attaches a correlation id to WSGI request""" +from openstack.common.middleware import base from openstack.common import uuidutils -from openstack.common import wsgi -class CorrelationIdMiddleware(wsgi.Middleware): +class CorrelationIdMiddleware(base.Middleware): def process_request(self, req): correlation_id = (req.headers.get("X_CORRELATION_ID") or diff --git a/openstack/common/middleware/debug.py b/openstack/common/middleware/debug.py new file mode 100644 index 0000000..b92af11 --- /dev/null +++ b/openstack/common/middleware/debug.py @@ -0,0 +1,60 @@ +# Copyright 2011 OpenStack Foundation. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +"""Debug middleware""" + +from __future__ import print_function + +import sys + +import webob.dec + +from openstack.common.middleware import base + + +class Debug(base.Middleware): + """ + Helper class that can be inserted into any WSGI application chain + to get information about the request and response. + """ + + @webob.dec.wsgify + def __call__(self, req): + print(("*" * 40) + " REQUEST ENVIRON") + for key, value in req.environ.items(): + print(key, "=", value) + print() + resp = req.get_response(self.application) + + print(("*" * 40) + " RESPONSE HEADERS") + for (key, value) in resp.headers.iteritems(): + print(key, "=", value) + print() + + resp.app_iter = self.print_generator(resp.app_iter) + + return resp + + @staticmethod + def print_generator(app_iter): + """ + Iterator that prints the contents of a wrapper string iterator + when iterated. + """ + print(("*" * 40) + " BODY") + for part in app_iter: + sys.stdout.write(part) + sys.stdout.flush() + yield part + print() diff --git a/openstack/common/middleware/sizelimit.py b/openstack/common/middleware/sizelimit.py index 45de527..1128b8a 100644 --- a/openstack/common/middleware/sizelimit.py +++ b/openstack/common/middleware/sizelimit.py @@ -22,8 +22,9 @@ from oslo.config import cfg import webob.dec import webob.exc +from openstack.common.deprecated import wsgi from openstack.common.gettextutils import _ -from openstack.common import wsgi +from openstack.common.middleware import base #default request size is 112k @@ -66,7 +67,7 @@ class LimitingReader(object): return result -class RequestBodySizeLimiter(wsgi.Middleware): +class RequestBodySizeLimiter(base.Middleware): """Limit the size of incoming requests.""" def __init__(self, *args, **kwargs): -- cgit