From 4b97716e4a68cb55652fe2bfd62373adf2b417c5 Mon Sep 17 00:00:00 2001 From: Dolph Mathews Date: Thu, 21 Jun 2012 13:29:00 -0500 Subject: [PATCH] Webob needs body to calc Content-Length (bug 1016171) - Refactored render_response() and added relevant tests Change-Id: I121e8cc641fe11a036106cbfd206f0aa1f6da560 --- keystone/common/wsgi.py | 21 +++++++++++++-------- tests/test_wsgi.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/keystone/common/wsgi.py b/keystone/common/wsgi.py index 3d06abe415..8857d645bd 100644 --- a/keystone/common/wsgi.py +++ b/keystone/common/wsgi.py @@ -490,17 +490,22 @@ class ExtensionRouter(Router): return _factory -def render_response(body=None, status=(200, 'OK'), headers=None): +def render_response(body=None, status=None, headers=None): """Forms a WSGI response.""" - resp = webob.Response() - resp.status = '%s %s' % status - resp.headerlist = headers or [('Content-Type', 'application/json'), - ('Vary', 'X-Auth-Token')] + headers = headers or [] + headers.append(('Vary', 'X-Auth-Token')) - if body is not None: - resp.body = jsonutils.dumps(body, cls=utils.SmarterEncoder) + if body is None: + body = '' + status = status or (204, 'No Content') + else: + body = jsonutils.dumps(body, cls=utils.SmarterEncoder) + headers.append(('Content-Type', 'application/json')) + status = status or (200, 'OK') - return resp + return webob.Response(body=body, + status='%s %s' % status, + headerlist=headers) def render_exception(error): diff --git a/tests/test_wsgi.py b/tests/test_wsgi.py index a6e64fedd9..3c9eb2af15 100644 --- a/tests/test_wsgi.py +++ b/tests/test_wsgi.py @@ -47,3 +47,32 @@ class ApplicationTest(test.TestCase): req = self._make_request(url='/?1=2') resp = req.get_response(app) self.assertEqual(jsonutils.loads(resp.body), {'1': '2'}) + + def test_render_response(self): + data = {'attribute': 'value'} + body = '{"attribute": "value"}' + + resp = wsgi.render_response(body=data) + self.assertEqual(resp.status, '200 OK') + self.assertEqual(resp.status_int, 200) + self.assertEqual(resp.body, body) + self.assertEqual(resp.headers.get('Vary'), 'X-Auth-Token') + self.assertEqual(resp.headers.get('Content-Length'), str(len(body))) + + def test_render_response_custom_status(self): + resp = wsgi.render_response(status=(501, 'Not Implemented')) + self.assertEqual(resp.status, '501 Not Implemented') + self.assertEqual(resp.status_int, 501) + + def test_render_response_custom_headers(self): + resp = wsgi.render_response(headers=[('Custom-Header', 'Some-Value')]) + self.assertEqual(resp.headers.get('Custom-Header'), 'Some-Value') + self.assertEqual(resp.headers.get('Vary'), 'X-Auth-Token') + + def test_render_response_no_body(self): + resp = wsgi.render_response() + self.assertEqual(resp.status, '204 No Content') + self.assertEqual(resp.status_int, 204) + self.assertEqual(resp.body, '') + self.assertEqual(resp.headers.get('Content-Length'), '0') + self.assertEqual(resp.headers.get('Content-Type'), None)