diff --git a/openstack/object_store/v1/_base.py b/openstack/object_store/v1/_base.py index 96b620ede..d429b13a1 100644 --- a/openstack/object_store/v1/_base.py +++ b/openstack/object_store/v1/_base.py @@ -84,7 +84,10 @@ class BaseResource(resource.Resource): self.metadata = dict() for header in headers: - if header.startswith(self._custom_metadata_prefix): + # RADOS and other stuff in front may actually lowcase headers + if header.lower().startswith( + self._custom_metadata_prefix.lower() + ): key = header[len(self._custom_metadata_prefix):].lower() self.metadata[key] = headers[header] diff --git a/openstack/tests/unit/object_store/v1/test_obj.py b/openstack/tests/unit/object_store/v1/test_obj.py index b4af0c540..30f58a3f4 100644 --- a/openstack/tests/unit/object_store/v1/test_obj.py +++ b/openstack/tests/unit/object_store/v1/test_obj.py @@ -116,6 +116,15 @@ class TestObject(base_test_object.BaseTestObject): self.assertEqual(self.headers['Content-Type'], sot.content_type) self.assertEqual(self.headers['X-Delete-At'], sot.delete_at) + # Verify that we also properly process lowcased headers + # All headers are processed in _base._set_metadata therefore invoke it + # here directly + sot._set_metadata(headers={"x-object-meta-foo": "bar"}) + self.assert_no_calls() + + # Attributes from header + self.assertEqual("bar", sot.metadata["foo"]) + def test_download(self): headers = { 'X-Newest': 'True',