Ensure that headers are returned as strings, not integers.
The 'Retry-After' header was set as an integer, and it was causing that mod_wsgi failed with a 500 error, instead of the actual error. This ensures that the headers are converted to str. Fixes bug 1155585 Change-Id: If1b1de2308ccdc6f0588c8df5dc896fe5f767dbe
This commit is contained in:
@@ -588,7 +588,7 @@ class ResponseObject(object):
|
||||
response = webob.Response()
|
||||
response.status_int = self.code
|
||||
for hdr, value in self._headers.items():
|
||||
response.headers[hdr] = value
|
||||
response.headers[hdr] = str(value)
|
||||
response.headers['Content-Type'] = content_type
|
||||
if self.obj is not None:
|
||||
response.body = serializer.serialize(self.obj)
|
||||
@@ -1150,6 +1150,8 @@ class Fault(webob.exc.HTTPException):
|
||||
def __init__(self, exception):
|
||||
"""Create a Fault for the given webob.exc.exception."""
|
||||
self.wrapped_exc = exception
|
||||
for key, value in self.wrapped_exc.headers.items():
|
||||
self.wrapped_exc.headers[key] = str(value)
|
||||
self.status_int = exception.status_int
|
||||
|
||||
@webob.dec.wsgify(RequestClass=Request)
|
||||
|
||||
@@ -157,7 +157,7 @@ class APITest(test.TestCase):
|
||||
if hasattr(exception_type, 'headers'):
|
||||
for (key, value) in exception_type.headers.iteritems():
|
||||
self.assertTrue(key in resp.headers)
|
||||
self.assertEquals(resp.headers[key], value)
|
||||
self.assertEquals(resp.headers[key], str(value))
|
||||
|
||||
def test_quota_error_mapping(self):
|
||||
self._do_test_exception_mapping(exception.QuotaError, 'too many used')
|
||||
|
||||
@@ -68,6 +68,8 @@ class TestFaults(test.TestCase):
|
||||
|
||||
for request in requests:
|
||||
exc = webob.exc.HTTPRequestEntityTooLarge
|
||||
# NOTE(aloga): we intentionally pass an integer for the
|
||||
# 'Retry-After' header. It should be then converted to a str
|
||||
fault = wsgi.Fault(exc(explanation='sorry',
|
||||
headers={'Retry-After': 4}))
|
||||
response = request.get_response(fault)
|
||||
@@ -76,7 +78,7 @@ class TestFaults(test.TestCase):
|
||||
"overLimit": {
|
||||
"message": "sorry",
|
||||
"code": 413,
|
||||
"retryAfter": 4,
|
||||
"retryAfter": "4",
|
||||
},
|
||||
}
|
||||
actual = jsonutils.loads(response.body)
|
||||
|
||||
@@ -867,6 +867,7 @@ class ResponseObjectTest(test.TestCase):
|
||||
atom=AtomSerializer)
|
||||
robj['X-header1'] = 'header1'
|
||||
robj['X-header2'] = 'header2'
|
||||
robj['X-header3'] = 3
|
||||
|
||||
for content_type, mtype in wsgi._MEDIA_TYPE_MAP.items():
|
||||
request = wsgi.Request.blank('/tests/123')
|
||||
@@ -875,6 +876,7 @@ class ResponseObjectTest(test.TestCase):
|
||||
self.assertEqual(response.headers['Content-Type'], content_type)
|
||||
self.assertEqual(response.headers['X-header1'], 'header1')
|
||||
self.assertEqual(response.headers['X-header2'], 'header2')
|
||||
self.assertEqual(response.headers['X-header3'], '3')
|
||||
self.assertEqual(response.status_int, 202)
|
||||
self.assertEqual(response.body, mtype)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user