summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-05-08 12:21:48 +0000
committerGerrit Code Review <review@openstack.org>2014-05-08 12:21:48 +0000
commit3895d8535a6aa61a2560f5aadc5ffbd172f6a4c8 (patch)
tree300b665ca11dc4d198ec00b05c5004f443c612bb
parent30244399dd15647f09e882d5ff514006a963ed65 (diff)
parent4467d98f3009060d34706a34f453ffd113c9cb52 (diff)
downloadpython-swiftclient-3895d8535a6aa61a2560f5aadc5ffbd172f6a4c8.tar.gz
Merge "Only encode metadata for user customed headers"
-rw-r--r--swiftclient/client.py18
-rw-r--r--tests/unit/test_swiftclient.py12
2 files changed, 22 insertions, 8 deletions
diff --git a/swiftclient/client.py b/swiftclient/client.py
index 81eeecd..3fb615a 100644
--- a/swiftclient/client.py
+++ b/swiftclient/client.py
@@ -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
diff --git a/tests/unit/test_swiftclient.py b/tests/unit/test_swiftclient.py
index 4e83a2d..db99a77 100644
--- a/tests/unit/test_swiftclient.py
+++ b/tests/unit/test_swiftclient.py
@@ -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):