Merge "s3api: stop adding etag quotes when there are already etag quotes"
This commit is contained in:
@@ -234,10 +234,15 @@ class BucketController(Controller):
|
|||||||
# SLOs may be in something *close* to the MU format
|
# SLOs may be in something *close* to the MU format
|
||||||
etag = '"%s-N"' % o['slo_etag'].strip('"')
|
etag = '"%s-N"' % o['slo_etag'].strip('"')
|
||||||
else:
|
else:
|
||||||
# Normal objects just use the MD5
|
etag = o['hash']
|
||||||
etag = '"%s"' % o['hash']
|
if len(etag) < 2 or etag[::len(etag) - 1] != '""':
|
||||||
# This also catches sufficiently-old SLOs, but we have
|
# Normal objects just use the MD5
|
||||||
# no way to identify those from container listings
|
etag = '"%s"' % o['hash']
|
||||||
|
# This also catches sufficiently-old SLOs, but we have
|
||||||
|
# no way to identify those from container listings
|
||||||
|
# Otherwise, somebody somewhere (proxyfs, maybe?) made this
|
||||||
|
# look like an RFC-compliant ETag; we don't need to
|
||||||
|
# quote-wrap.
|
||||||
SubElement(contents, 'ETag').text = etag
|
SubElement(contents, 'ETag').text = etag
|
||||||
SubElement(contents, 'Size').text = str(o['bytes'])
|
SubElement(contents, 'Size').text = str(o['bytes'])
|
||||||
if fetch_owner or listing_type != 'version-2':
|
if fetch_owner or listing_type != 'version-2':
|
||||||
|
|||||||
@@ -34,6 +34,9 @@ from test.unit.common.middleware.s3api import S3ApiTestCase
|
|||||||
from test.unit.common.middleware.s3api.test_s3_acl import s3acl
|
from test.unit.common.middleware.s3api.test_s3_acl import s3acl
|
||||||
from test.unit.common.middleware.s3api.helpers import UnreadableInput
|
from test.unit.common.middleware.s3api.helpers import UnreadableInput
|
||||||
|
|
||||||
|
# Example etag from ProxyFS; note that it is already quote-wrapped
|
||||||
|
PFS_ETAG = '"pfsv2/AUTH_test/01234567/89abcdef-32"'
|
||||||
|
|
||||||
|
|
||||||
class TestS3ApiBucket(S3ApiTestCase):
|
class TestS3ApiBucket(S3ApiTestCase):
|
||||||
def setup_objects(self):
|
def setup_objects(self):
|
||||||
@@ -43,6 +46,8 @@ class TestS3ApiBucket(S3ApiTestCase):
|
|||||||
(u'lily-\u062a', '2011-01-05T02:19:14.275290', 0, 390),
|
(u'lily-\u062a', '2011-01-05T02:19:14.275290', 0, 390),
|
||||||
('mu', '2011-01-05T02:19:14.275290',
|
('mu', '2011-01-05T02:19:14.275290',
|
||||||
'md5-of-the-manifest; s3_etag=0', '3909'),
|
'md5-of-the-manifest; s3_etag=0', '3909'),
|
||||||
|
('pfs-obj', '2011-01-05T02:19:14.275290',
|
||||||
|
PFS_ETAG, '3909'),
|
||||||
('slo', '2011-01-05T02:19:14.275290',
|
('slo', '2011-01-05T02:19:14.275290',
|
||||||
'md5-of-the-manifest', '3909'),
|
'md5-of-the-manifest', '3909'),
|
||||||
('with space', '2011-01-05T02:19:14.275290', 0, 390),
|
('with space', '2011-01-05T02:19:14.275290', 0, 390),
|
||||||
@@ -52,7 +57,7 @@ class TestS3ApiBucket(S3ApiTestCase):
|
|||||||
{'name': item[0], 'last_modified': str(item[1]),
|
{'name': item[0], 'last_modified': str(item[1]),
|
||||||
'hash': str(item[2]), 'bytes': str(item[3])}
|
'hash': str(item[2]), 'bytes': str(item[3])}
|
||||||
for item in self.objects]
|
for item in self.objects]
|
||||||
objects[5]['slo_etag'] = '"0"'
|
objects[6]['slo_etag'] = '"0"'
|
||||||
object_list = json.dumps(objects)
|
object_list = json.dumps(objects)
|
||||||
|
|
||||||
self.prefixes = ['rose', 'viola', 'lily']
|
self.prefixes = ['rose', 'viola', 'lily']
|
||||||
@@ -171,6 +176,7 @@ class TestS3ApiBucket(S3ApiTestCase):
|
|||||||
o.find('./LastModified').text)
|
o.find('./LastModified').text)
|
||||||
self.assertEqual(items, [
|
self.assertEqual(items, [
|
||||||
(i[0].encode('utf-8') if six.PY2 else i[0],
|
(i[0].encode('utf-8') if six.PY2 else i[0],
|
||||||
|
PFS_ETAG if i[0] == 'pfs-obj' else
|
||||||
'"0-N"' if i[0] == 'slo' else '"0"')
|
'"0-N"' if i[0] == 'slo' else '"0"')
|
||||||
for i in self.objects])
|
for i in self.objects])
|
||||||
|
|
||||||
@@ -196,7 +202,9 @@ class TestS3ApiBucket(S3ApiTestCase):
|
|||||||
o.find('./LastModified').text)
|
o.find('./LastModified').text)
|
||||||
|
|
||||||
self.assertEqual(items, [
|
self.assertEqual(items, [
|
||||||
(quote(i[0].encode('utf-8')), '"0-N"' if i[0] == 'slo' else '"0"')
|
(quote(i[0].encode('utf-8')),
|
||||||
|
PFS_ETAG if i[0] == 'pfs-obj' else
|
||||||
|
'"0-N"' if i[0] == 'slo' else '"0"')
|
||||||
for i in self.objects])
|
for i in self.objects])
|
||||||
|
|
||||||
def test_bucket_GET_subdir(self):
|
def test_bucket_GET_subdir(self):
|
||||||
@@ -576,7 +584,8 @@ class TestS3ApiBucket(S3ApiTestCase):
|
|||||||
self.assertEqual([v.find('./LastModified').text for v in versions],
|
self.assertEqual([v.find('./LastModified').text for v in versions],
|
||||||
[v[1][:-3] + 'Z' for v in objects])
|
[v[1][:-3] + 'Z' for v in objects])
|
||||||
self.assertEqual([v.find('./ETag').text for v in versions],
|
self.assertEqual([v.find('./ETag').text for v in versions],
|
||||||
['"0-N"' if v[0] == 'slo' else '"0"'
|
[PFS_ETAG if v[0] == 'pfs-obj' else
|
||||||
|
'"0-N"' if v[0] == 'slo' else '"0"'
|
||||||
for v in objects])
|
for v in objects])
|
||||||
self.assertEqual([v.find('./Size').text for v in versions],
|
self.assertEqual([v.find('./Size').text for v in versions],
|
||||||
[str(v[3]) for v in objects])
|
[str(v[3]) for v in objects])
|
||||||
|
|||||||
Reference in New Issue
Block a user