summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Hsu <charles0126@gmail.com>2020-02-06 15:35:11 +0800
committerTim Burke <tim.burke@gmail.com>2020-03-02 21:19:43 -0800
commit24bb15c2914c23b02c801eb29e3da452b81ebf3d (patch)
treebcad4dec3257ad69bd3091a5ccfd4b03f38ad537
parent778767f324e82dd7a075306cf8468aabbbc363b6 (diff)
downloadswift-24bb15c2914c23b02c801eb29e3da452b81ebf3d.tar.gz
Ensure domain stored in memcached gets utf8 decoded on py2
Change-Id: I73b5af9645f3f7349144384609bf18a79620e92f Closes-Bug: #1862115 (cherry picked from commit 61bf5ee1c428410b70bfab0a6eae361df948d03e)
-rw-r--r--swift/common/middleware/cname_lookup.py17
-rw-r--r--test/unit/common/middleware/test_cname_lookup.py9
2 files changed, 20 insertions, 6 deletions
diff --git a/swift/common/middleware/cname_lookup.py b/swift/common/middleware/cname_lookup.py
index 1b5aa6df4..93699e3c1 100644
--- a/swift/common/middleware/cname_lookup.py
+++ b/swift/common/middleware/cname_lookup.py
@@ -27,7 +27,7 @@ maximum lookup depth. If a match is found, the environment's Host header is
rewritten and the request is passed further down the WSGI chain.
"""
-from six.moves import range
+import six
from swift import gettext_ as _
@@ -41,7 +41,8 @@ else: # executed if the try block finishes with no errors
MODULE_DEPENDENCY_MET = True
from swift.common.middleware import RewriteContext
-from swift.common.swob import Request, HTTPBadRequest
+from swift.common.swob import Request, HTTPBadRequest, \
+ str_to_wsgi, wsgi_to_str
from swift.common.utils import cache_from_env, get_logger, is_valid_ip, \
list_from_csv, parse_socket_string, register_swift_info
@@ -130,9 +131,10 @@ class CNAMELookupMiddleware(object):
if not self.storage_domain:
return self.app(env, start_response)
if 'HTTP_HOST' in env:
- requested_host = given_domain = env['HTTP_HOST']
+ requested_host = env['HTTP_HOST']
else:
- requested_host = given_domain = env['SERVER_NAME']
+ requested_host = env['SERVER_NAME']
+ given_domain = wsgi_to_str(requested_host)
port = ''
if ':' in given_domain:
given_domain, port = given_domain.rsplit(':', 1)
@@ -148,6 +150,8 @@ class CNAMELookupMiddleware(object):
if self.memcache:
memcache_key = ''.join(['cname-', a_domain])
found_domain = self.memcache.get(memcache_key)
+ if six.PY2 and found_domain:
+ found_domain = found_domain.encode('utf-8')
if found_domain is None:
ttl, found_domain = lookup_cname(a_domain, self.resolver)
if self.memcache and ttl > 0:
@@ -166,9 +170,10 @@ class CNAMELookupMiddleware(object):
{'given_domain': given_domain,
'found_domain': found_domain})
if port:
- env['HTTP_HOST'] = ':'.join([found_domain, port])
+ env['HTTP_HOST'] = ':'.join([
+ str_to_wsgi(found_domain), port])
else:
- env['HTTP_HOST'] = found_domain
+ env['HTTP_HOST'] = str_to_wsgi(found_domain)
error = False
break
else:
diff --git a/test/unit/common/middleware/test_cname_lookup.py b/test/unit/common/middleware/test_cname_lookup.py
index 5614bf928..4e1a72f98 100644
--- a/test/unit/common/middleware/test_cname_lookup.py
+++ b/test/unit/common/middleware/test_cname_lookup.py
@@ -170,6 +170,10 @@ class TestCNAMELookup(unittest.TestCase):
return self.cache.get(key, None)
def set(self, key, value, *a, **kw):
+ # real memcache client will JSON-serialize, so our mock
+ # should be sure to return unicode
+ if isinstance(value, bytes):
+ value = value.decode('utf-8')
self.cache[key] = value
module = 'swift.common.middleware.cname_lookup.lookup_cname'
@@ -186,6 +190,9 @@ class TestCNAMELookup(unittest.TestCase):
self.assertEqual(m.call_count, 1)
self.assertEqual(memcache.cache.get('cname-mysite2.com'),
'c.example.com')
+ self.assertIsInstance(req.environ['HTTP_HOST'], str)
+ self.assertEqual(req.environ['HTTP_HOST'], 'c.example.com')
+
req = Request.blank('/', environ={'REQUEST_METHOD': 'GET',
'swift.cache': memcache},
headers={'Host': 'mysite2.com'})
@@ -194,6 +201,8 @@ class TestCNAMELookup(unittest.TestCase):
self.assertEqual(m.call_count, 1)
self.assertEqual(memcache.cache.get('cname-mysite2.com'),
'c.example.com')
+ self.assertIsInstance(req.environ['HTTP_HOST'], str)
+ self.assertEqual(req.environ['HTTP_HOST'], 'c.example.com')
for exc, num in ((dns.resolver.NXDOMAIN(), 3),
(dns.resolver.NoAnswer(), 4)):