Merge "Return correct etag for raw manifest"
This commit is contained in:
commit
24fcb380a8
@ -901,7 +901,7 @@ class SloGetContext(WSGIContext):
|
|||||||
seg_dict['size_bytes'] = seg_dict.pop('bytes', None)
|
seg_dict['size_bytes'] = seg_dict.pop('bytes', None)
|
||||||
seg_dict['etag'] = seg_dict.pop('hash', None)
|
seg_dict['etag'] = seg_dict.pop('hash', None)
|
||||||
|
|
||||||
json_data = json.dumps(segments) # convert to string
|
json_data = json.dumps(segments, sort_keys=True) # convert to string
|
||||||
if six.PY3:
|
if six.PY3:
|
||||||
json_data = json_data.encode('utf-8')
|
json_data = json_data.encode('utf-8')
|
||||||
|
|
||||||
@ -909,6 +909,8 @@ class SloGetContext(WSGIContext):
|
|||||||
for header, value in resp_headers:
|
for header, value in resp_headers:
|
||||||
if header.lower() == 'content-length':
|
if header.lower() == 'content-length':
|
||||||
new_headers.append(('Content-Length', len(json_data)))
|
new_headers.append(('Content-Length', len(json_data)))
|
||||||
|
elif header.lower() == 'etag':
|
||||||
|
new_headers.append(('Etag', md5(json_data).hexdigest()))
|
||||||
else:
|
else:
|
||||||
new_headers.append((header, value))
|
new_headers.append((header, value))
|
||||||
self._response_headers = new_headers
|
self._response_headers = new_headers
|
||||||
|
@ -1098,6 +1098,12 @@ class TestSlo(Base):
|
|||||||
manifest = self.env.container.file("manifest-db")
|
manifest = self.env.container.file("manifest-db")
|
||||||
got_body = manifest.read(parms={'multipart-manifest': 'get',
|
got_body = manifest.read(parms={'multipart-manifest': 'get',
|
||||||
'format': 'raw'})
|
'format': 'raw'})
|
||||||
|
body_md5 = hashlib.md5(got_body).hexdigest()
|
||||||
|
headers = dict(
|
||||||
|
(h.lower(), v)
|
||||||
|
for h, v in manifest.conn.response.getheaders())
|
||||||
|
self.assertIn('etag', headers)
|
||||||
|
self.assertEqual(headers['etag'], body_md5)
|
||||||
|
|
||||||
# raw format should have the actual manifest object content-type
|
# raw format should have the actual manifest object content-type
|
||||||
self.assertEqual('application/octet-stream', manifest.content_type)
|
self.assertEqual('application/octet-stream', manifest.content_type)
|
||||||
|
@ -1705,27 +1705,30 @@ class TestSloGetRawManifest(SloTestCase):
|
|||||||
'HTTP_ACCEPT': 'application/json'})
|
'HTTP_ACCEPT': 'application/json'})
|
||||||
status, headers, body = self.call_slo(req)
|
status, headers, body = self.call_slo(req)
|
||||||
|
|
||||||
|
expected_body = json.dumps([
|
||||||
|
{'etag': md5hex('b' * 10), 'size_bytes': '10',
|
||||||
|
'path': '/gettest/b_10'},
|
||||||
|
{'etag': md5hex('c' * 15), 'size_bytes': '15',
|
||||||
|
'path': '/gettest/c_15'},
|
||||||
|
{'etag': md5hex(md5hex("e" * 5) + md5hex("f" * 5)),
|
||||||
|
'size_bytes': '10',
|
||||||
|
'path': '/gettest/d_10'}], sort_keys=True)
|
||||||
|
expected_etag = md5hex(expected_body)
|
||||||
|
if six.PY3:
|
||||||
|
expected_body = expected_body.encode('utf-8')
|
||||||
|
|
||||||
|
self.assertEqual(body, expected_body)
|
||||||
self.assertEqual(status, '200 OK')
|
self.assertEqual(status, '200 OK')
|
||||||
self.assertTrue(('Etag', self.bc_etag) in headers, headers)
|
self.assertTrue(('Etag', expected_etag) in headers, headers)
|
||||||
self.assertTrue(('X-Static-Large-Object', 'true') in headers, headers)
|
self.assertTrue(('X-Static-Large-Object', 'true') in headers, headers)
|
||||||
# raw format should return the actual manifest object content-type
|
# raw format should return the actual manifest object content-type
|
||||||
self.assertIn(('Content-Type', 'text/plain'), headers)
|
self.assertIn(('Content-Type', 'text/plain'), headers)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
resp_data = json.loads(body)
|
json.loads(body)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
self.fail("Invalid JSON in manifest GET: %r" % body)
|
self.fail("Invalid JSON in manifest GET: %r" % body)
|
||||||
|
|
||||||
self.assertEqual(
|
|
||||||
resp_data,
|
|
||||||
[{'etag': md5hex('b' * 10), 'size_bytes': '10',
|
|
||||||
'path': '/gettest/b_10'},
|
|
||||||
{'etag': md5hex('c' * 15), 'size_bytes': '15',
|
|
||||||
'path': '/gettest/c_15'},
|
|
||||||
{'etag': md5hex(md5hex("e" * 5) + md5hex("f" * 5)),
|
|
||||||
'size_bytes': '10',
|
|
||||||
'path': '/gettest/d_10'}])
|
|
||||||
|
|
||||||
def test_get_raw_manifest_passthrough_with_ranges(self):
|
def test_get_raw_manifest_passthrough_with_ranges(self):
|
||||||
req = Request.blank(
|
req = Request.blank(
|
||||||
'/v1/AUTH_test/gettest/manifest-bc-r'
|
'/v1/AUTH_test/gettest/manifest-bc-r'
|
||||||
|
Loading…
Reference in New Issue
Block a user