Use xmltodict for parsing

This commit is contained in:
Antoine Wendlinger 2020-04-27 11:42:27 +02:00
parent 9ed6e52d0a
commit 41abd4344b

View File

@ -839,21 +839,22 @@ class ResponseObject(_TemplateEnvironmentMixin, ActionAuthenticatorMixin):
def _bucket_response_delete_keys(self, request, body, bucket_name): def _bucket_response_delete_keys(self, request, body, bucket_name):
template = self.response_template(S3_DELETE_KEYS_RESPONSE) template = self.response_template(S3_DELETE_KEYS_RESPONSE)
body_dict = xmltodict.parse(body)
objects = minidom.parseString(body).getElementsByTagName("Object") objects = body_dict["Delete"].get("Object", [])
if not isinstance(objects, list):
deleted_objects = [] # We expect a list of objects, but when there is a single <Object> node xmltodict does not
error_names = [] # return a list.
objects = [objects]
if len(objects) == 0: if len(objects) == 0:
raise MalformedXML() raise MalformedXML()
deleted_objects = []
error_names = []
for object_ in objects: for object_ in objects:
key_name = object_.getElementsByTagName("Key")[0].firstChild.nodeValue key_name = object_["Key"]
version_id_node = object_.getElementsByTagName("VersionId") version_id = object_.get("VersionId", None)
if version_id_node:
version_id = version_id_node[0].firstChild.nodeValue
else:
version_id = None
success = self.backend.delete_key( success = self.backend.delete_key(
bucket_name, undo_clean_key_name(key_name), version_id=version_id bucket_name, undo_clean_key_name(key_name), version_id=version_id