diff options
author | Timur Alperovich <timuralp@swiftstack.com> | 2019-05-13 18:38:24 -0700 |
---|---|---|
committer | Tim Burke <tim.burke@gmail.com> | 2019-10-18 13:59:39 -0700 |
commit | 40f9114679e02bcbd870d285dfb31041362632b9 (patch) | |
tree | 849a32a98fb36e321ae613e3e4491bd2234bc954 | |
parent | 3d5f7aa41db7dd06e0965bd7494f2b23e7caf3f3 (diff) | |
download | swift-40f9114679e02bcbd870d285dfb31041362632b9.tar.gz |
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)
-rw-r--r-- | doc/s3api/conf/ceph-known-failures-keystone.yaml | 1 | ||||
-rw-r--r-- | doc/s3api/conf/ceph-known-failures-tempauth.yaml | 1 | ||||
-rw-r--r-- | swift/common/middleware/s3api/s3request.py | 3 | ||||
-rw-r--r-- | 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() |