Merge "Only encode metadata for user customed headers"

This commit is contained in:
Jenkins 2014-05-08 12:21:48 +00:00 committed by Gerrit Code Review
commit 3895d8535a
2 changed files with 22 additions and 8 deletions

View File

@ -180,12 +180,26 @@ class HTTPConnection:
""" Final wrapper before requests call, to be patched in tests """
return self.request_session.request(*arg, **kwarg)
def _encode_meta_headers(self, items):
"""Only encode metadata headers keys"""
ret = {}
for header, value in items:
value = encode_utf8(value)
header = header.lower()
for target_type in 'container', 'account', 'object':
prefix = 'x-%s-meta-' % target_type
if header.startswith(prefix):
header = encode_utf8(header)
ret[header] = value
return ret
def request(self, method, full_path, data=None, headers=None, files=None):
""" Encode url and header, then call requests.request """
if headers is None:
headers = {}
headers = dict((encode_utf8(x.lower()), encode_utf8(y)) for x, y in
headers.items())
else:
headers = self._encode_meta_headers(headers.items())
# set a default User-Agent header if it wasn't passed in
if 'user-agent' not in headers:
headers['user-agent'] = self.default_user_agent

View File

@ -229,7 +229,7 @@ class TestHttpHelpers(MockHttpTest):
# test if it's actually set
conn.request('GET', '/', headers={'User-Agent': 'Me'})
ua = req_headers.get('user-agent', 'XXX-MISSING-XXX')
self.assertEqual(ua, 'Me', req_headers)
self.assertEqual(ua, b'Me', req_headers)
def test_set_user_agent_default_override(self):
_junk, conn = c.http_connection(
@ -631,10 +631,10 @@ class TestPutObject(MockHttpTest):
value = c.put_object(*args, headers=headers, http_conn=conn)
self.assertTrue(isinstance(value, six.string_types))
# Test for RFC-2616 encoded symbols
self.assertIn((b"a-b", b".x:yz mn:fg:lp"),
self.assertIn(("a-b", b".x:yz mn:fg:lp"),
resp.buffer)
# Test unicode header
self.assertIn((b'x-header1', text.encode('utf8')),
self.assertIn(('x-header1', text.encode('utf8')),
resp.buffer)
def test_chunk_warning(self):
@ -741,7 +741,7 @@ class TestPostObject(MockHttpTest):
def test_unicode_ok(self):
conn = c.http_connection(u'http://www.test.com/')
args = (u'\u5929\u7a7a\u4e2d\u7684\u4e4c\u4e91',
'\u5929\u7a7a\u4e2d\u7684\u4e4c\u4e91',
u'\u5929\u7a7a\u4e2d\u7684\u4e4c\u4e91',
u'\u5929\u7a7a\u4e2d\u7684\u4e4c\u4e91',
u'\u5929\u7a7a\u4e2d\u7684\u4e4c\u4e91')
text = u'\u5929\u7a7a\u4e2d\u7684\u4e4c\u4e91'
@ -753,9 +753,9 @@ class TestPostObject(MockHttpTest):
conn[1]._request = resp._fake_request
c.post_object(*args, headers=headers, http_conn=conn)
# Test for RFC-2616 encoded symbols
self.assertTrue((b'a-b', b"a-b: .x:yz mn:kl:qr"), resp.buffer)
self.assertIn(('a-b', b".x:yz mn:kl:qr"), resp.buffer)
# Test unicode header
self.assertIn((b'x-header1', text.encode('utf8')),
self.assertIn(('x-header1', text.encode('utf8')),
resp.buffer)
def test_server_error(self):