From cfe07fc76473a14f45038e7c0b049007f9816a9e Mon Sep 17 00:00:00 2001 From: David Stanek Date: Wed, 10 Feb 2016 23:17:03 +0000 Subject: [PATCH] Fix keystone.common.wsgi to explicitly use bytes The WSGI spec says that the body of a response needs to be bytes. This ensures that we are using bytes in both Python2 and Python3. bp python3 Change-Id: I40148c2e2e1e517358b64028d335ac27d17323a3 --- keystone/common/wsgi.py | 8 ++++---- keystone/tests/common/auth.py | 2 +- keystone/tests/unit/test_v3.py | 8 ++++---- tests-py3-blacklist.txt | 11 ----------- 4 files changed, 9 insertions(+), 20 deletions(-) diff --git a/keystone/common/wsgi.py b/keystone/common/wsgi.py index f3c476e9fd..8b07db96b7 100644 --- a/keystone/common/wsgi.py +++ b/keystone/common/wsgi.py @@ -721,8 +721,8 @@ class V3ExtensionRouter(ExtensionRouter, RoutersBase): response_data = jsonutils.loads(response.body) self._update_version_response(response_data) - response.body = jsonutils.dumps(response_data, - cls=utils.SmarterEncoder) + response.body = jsonutils.dump_as_bytes(response_data, + cls=utils.SmarterEncoder) return response @@ -735,7 +735,7 @@ def render_response(body=None, status=None, headers=None, method=None): headers.append(('Vary', 'X-Auth-Token')) if body is None: - body = '' + body = b'' status = status or (204, 'No Content') else: content_types = [v for h, v in headers if h == 'Content-Type'] @@ -745,7 +745,7 @@ def render_response(body=None, status=None, headers=None, method=None): content_type = None if content_type is None or content_type in JSON_ENCODE_CONTENT_TYPES: - body = jsonutils.dumps(body, cls=utils.SmarterEncoder) + body = jsonutils.dump_as_bytes(body, cls=utils.SmarterEncoder) if content_type is None: headers.append(('Content-Type', 'application/json')) status = status or (200, 'OK') diff --git a/keystone/tests/common/auth.py b/keystone/tests/common/auth.py index 72cc95f379..547418cfbb 100644 --- a/keystone/tests/common/auth.py +++ b/keystone/tests/common/auth.py @@ -53,7 +53,7 @@ class AuthTestMixin(object): message='_build_auth requires 1 (and only 1) ' 'secret type and value') - secret_type, secret_value = kwargs.items()[0] + secret_type, secret_value = list(kwargs.items())[0] # NOTE(dstanek): just to ensure sanity in the tests self.assertIn(secret_type, ('passcode', 'password'), diff --git a/keystone/tests/unit/test_v3.py b/keystone/tests/unit/test_v3.py index 76f0efa234..216d8c7903 100644 --- a/keystone/tests/unit/test_v3.py +++ b/keystone/tests/unit/test_v3.py @@ -534,7 +534,7 @@ class RestfulTestCase(unit.SQLDriverOverrides, rest.RestfulTestCase, def head(self, path, expected_status=http_client.NO_CONTENT, **kwargs): r = self.v3_request(path, method='HEAD', expected_status=expected_status, **kwargs) - self.assertEqual('', r.body) + self.assertEqual(b'', r.body) return r def post(self, path, expected_status=http_client.CREATED, **kwargs): @@ -1339,7 +1339,7 @@ class AuthContextMiddlewareAdminTokenTestCase(RestfulTestCase): def _middleware_request(self, token, extra_environ=None): def application(environ, start_response): - body = 'body' + body = b'body' headers = [('Content-Type', 'text/html; charset=utf8'), ('Content-Length', str(len(body)))] start_response('200 OK', headers) @@ -1381,7 +1381,7 @@ class AuthContextMiddlewareTestCase(RestfulTestCase): def _middleware_request(self, token, extra_environ=None): def application(environ, start_response): - body = 'body' + body = b'body' headers = [('Content-Type', 'text/html; charset=utf8'), ('Content-Length', str(len(body)))] start_response('200 OK', headers) @@ -1390,7 +1390,7 @@ class AuthContextMiddlewareTestCase(RestfulTestCase): app = webtest.TestApp(middleware.AuthContextMiddleware(application), extra_environ=extra_environ) resp = app.get('/', headers={middleware.AUTH_TOKEN_HEADER: token}) - self.assertEqual('body', resp.text) # just to make sure it worked + self.assertEqual(b'body', resp.body) # just to make sure it worked return resp.request def test_auth_context_build_by_middleware(self): diff --git a/tests-py3-blacklist.txt b/tests-py3-blacklist.txt index 0eeae7cda6..181e6523ef 100644 --- a/tests-py3-blacklist.txt +++ b/tests-py3-blacklist.txt @@ -1,22 +1,11 @@ keystone.tests.unit.common.test_ldap keystone.tests.unit.common.test_notifications -keystone.tests.unit.test_associate_project_endpoint_extension keystone.tests.unit.test_backend_ldap keystone.tests.unit.test_backend_ldap_pool keystone.tests.unit.test_ipv6 keystone.tests.unit.test_v2 -keystone.tests.unit.test_v3 -keystone.tests.unit.test_v3_assignment keystone.tests.unit.test_v3_auth keystone.tests.unit.test_v3_credential -keystone.tests.unit.test_v3_domain_config -keystone.tests.unit.test_v3_endpoint_policy keystone.tests.unit.test_v3_federation -keystone.tests.unit.test_v3_identity keystone.tests.unit.test_v3_oauth1 -keystone.tests.unit.test_v3_os_revoke -keystone.tests.unit.test_v3_protection -keystone.tests.unit.test_v3_resource -keystone.tests.unit.test_v3_trust -keystone.tests.unit.test_versions keystone.tests.unit.token.test_fernet_provider