summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimur Alperovich <timuralp@swiftstack.com>2019-05-13 18:38:24 -0700
committerTim Burke <tim.burke@gmail.com>2019-10-18 13:59:39 -0700
commit40f9114679e02bcbd870d285dfb31041362632b9 (patch)
tree849a32a98fb36e321ae613e3e4491bd2234bc954
parent3d5f7aa41db7dd06e0965bd7494f2b23e7caf3f3 (diff)
downloadswift-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.yaml1
-rw-r--r--doc/s3api/conf/ceph-known-failures-tempauth.yaml1
-rw-r--r--swift/common/middleware/s3api/s3request.py3
-rw-r--r--test/unit/common/middleware/s3api/test_obj.py4
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()