From 40f9114679e02bcbd870d285dfb31041362632b9 Mon Sep 17 00:00:00 2001 From: Timur Alperovich Date: Mon, 13 May 2019 18:38:24 -0700 Subject: Set Content-Type with s3api metadata updates. S3 supports two metadata operations on object copy: COPY and REPLACE. When using REPLACE, the Content-Type should be set to the one supplied by the caller. When using COPY, the existing object's Content-Type value is used. Change-Id: Ic7c6278dedef308c9219eb45751abfa5655f144f Closes-Bug: #1828907 (cherry picked from commit 8b64381371b542d46fadba428d3b910dcbcd8d93) --- doc/s3api/conf/ceph-known-failures-keystone.yaml | 1 - doc/s3api/conf/ceph-known-failures-tempauth.yaml | 1 - swift/common/middleware/s3api/s3request.py | 3 +-- test/unit/common/middleware/s3api/test_obj.py | 4 ++-- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/doc/s3api/conf/ceph-known-failures-keystone.yaml b/doc/s3api/conf/ceph-known-failures-keystone.yaml index b1f667fe1..3a50627bb 100644 --- a/doc/s3api/conf/ceph-known-failures-keystone.yaml +++ b/doc/s3api/conf/ceph-known-failures-keystone.yaml @@ -42,7 +42,6 @@ ceph_s3: s3tests.functional.test_s3.test_object_acl_xml_writeacp: {status: KNOWN} s3tests.functional.test_s3.test_object_copy_canned_acl: {status: KNOWN} s3tests.functional.test_s3.test_object_copy_not_owned_object_bucket: {status: KNOWN} - s3tests.functional.test_s3.test_object_copy_replacing_metadata: {status: KNOWN} s3tests.functional.test_s3.test_object_giveaway: {status: KNOWN} s3tests.functional.test_s3.test_object_header_acl_grants: {status: KNOWN} s3tests.functional.test_s3.test_object_raw_get: {status: KNOWN} diff --git a/doc/s3api/conf/ceph-known-failures-tempauth.yaml b/doc/s3api/conf/ceph-known-failures-tempauth.yaml index cc3e1e7aa..41c1b0b3b 100644 --- a/doc/s3api/conf/ceph-known-failures-tempauth.yaml +++ b/doc/s3api/conf/ceph-known-failures-tempauth.yaml @@ -23,7 +23,6 @@ ceph_s3: s3tests.functional.test_s3.test_logging_toggle: {status: KNOWN} s3tests.functional.test_s3.test_multipart_resend_first_finishes_last: {status: KNOWN} s3tests.functional.test_s3.test_object_copy_canned_acl: {status: KNOWN} - s3tests.functional.test_s3.test_object_copy_replacing_metadata: {status: KNOWN} s3tests.functional.test_s3.test_object_header_acl_grants: {status: KNOWN} s3tests.functional.test_s3.test_object_raw_get: {status: KNOWN} s3tests.functional.test_s3.test_object_raw_get_bucket_acl: {status: KNOWN} diff --git a/swift/common/middleware/s3api/s3request.py b/swift/common/middleware/s3api/s3request.py index 4ff5ad953..51de205d6 100644 --- a/swift/common/middleware/s3api/s3request.py +++ b/swift/common/middleware/s3api/s3request.py @@ -1100,14 +1100,13 @@ class S3Request(swob.Request): env['HTTP_X_COPY_FROM'] = env['HTTP_X_AMZ_COPY_SOURCE'] del env['HTTP_X_AMZ_COPY_SOURCE'] env['CONTENT_LENGTH'] = '0' - # Content type cannot be modified on COPY - env.pop('CONTENT_TYPE', None) if env.pop('HTTP_X_AMZ_METADATA_DIRECTIVE', None) == 'REPLACE': env['HTTP_X_FRESH_METADATA'] = 'True' else: copy_exclude_headers = ('HTTP_CONTENT_DISPOSITION', 'HTTP_CONTENT_ENCODING', 'HTTP_CONTENT_LANGUAGE', + 'CONTENT_TYPE', 'HTTP_EXPIRES', 'HTTP_CACHE_CONTROL', 'HTTP_X_ROBOTS_TAG') diff --git a/test/unit/common/middleware/s3api/test_obj.py b/test/unit/common/middleware/s3api/test_obj.py index d67f3c939..de55c9b2b 100644 --- a/test/unit/common/middleware/s3api/test_obj.py +++ b/test/unit/common/middleware/s3api/test_obj.py @@ -717,8 +717,7 @@ class TestS3ApiObj(S3ApiTestCase): self.assertEqual(headers['Content-Disposition'], 'how are you') self.assertEqual(headers['Content-Encoding'], 'good and you') self.assertEqual(headers['Content-Language'], 'great') - # Content-Type can't be set during an S3 copy operation - self.assertIsNone(headers.get('Content-Type')) + self.assertEqual(headers['Content-Type'], 'so') self.assertEqual(headers['Expires'], 'yeah') self.assertEqual(headers['X-Robots-Tag'], 'bye') @@ -1207,5 +1206,6 @@ class TestS3ApiObjNonUTC(TestS3ApiObj): os.environ['TZ'] = self.orig_tz time.tzset() + if __name__ == '__main__': unittest.main() -- cgit v1.2.1