def test_response_s3api_sysmeta_headers(self): for _server_type in ('object', 'container'): swift_headers = HeaderKeyDict( {sysmeta_prefix(_server_type) + 'test': 'ok'}) resp = Response(headers=swift_headers) s3resp = S3Response.from_swift_resp(resp) self.assertEqual(swift_headers, s3resp.sysmeta_headers)
def test_from_swift_resp_slo(self): for expected, header_vals in \ ((True, ('true', '1')), (False, ('false', 'ugahhh', None))): for val in header_vals: resp = Response(headers={'X-Static-Large-Object': val}) s3resp = S3Response.from_swift_resp(resp) self.assertEqual(expected, s3resp.is_slo)
def test_response_s3api_sysmeta_from_swift3_sysmeta(self): for _server_type in ('object', 'container'): # swift could return older swift3 sysmeta swift_headers = HeaderKeyDict( {('x-%s-sysmeta-swift3-' % _server_type) + 'test': 'ok'}) resp = Response(headers=swift_headers) s3resp = S3Response.from_swift_resp(resp) expected_headers = HeaderKeyDict( {sysmeta_prefix(_server_type) + 'test': 'ok'}) # but Response class should translates as s3api sysmeta self.assertEqual(expected_headers, s3resp.sysmeta_headers)
def test_response_s3api_sysmeta_headers_ignore_other_sysmeta(self): for _server_type in ('object', 'container'): swift_headers = HeaderKeyDict( # sysmeta not leading sysmeta_prefix even including s3api word {'x-%s-sysmeta-test-s3api' % _server_type: 'ok', sysmeta_prefix(_server_type) + 'test': 'ok'}) resp = Response(headers=swift_headers) s3resp = S3Response.from_swift_resp(resp) expected_headers = HeaderKeyDict( {sysmeta_prefix(_server_type) + 'test': 'ok'}) self.assertEqual(expected_headers, s3resp.sysmeta_headers)
def test_response_swift3_sysmeta_does_not_overwrite_s3api_sysmeta(self): for _server_type in ('object', 'container'): # same key name except sysmeta prefix swift_headers = HeaderKeyDict( {('x-%s-sysmeta-swift3-' % _server_type) + 'test': 'ng', sysmeta_prefix(_server_type) + 'test': 'ok'}) resp = Response(headers=swift_headers) s3resp = S3Response.from_swift_resp(resp) expected_headers = HeaderKeyDict( {sysmeta_prefix(_server_type) + 'test': 'ok'}) # but only s3api sysmeta remains in the response sysmeta_headers self.assertEqual(expected_headers, s3resp.sysmeta_headers)
def test_from_swift_resp_slo(self): for expected, header_vals in \ ((True, ('true', '1')), (False, ('false', 'ugahhh', None))): for val in header_vals: resp = Response(headers={'X-Static-Large-Object': val, 'Etag': 'theetag'}) s3resp = S3Response.from_swift_resp(resp) self.assertEqual(expected, s3resp.is_slo) if s3resp.is_slo: self.assertEqual('"theetag-N"', s3resp.headers['ETag']) else: self.assertEqual('"theetag"', s3resp.headers['ETag'])
def test_response_s3api_user_meta_headers(self): resp = Response(headers={ 'X-Object-Meta-Foo': 'Bar', 'X-Object-Meta-Non-\xdcnicode-Value': '\xff', 'X-Object-Sysmeta-Baz': 'quux', 'Etag': 'unquoted', 'Content-type': 'text/plain', 'content-length': '0', }) s3resp = S3Response.from_swift_resp(resp) self.assertEqual(dict(s3resp.headers), { 'x-amz-meta-foo': 'Bar', 'x-amz-meta-non-\xdcnicode-value': '\xff', 'ETag': '"unquoted"', 'Content-Type': 'text/plain', 'Content-Length': '0', })