Skip to content

Commit 8eb6f8b

Browse files
committed
Update delete objects xml escape.
1 parent 708db2f commit 8eb6f8b

File tree

3 files changed

+100
-16
lines changed

3 files changed

+100
-16
lines changed

oss2/xml_utils.py

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -711,34 +711,58 @@ def to_complete_upload_request(parts):
711711

712712
return _node_to_string(root)
713713

714+
def _xml_escape(key):
715+
if key is None:
716+
return None
714717

715-
def to_batch_delete_objects_request(keys, quiet):
716-
root_node = ElementTree.Element('Delete')
718+
new_key = ""
719+
escape_keys = {
720+
'\t' :'	',
721+
'\r' : '
',
722+
'\n' : '
',
723+
'"' :'"',
724+
'&' : '&',
725+
'<' : '&lt;',
726+
'>' : '&gt;'
727+
}
728+
729+
for i in range(0, len(key)):
730+
if escape_keys.get(key[i]) is not None:
731+
new_key += escape_keys.get(key[i])
732+
else:
733+
new_key += key[i]
717734

718-
_add_text_child(root_node, 'Quiet', str(quiet).lower())
735+
return new_key
719736

737+
def to_batch_delete_objects_request(keys, quiet):
738+
xml_body = "<Delete>"
739+
xml_body += "<Quiet>" + str(quiet).lower() + "</Quiet>"
740+
720741
for key in keys:
721-
object_node = ElementTree.SubElement(root_node, 'Object')
722-
_add_text_child(object_node, 'Key', key)
742+
new_key = _xml_escape(key)
743+
object_body = "<Object>" + "<Key>" + new_key + "</Key>" + "</Object>"
744+
xml_body += object_body
723745

724-
return _node_to_string(root_node)
746+
xml_body += "</Delete>"
725747

726-
def to_batch_delete_objects_version_request(objectVersions, quiet):
727-
728-
root_node = ElementTree.Element('Delete')
748+
return xml_body
729749

730-
_add_text_child(root_node, 'Quiet', str(quiet).lower())
750+
def to_batch_delete_objects_version_request(objectVersions, quiet):
751+
xml_body = "<Delete>"
752+
xml_body += "<Quiet>" + str(quiet).lower() + "</Quiet>"
731753

732754
objectVersionList = objectVersions.object_version_list
733-
734755
for ver in objectVersionList:
735-
object_node = ElementTree.SubElement(root_node, 'Object')
736-
_add_text_child(object_node, 'Key', ver.key)
737-
if ver.versionid != '':
738-
_add_text_child(object_node, 'VersionId', ver.versionid)
756+
new_key = _xml_escape(ver.key)
757+
object_body = "<Object>"
758+
object_body += "<Key>" + new_key + "</Key>"
759+
object_body += "<VersionId>" + ver.versionid + "</VersionId>"
760+
object_body += "</Object>"
761+
xml_body += object_body
739762

740-
return _node_to_string(root_node)
763+
xml_body += "</Delete>"
741764

765+
return xml_body
742766

743767
def to_put_bucket_config(bucket_config):
744768
root = ElementTree.Element('CreateBucketConfiguration')

tests/test_object.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,17 @@ def test_batch_delete_objects(self):
387387
for object in object_list:
388388
self.assertTrue(not self.bucket.object_exists(object))
389389

390+
def test_batch_delete_objects_specificalChars(self):
391+
object_name = "测试中文python-bswodnvsttpqvnzwsgifetwe\n\n\t@#$!\t<>!@#$%^&*()-="
392+
for i in range(1, 32):
393+
object_name += chr(i)
394+
395+
result = self.bucket.put_object(object_name, "123")
396+
397+
key_list = [object_name]
398+
self.bucket.batch_delete_objects(key_list)
399+
self.assertFalse(self.bucket.object_exists(object_name))
400+
390401
def test_batch_delete_objects_empty(self):
391402
try:
392403
self.bucket.batch_delete_objects([])

tests/test_object_versioning.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,6 +1025,55 @@ def test_delete_object_versions_with_invalid_arguments(self):
10251025
self.assertRaises(oss2.exceptions.ClientError, bucket.delete_object_versions, None)
10261026
self.assertRaises(oss2.exceptions.ClientError, bucket.delete_object_versions, [])
10271027

1028+
def test_batch_delete_verions_with_specifical_chars(self):
1029+
1030+
from oss2.models import BucketVersioningConfig
1031+
from oss2.models import BatchDeleteObjectVersion
1032+
from oss2.models import BatchDeleteObjectVersionList
1033+
1034+
auth = oss2.Auth(OSS_ID, OSS_SECRET)
1035+
bucket_name = OSS_BUCKET + "-test-batch-delete-versions-spec-chars"
1036+
bucket = oss2.Bucket(auth, self.endpoint, bucket_name)
1037+
1038+
bucket.create_bucket(oss2.BUCKET_ACL_PRIVATE)
1039+
1040+
wait_meta_sync()
1041+
1042+
config = BucketVersioningConfig()
1043+
config.status = 'Enabled'
1044+
1045+
result = bucket.put_bucket_versioning(config)
1046+
1047+
wait_meta_sync()
1048+
1049+
result = bucket.get_bucket_info()
1050+
1051+
object_name = "测试中文python-bswodnvsttpqvnzwsgifetwe\n\n\t@#$!\t<>!@#$%^&*()-="
1052+
for i in range(1, 32):
1053+
object_name += chr(i)
1054+
1055+
# put version 1
1056+
result = bucket.put_object(object_name, "123")
1057+
self.assertEqual(int(result.status)/100, 2)
1058+
self.assertTrue(result.versionid != "")
1059+
versionid1 = result.versionid
1060+
1061+
version_list = BatchDeleteObjectVersionList()
1062+
version_list.append(BatchDeleteObjectVersion(key=object_name, versionid=versionid1))
1063+
1064+
self.assertTrue(version_list.len(), 1)
1065+
1066+
result = bucket.delete_object_versions(version_list)
1067+
1068+
self.assertTrue(len(result.delete_versions) == 1)
1069+
self.assertTrue(result.delete_versions[0].versionid == versionid1)
1070+
1071+
self.assertFalse(bucket.object_exists(object_name))
1072+
1073+
try:
1074+
bucket.delete_bucket()
1075+
except:
1076+
self.assertFalse(True, "should not get a exception")
10281077

10291078
if __name__ == '__main__':
10301079
unittest.main()

0 commit comments

Comments
 (0)