summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--swiftclient/client.py17
-rw-r--r--tests/functional/test_swiftclient.py2
-rw-r--r--tests/unit/test_swiftclient.py20
3 files changed, 30 insertions, 9 deletions
diff --git a/swiftclient/client.py b/swiftclient/client.py
index 5494f34..a7d0daf 100644
--- a/swiftclient/client.py
+++ b/swiftclient/client.py
@@ -186,10 +186,12 @@ class HTTPConnection:
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)
+ if isinstance(header, six.string_types):
+ for target_type in 'container', 'account', 'object':
+ prefix = 'x-%s-meta-' % target_type
+ if header.startswith(prefix):
+ header = encode_utf8(header)
+ break
ret[header] = value
return ret
@@ -899,9 +901,8 @@ def put_object(url, token=None, container=None, name=None, contents=None,
:param chunk_size: chunk size of data to write; it defaults to 65536;
used only if the contents object has a 'read'
method, e.g. file-like objects, ignored otherwise
- :param content_type: value to send as content-type header; if None, no
- content-type will be set (remote end will likely try
- to auto-detect it)
+ :param content_type: value to send as content-type header; if None, an
+ empty string value will be sent
:param headers: additional headers to include in the request, if any
:param http_conn: HTTP connection object (If None, it will create the
conn object)
@@ -940,6 +941,8 @@ def put_object(url, token=None, container=None, name=None, contents=None,
content_length = int(v)
if content_type is not None:
headers['Content-Type'] = content_type
+ else: # python-requests sets application/x-www-form-urlencoded otherwise
+ headers['Content-Type'] = ''
if not contents:
headers['Content-Length'] = '0'
if hasattr(contents, 'read'):
diff --git a/tests/functional/test_swiftclient.py b/tests/functional/test_swiftclient.py
index 6631d36..3721e51 100644
--- a/tests/functional/test_swiftclient.py
+++ b/tests/functional/test_swiftclient.py
@@ -259,7 +259,7 @@ class TestFunctional(testtools.TestCase):
self.containername, self.objectname,
resp_chunk_size=10)
self.assertTrue(isinstance(body, types.GeneratorType))
- self.assertEqual(self.test_data, ''.join(body))
+ self.assertEqual(self.test_data, b''.join(body))
def test_post_account(self):
self.conn.post_account({'x-account-meta-data': 'Something'})
diff --git a/tests/unit/test_swiftclient.py b/tests/unit/test_swiftclient.py
index 0819475..2e7a807 100644
--- a/tests/unit/test_swiftclient.py
+++ b/tests/unit/test_swiftclient.py
@@ -730,6 +730,16 @@ class TestPutObject(MockHttpTest):
self.assertTrue(request_header['etag'], '1234-5678')
self.assertTrue(request_header['content-type'], 'text/plain')
+ def test_no_content_type(self):
+ conn = c.http_connection(u'http://www.test.com/')
+ resp = MockHttpResponse(status=200)
+ conn[1].getresponse = resp.fake_response
+ conn[1]._request = resp._fake_request
+
+ c.put_object(url='http://www.test.com', http_conn=conn)
+ request_header = resp.requests_params['headers']
+ self.assertEqual(request_header['content-type'], b'')
+
class TestPostObject(MockHttpTest):
@@ -746,7 +756,10 @@ class TestPostObject(MockHttpTest):
u'\u5929\u7a7a\u4e2d\u7684\u4e4c\u4e91')
text = u'\u5929\u7a7a\u4e2d\u7684\u4e4c\u4e91'
headers = {'X-Header1': text,
- 'X-2': '1', 'X-3': {'a': 'b'}, 'a-b': '.x:yz mn:kl:qr'}
+ b'X-Header2': 'value',
+ 'X-2': '1', 'X-3': {'a': 'b'}, 'a-b': '.x:yz mn:kl:qr',
+ 'X-Object-Meta-Header-not-encoded': text,
+ b'X-Object-Meta-Header-encoded': 'value'}
resp = MockHttpResponse()
conn[1].getresponse = resp.fake_response
@@ -757,6 +770,11 @@ class TestPostObject(MockHttpTest):
# Test unicode header
self.assertIn(('x-header1', text.encode('utf8')),
resp.buffer)
+ self.assertIn((b'x-object-meta-header-not-encoded',
+ text.encode('utf8')), resp.buffer)
+ self.assertIn((b'x-object-meta-header-encoded', b'value'),
+ resp.buffer)
+ self.assertIn((b'x-header2', b'value'), resp.buffer)
def test_server_error(self):
body = 'c' * 60