From 29b877de712cc6baf0cfb41bfa53ae018b04de8b Mon Sep 17 00:00:00 2001 From: Tim Burke Date: Thu, 10 Jan 2019 01:35:05 +0000 Subject: [PATCH] s3api: fix partition between S3 and Swift headers In swift3 [1], we partitioned between swift3-specific sysmeta headers and all other swift headers. During the transition to s3api [2], we were sure to include a support for reading swift3 sysmeta as s3api sysmeta, but we forgot to add all *other* sysmeta to the swift headers! Fix that, and rename sw_sysmeta_headers to s3_sysmeta_headers to more-accurately reflect its purpose. [1] https://github.com/openstack/swift3/blob/1.12/swift3/response.py#L90-L96 [2] https://review.openstack.org/#/c/557623/ Change-Id: Id6de002b18ba784ad53bda38855376159c7d2ba7 --- swift/common/middleware/s3api/s3response.py | 14 ++++++++------ .../common/middleware/s3api/test_s3response.py | 2 ++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/swift/common/middleware/s3api/s3response.py b/swift/common/middleware/s3api/s3response.py index 38bde84242..9e6a759bd7 100644 --- a/swift/common/middleware/s3api/s3response.py +++ b/swift/common/middleware/s3api/s3response.py @@ -80,7 +80,7 @@ class S3Response(S3ResponseBase, swob.Response): def __init__(self, *args, **kwargs): swob.Response.__init__(self, *args, **kwargs) - sw_sysmeta_headers = swob.HeaderKeyDict() + s3_sysmeta_headers = swob.HeaderKeyDict() sw_headers = swob.HeaderKeyDict() headers = HeaderKeyDict() self.is_slo = False @@ -103,12 +103,14 @@ class S3Response(S3ResponseBase, swob.Response): key = sysmeta_prefix(_server_type) + \ key[len('x-%s-sysmeta-swift3-' % _server_type):] - if key not in sw_sysmeta_headers: + if key not in s3_sysmeta_headers: # To avoid overwrite s3api sysmeta by older swift3 # sysmeta set the key only when the key does not exist - sw_sysmeta_headers[key] = val + s3_sysmeta_headers[key] = val elif is_s3api_sysmeta(key, _server_type): - sw_sysmeta_headers[key] = val + s3_sysmeta_headers[key] = val + else: + sw_headers[key] = val else: sw_headers[key] = val @@ -132,7 +134,7 @@ class S3Response(S3ResponseBase, swob.Response): self.is_slo = config_true_value(val) # Check whether we stored the AWS-style etag on upload - override_etag = sw_sysmeta_headers.get( + override_etag = s3_sysmeta_headers.get( sysmeta_header('object', 'etag')) if override_etag is not None: # Multipart uploads in AWS have ETags like @@ -153,7 +155,7 @@ class S3Response(S3ResponseBase, swob.Response): # Used for pure swift header handling at the request layer self.sw_headers = sw_headers - self.sysmeta_headers = sw_sysmeta_headers + self.sysmeta_headers = s3_sysmeta_headers @classmethod def from_swift_resp(cls, sw_resp): diff --git a/test/unit/common/middleware/s3api/test_s3response.py b/test/unit/common/middleware/s3api/test_s3response.py index 9ffdaf1db1..4c6a854b18 100644 --- a/test/unit/common/middleware/s3api/test_s3response.py +++ b/test/unit/common/middleware/s3api/test_s3response.py @@ -54,6 +54,8 @@ class TestResponse(unittest.TestCase): expected_headers = HeaderKeyDict( {sysmeta_prefix(_server_type) + 'test': 'ok'}) self.assertEqual(expected_headers, s3resp.sysmeta_headers) + self.assertIn('x-%s-sysmeta-test-s3api' % _server_type, + s3resp.sw_headers) def test_response_s3api_sysmeta_from_swift3_sysmeta(self): for _server_type in ('object', 'container'):