summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Danjou <julien@danjou.info>2016-05-10 17:05:24 +0200
committerJulien Danjou <julien@danjou.info>2016-05-11 14:07:38 +0200
commitf553a614de3ea053b5dcec34d45e4ffdd6af9a08 (patch)
treeb9b1d2fe38a5480249ba4dc9c01e74c813246b45
parent6f1db02ef07137907977e7437d1e2df7619a429d (diff)
downloadoslo-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.py14
-rw-r--r--oslo_middleware/cors.py9
-rw-r--r--oslo_middleware/tests/test_base.py11
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)