summaryrefslogtreecommitdiff
path: root/swiftclient
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2017-06-22 01:13:04 +0000
committerGerrit Code Review <review@openstack.org>2017-06-22 01:13:04 +0000
commitbc3171cfacf64a735a3b488828527e65d3e86e43 (patch)
tree87b07badc8276a5478c8b1595a11e8afc0899ac0 /swiftclient
parent4515002d78c4ab28e65bcb52108f340d108708e1 (diff)
parent64da481ccde9863b0b062cadb27402a5e18b876e (diff)
downloadpython-swiftclient-bc3171cfacf64a735a3b488828527e65d3e86e43.tar.gz
Merge "Tolerate RFC-compliant ETags"
Diffstat (limited to 'swiftclient')
-rw-r--r--swiftclient/service.py27
1 files changed, 20 insertions, 7 deletions
diff --git a/swiftclient/service.py b/swiftclient/service.py
index 7022c5b..65e2436 100644
--- a/swiftclient/service.py
+++ b/swiftclient/service.py
@@ -378,10 +378,23 @@ class _SwiftReader(object):
self._actual_read = 0
self._content_length = None
self._actual_md5 = None
- self._expected_etag = headers.get('etag')
-
- if ('x-object-manifest' not in headers
- and 'x-static-large-object' not in headers and checksum):
+ self._expected_md5 = headers.get('etag', '')
+
+ if len(self._expected_md5) > 1 and self._expected_md5[0] == '"' \
+ and self._expected_md5[-1] == '"':
+ self._expected_md5 = self._expected_md5[1:-1]
+
+ # Some headers indicate the MD5 of the response
+ # definitely *won't* match the ETag
+ bad_md5_headers = set([
+ 'x-object-manifest',
+ 'x-static-large-object',
+ ])
+ if bad_md5_headers.intersection(headers):
+ # This isn't a useful checksum
+ self._expected_md5 = ''
+
+ if self._expected_md5 and checksum:
self._actual_md5 = md5()
if 'content-length' in headers:
@@ -399,12 +412,12 @@ class _SwiftReader(object):
self._check_contents()
def _check_contents(self):
- if self._actual_md5 and self._expected_etag:
+ if self._actual_md5 and self._expected_md5:
etag = self._actual_md5.hexdigest()
- if etag != self._expected_etag:
+ if etag != self._expected_md5:
raise SwiftError('Error downloading {0}: md5sum != etag, '
'{1} != {2}'.format(
- self._path, etag, self._expected_etag))
+ self._path, etag, self._expected_md5))
if (self._content_length is not None
and self._actual_read != self._content_length):