diff options
author | Julien Danjou <julien@danjou.info> | 2016-05-10 17:05:24 +0200 |
---|---|---|
committer | Julien Danjou <julien@danjou.info> | 2016-05-11 14:07:38 +0200 |
commit | f553a614de3ea053b5dcec34d45e4ffdd6af9a08 (patch) | |
tree | b9b1d2fe38a5480249ba4dc9c01e74c813246b45 | |
parent | 6f1db02ef07137907977e7437d1e2df7619a429d (diff) | |
download | oslo-middleware-f553a614de3ea053b5dcec34d45e4ffdd6af9a08.tar.gz |
Do not add a default content type when replying
WebOb includes a default content_type, and that's incorrect for status
code such as 304. This fixes that by generalizing the previous fix we
introduced for the CORS middleware.
Change-Id: I57c47ee5627b17a4e266b9ac4bc038dfccb35012
-rw-r--r-- | oslo_middleware/base.py | 14 | ||||
-rw-r--r-- | oslo_middleware/cors.py | 9 | ||||
-rw-r--r-- | oslo_middleware/tests/test_base.py | 11 |
3 files changed, 26 insertions, 8 deletions
diff --git a/oslo_middleware/base.py b/oslo_middleware/base.py index a98a058..27689a1 100644 --- a/oslo_middleware/base.py +++ b/oslo_middleware/base.py @@ -17,10 +17,22 @@ from inspect import getargspec import webob.dec +import webob.request +import webob.response from oslo_config import cfg +class NoContentTypeResponse(webob.response.Response): + + default_content_type = None # prevents webob assigning content type + + +class NoContentTypeRequest(webob.request.Request): + + ResponseClass = NoContentTypeResponse + + class ConfigurableMiddleware(object): """Base WSGI middleware wrapper. @@ -106,7 +118,7 @@ class ConfigurableMiddleware(object): """Do whatever you'd like to the response.""" return response - @webob.dec.wsgify + @webob.dec.wsgify(RequestClass=NoContentTypeRequest) def __call__(self, req): response = self.process_request(req) if response: diff --git a/oslo_middleware/cors.py b/oslo_middleware/cors.py index 8863b62..90d0a89 100644 --- a/oslo_middleware/cors.py +++ b/oslo_middleware/cors.py @@ -20,7 +20,7 @@ from oslo_config import cfg from oslo_middleware import base import six import webob.exc -import webob.response + LOG = logging.getLogger(__name__) @@ -98,11 +98,6 @@ class InvalidOriginError(Exception): 'CORS request from origin \'%s\' not permitted.' % origin) -class _NoContentTypeResponse(webob.response.Response): - - default_content_type = None # prevents webob assigning content type - - class CORS(base.ConfigurableMiddleware): """CORS Middleware. @@ -325,7 +320,7 @@ class CORS(base.ConfigurableMiddleware): # underlying middleware's response content needs to be persisted. # Otherwise, create a new response. if 200 > response.status_code or response.status_code >= 300: - response = _NoContentTypeResponse(status=webob.exc.HTTPOk.code) + response = base.NoContentTypeResponse(status=webob.exc.HTTPOk.code) # Does the request have an origin header? (Section 6.2.1) if 'Origin' not in request.headers: diff --git a/oslo_middleware/tests/test_base.py b/oslo_middleware/tests/test_base.py index ad48da5..425ff9a 100644 --- a/oslo_middleware/tests/test_base.py +++ b/oslo_middleware/tests/test_base.py @@ -58,6 +58,17 @@ class TestBase(BaseTestCase): self.assertTrue(self.application.called_without_request) + def test_no_content_type_added(self): + class TestMiddleware(Middleware): + @staticmethod + def process_request(req): + return "foobar" + + m = TestMiddleware(None) + request = webob.Request({}, method='GET') + response = request.get_response(m) + self.assertNotIn('Content-Type', response.headers) + def test_paste_deploy_legacy(self): app = LegacyMiddlewareTest.factory( {'global': True}, local=True)(application) |