summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.openstack.org>2018-07-17 01:05:14 +0000
committerGerrit Code Review <review@openstack.org>2018-07-17 01:05:14 +0000
commit23d29eda8d03785c22d67930e21a0ba4098ba23c (patch)
treea417485d8645f6929c5edfa401b2ef8dd90a303b
parent531dc5be7b78ece4558f3e422c7399490c5c293d (diff)
parentae5fd46e8772e50a0ab2ac89216188b1cdc83d8e (diff)
downloadpython-swiftclient-23d29eda8d03785c22d67930e21a0ba4098ba23c.tar.gz
Merge "Stop mutating header dicts"
-rw-r--r--swiftclient/client.py65
-rw-r--r--tests/unit/test_swiftclient.py15
2 files changed, 47 insertions, 33 deletions
diff --git a/swiftclient/client.py b/swiftclient/client.py
index cc2a124..8cbdf45 100644
--- a/swiftclient/client.py
+++ b/swiftclient/client.py
@@ -304,7 +304,7 @@ class _RetryBody(_ObjectBody):
self.obj = obj
self.query_string = query_string
self.response_dict = response_dict
- self.headers = headers if headers is not None else {}
+ self.headers = dict(headers) if headers is not None else {}
self.bytes_read = 0
def read(self, length=None):
@@ -854,13 +854,15 @@ def post_account(url, token, headers, http_conn=None, response_dict=None,
path = parsed.path
if query_string:
path += '?' + query_string
- headers['X-Auth-Token'] = token
+ req_headers = {'X-Auth-Token': token}
if service_token:
- headers['X-Service-Token'] = service_token
- conn.request(method, path, data, headers)
+ req_headers['X-Service-Token'] = service_token
+ if headers:
+ req_headers.update(headers)
+ conn.request(method, path, data, req_headers)
resp = conn.getresponse()
body = resp.read()
- http_log((url, method,), {'headers': headers}, resp, body)
+ http_log((url, method,), {'headers': req_headers}, resp, body)
store_response(resp, response_dict)
@@ -902,12 +904,6 @@ def get_container(url, token, container, marker=None, limit=None,
"""
if not http_conn:
http_conn = http_connection(url)
- if headers:
- headers = dict(headers)
- else:
- headers = {}
- headers['X-Auth-Token'] = token
- headers['Accept-Encoding'] = 'gzip'
if full_listing:
rv = get_container(url, token, container, marker, limit, prefix,
delimiter, end_marker, path, http_conn,
@@ -942,17 +938,20 @@ def get_container(url, token, container, marker=None, limit=None,
qs += '&path=%s' % quote(path)
if query_string:
qs += '&%s' % query_string.lstrip('?')
+ req_headers = {'X-Auth-Token': token, 'Accept-Encoding': 'gzip'}
if service_token:
- headers['X-Service-Token'] = service_token
+ req_headers['X-Service-Token'] = service_token
+ if headers:
+ req_headers.update(headers)
method = 'GET'
- conn.request(method, '%s?%s' % (cont_path, qs), '', headers)
+ conn.request(method, '%s?%s' % (cont_path, qs), '', req_headers)
resp = conn.getresponse()
body = resp.read()
http_log(('%(url)s%(cont_path)s?%(qs)s' %
{'url': url.replace(parsed.path, ''),
'cont_path': cont_path,
'qs': qs}, method,),
- {'headers': headers}, resp, body)
+ {'headers': req_headers}, resp, body)
if resp.status < 200 or resp.status >= 300:
raise ClientException.from_response(resp, 'Container GET failed', body)
@@ -1025,23 +1024,23 @@ def put_container(url, token, container, headers=None, http_conn=None,
parsed, conn = http_connection(url)
path = '%s/%s' % (parsed.path, quote(container))
method = 'PUT'
- if not headers:
- headers = {}
- headers['X-Auth-Token'] = token
+ req_headers = {'X-Auth-Token': token}
if service_token:
- headers['X-Service-Token'] = service_token
- if 'content-length' not in (k.lower() for k in headers):
- headers['Content-Length'] = '0'
+ req_headers['X-Service-Token'] = service_token
+ if headers:
+ req_headers.update(headers)
+ if 'content-length' not in (k.lower() for k in req_headers):
+ req_headers['Content-Length'] = '0'
if query_string:
path += '?' + query_string.lstrip('?')
- conn.request(method, path, '', headers)
+ conn.request(method, path, '', req_headers)
resp = conn.getresponse()
body = resp.read()
store_response(resp, response_dict)
http_log(('%s%s' % (url.replace(parsed.path, ''), path), method,),
- {'headers': headers}, resp, body)
+ {'headers': req_headers}, resp, body)
if resp.status < 200 or resp.status >= 300:
raise ClientException.from_response(resp, 'Container PUT failed', body)
@@ -1068,16 +1067,18 @@ def post_container(url, token, container, headers, http_conn=None,
parsed, conn = http_connection(url)
path = '%s/%s' % (parsed.path, quote(container))
method = 'POST'
- headers['X-Auth-Token'] = token
+ req_headers = {'X-Auth-Token': token}
if service_token:
- headers['X-Service-Token'] = service_token
+ req_headers['X-Service-Token'] = service_token
+ if headers:
+ req_headers.update(headers)
if 'content-length' not in (k.lower() for k in headers):
- headers['Content-Length'] = '0'
- conn.request(method, path, '', headers)
+ req_headers['Content-Length'] = '0'
+ conn.request(method, path, '', req_headers)
resp = conn.getresponse()
body = resp.read()
http_log(('%s%s' % (url.replace(parsed.path, ''), path), method,),
- {'headers': headers}, resp, body)
+ {'headers': req_headers}, resp, body)
store_response(resp, response_dict)
@@ -1374,14 +1375,16 @@ def post_object(url, token, container, name, headers, http_conn=None,
else:
parsed, conn = http_connection(url)
path = '%s/%s/%s' % (parsed.path, quote(container), quote(name))
- headers['X-Auth-Token'] = token
+ req_headers = {'X-Auth-Token': token}
if service_token:
- headers['X-Service-Token'] = service_token
- conn.request('POST', path, '', headers)
+ req_headers['X-Service-Token'] = service_token
+ if headers:
+ req_headers.update(headers)
+ conn.request('POST', path, '', req_headers)
resp = conn.getresponse()
body = resp.read()
http_log(('%s%s' % (url.replace(parsed.path, ''), path), 'POST',),
- {'headers': headers}, resp, body)
+ {'headers': req_headers}, resp, body)
store_response(resp, response_dict)
diff --git a/tests/unit/test_swiftclient.py b/tests/unit/test_swiftclient.py
index 009a026..b6d6856 100644
--- a/tests/unit/test_swiftclient.py
+++ b/tests/unit/test_swiftclient.py
@@ -749,9 +749,10 @@ class TestPostAccount(MockHttpTest):
c.http_connection = self.fake_http_connection(200, headers={
'X-Account-Meta-Color': 'blue',
}, body='foo')
+ headers = {'x-account-meta-shape': 'square'}
resp_headers, body = c.post_account(
'http://www.tests.com/path/to/account', 'asdf',
- {'x-account-meta-shape': 'square'}, query_string='bar=baz',
+ headers, query_string='bar=baz',
data='some data')
self.assertEqual('blue', resp_headers.get('x-account-meta-color'))
self.assertEqual('foo', body)
@@ -760,6 +761,8 @@ class TestPostAccount(MockHttpTest):
'some data', {'x-auth-token': 'asdf',
'x-account-meta-shape': 'square'})
])
+ # Check that we didn't mutate the request ehader dict
+ self.assertEqual(headers, {'x-account-meta-shape': 'square'})
def test_server_error(self):
body = 'c' * 65
@@ -1513,6 +1516,11 @@ class TestPostObject(MockHttpTest):
'X-Object-Meta-Test': 'mymeta',
'X-Delete-At': delete_at}),
])
+ # Check that the request header dict didn't get mutated
+ self.assertEqual(args[-1], {
+ 'X-Object-Meta-Test': 'mymeta',
+ 'X-Delete-At': delete_at,
+ })
def test_unicode_ok(self):
conn = c.http_connection(u'http://www.test.com/')
@@ -3141,10 +3149,11 @@ class TestServiceToken(MockHttpTest):
self.assertEqual(conn.attempts, 1)
def test_service_token_post_container(self):
+ headers = {'X-Container-Meta-Color': 'blue'}
with mock.patch('swiftclient.client.http_connection',
self.fake_http_connection(201)):
conn = self.get_connection()
- conn.post_container('container1', {})
+ conn.post_container('container1', headers)
self.assertEqual(1, len(self.request_log), self.request_log)
for actual in self.iter_request_log():
self.assertEqual('POST', actual['method'])
@@ -3154,6 +3163,8 @@ class TestServiceToken(MockHttpTest):
self.assertEqual('http://storage_url.com/container1',
actual['full_path'])
self.assertEqual(conn.attempts, 1)
+ # Check that we didn't mutate the request header dict
+ self.assertEqual(headers, {'X-Container-Meta-Color': 'blue'})
def test_service_token_put_container(self):
with mock.patch('swiftclient.client.http_connection',