Include object sysmeta in POST responses
This is *only* sysmeta, to ensure we neither change the semantics of the response (which could happen if we included allowed_headers) nor reveal previously-written metadata to write-only clients (which could happen if we ever get updateable object metadata and sent back user meta). We could conceivably send back transient sysmeta, though it seems better to wait for a use-case that demands it. Change-Id: I04fe0b36b85e546b5379bed12089ffd1bce01fcf Co-Authored-By: Thiago da Silva <thiago@redhat.com>
This commit is contained in:
parent
acb8971c76
commit
d0144962f6
@ -47,7 +47,7 @@ from swift.common.base_storage_server import BaseStorageServer
|
||||
from swift.common.header_key_dict import HeaderKeyDict
|
||||
from swift.common.request_helpers import get_name_and_placement, \
|
||||
is_user_meta, is_sys_or_user_meta, is_object_transient_sysmeta, \
|
||||
resolve_etag_is_at_header
|
||||
resolve_etag_is_at_header, is_sys_meta
|
||||
from swift.common.swob import HTTPAccepted, HTTPBadRequest, HTTPCreated, \
|
||||
HTTPInternalServerError, HTTPNoContent, HTTPNotFound, \
|
||||
HTTPPreconditionFailed, HTTPRequestTimeout, HTTPUnprocessableEntity, \
|
||||
@ -621,7 +621,14 @@ class ObjectController(BaseStorageServer):
|
||||
self.container_update(
|
||||
'PUT', account, container, obj, request, update_headers,
|
||||
device, policy)
|
||||
return HTTPAccepted(request=request)
|
||||
|
||||
# Add sysmeta to response
|
||||
resp_headers = {}
|
||||
for key, value in orig_metadata.items():
|
||||
if is_sys_meta('object', key):
|
||||
resp_headers[key] = value
|
||||
|
||||
return HTTPAccepted(request=request, headers=resp_headers)
|
||||
|
||||
@public
|
||||
@timing_stats()
|
||||
|
@ -187,6 +187,7 @@ class TestObjectController(unittest.TestCase):
|
||||
'Foo': 'fooheader',
|
||||
'Baz': 'bazheader',
|
||||
'X-Object-Sysmeta-Color': 'blue',
|
||||
'X-Object-Transient-Sysmeta-Shape': 'circle',
|
||||
'X-Object-Meta-1': 'One',
|
||||
'X-Object-Meta-Two': 'Two'}
|
||||
req = Request.blank('/sda1/p/a/c/o', environ={'REQUEST_METHOD': 'PUT'},
|
||||
@ -217,6 +218,7 @@ class TestObjectController(unittest.TestCase):
|
||||
self.assertEqual(dict(resp.headers), {
|
||||
'Content-Type': 'text/html; charset=UTF-8',
|
||||
'Content-Length': str(len(resp.body)),
|
||||
'X-Object-Sysmeta-Color': 'blue',
|
||||
})
|
||||
|
||||
req = Request.blank('/sda1/p/a/c/o')
|
||||
@ -255,6 +257,7 @@ class TestObjectController(unittest.TestCase):
|
||||
self.assertEqual(dict(resp.headers), {
|
||||
'Content-Type': 'text/html; charset=UTF-8',
|
||||
'Content-Length': str(len(resp.body)),
|
||||
'X-Object-Sysmeta-Color': 'blue',
|
||||
})
|
||||
|
||||
req = Request.blank('/sda1/p/a/c/o')
|
||||
@ -325,6 +328,7 @@ class TestObjectController(unittest.TestCase):
|
||||
self.assertEqual(dict(resp.headers), {
|
||||
'Content-Type': 'text/html; charset=UTF-8',
|
||||
'Content-Length': str(len(resp.body)),
|
||||
'X-Object-Sysmeta-Color': 'red',
|
||||
})
|
||||
|
||||
req = Request.blank('/sda1/p/a/c/o')
|
||||
@ -355,6 +359,7 @@ class TestObjectController(unittest.TestCase):
|
||||
self.assertEqual(dict(resp.headers), {
|
||||
'Content-Type': 'text/html; charset=UTF-8',
|
||||
'Content-Length': str(len(resp.body)),
|
||||
'X-Object-Sysmeta-Color': 'red',
|
||||
})
|
||||
|
||||
req = Request.blank('/sda1/p/a/c/o')
|
||||
|
Loading…
x
Reference in New Issue
Block a user