@@ -82,6 +82,10 @@ def xml_to_dict(data):
8282 """V5使用xml格式,将response中的xml转换为dict"""
8383 root = xml .etree .ElementTree .fromstring (data )
8484 xmldict = Xml2Dict (root )
85+ xmlstr = str (xmldict )
86+ xmlstr = xmlstr .replace ("{http://www.qcloud.com/document/product/436/7751}" , "" )
87+ xmlstr = xmlstr .replace ("{http://www.w3.org/2001/XMLSchema-instance}" , "" )
88+ xmldict = eval (xmlstr )
8589 return xmldict
8690
8791
@@ -351,11 +355,8 @@ def complete_multipart_upload(self, Bucket, Key, UploadId, MultipartUpload={}, *
351355 data = dict_to_xml (MultipartUpload ),
352356 timeout = 1200 , # 分片上传大文件的时间比较长,设置为20min
353357 headers = headers )
354- response = dict ()
355358 data = xml_to_dict (rt .text )
356- for key in data .keys ():
357- response [key [key .find ('}' )+ 1 :]] = data [key ]
358- return response
359+ return data
359360
360361 def abort_multipart_upload (self , Bucket , Key , UploadId , ** kwargs ):
361362 """放弃一个已经存在的分片上传任务,删除所有已经存在的分片"""
@@ -383,18 +384,45 @@ def list_parts(self, Bucket, Key, UploadId, **kwargs):
383384 url = url ,
384385 auth = CosS3Auth (self ._conf ._access_id , self ._conf ._access_key ),
385386 headers = headers )
387+ data = xml_to_dict (rt .text )
388+ if 'Part' in data .keys () and isinstance (data ['Part' ], dict ): # 只有一个part,将dict转为list,保持一致
389+ lst = []
390+ lst .append (data ['Part' ])
391+ data ['Part' ] = lst
392+ return data
393+
394+ def put_object_acl (self , Bucket , Key , ** kwargs ):
395+ """设置object ACL"""
396+ headers = mapped (kwargs )
397+ url = self ._conf .uri (bucket = Bucket , path = Key + "?acl" )
398+ logger .info ("put object acl, url=:{url} ,headers=:{headers}" .format (
399+ url = url ,
400+ headers = headers ))
401+ rt = self .send_request (
402+ method = 'PUT' ,
403+ url = url ,
404+ auth = CosS3Auth (self ._conf ._access_id , self ._conf ._access_key ),
405+ headers = headers )
406+ return None
386407
408+ def get_object_acl (self , Bucket , Key , ** kwargs ):
409+ """获取object ACL"""
410+ headers = mapped (kwargs )
411+ url = self ._conf .uri (bucket = Bucket , path = Key + "?acl" )
412+ logger .info ("get object acl, url=:{url} ,headers=:{headers}" .format (
413+ url = url ,
414+ headers = headers ))
415+ rt = self .send_request (
416+ method = 'GET' ,
417+ url = url ,
418+ auth = CosS3Auth (self ._conf ._access_id , self ._conf ._access_key ),
419+ headers = headers )
387420 data = xml_to_dict (rt .text )
388- if 'Part' in data .keys ():
389- if isinstance (data ['Part' ], list ):
390- return data
391- else : # 只有一个part,将dict转为list,保持一致
392- lst = []
393- lst .append (data ['Part' ])
394- data ['Part' ] = lst
395- return data
396- else :
397- return data
421+ if data ['AccessControlList' ] is not None and isinstance (data ['AccessControlList' ]['Grant' ], dict ):
422+ lst = []
423+ lst .append (data ['AccessControlList' ]['Grant' ])
424+ data ['AccessControlList' ]['Grant' ] = lst
425+ return data
398426
399427 # s3 bucket interface begin
400428 def create_bucket (self , Bucket , ** kwargs ):
@@ -445,16 +473,58 @@ def list_objects(self, Bucket, Delimiter="", Marker="", MaxKeys=1000, Prefix="",
445473 auth = CosS3Auth (self ._conf ._access_id , self ._conf ._access_key ))
446474
447475 data = xml_to_dict (rt .text )
448- if 'Contents' in data .keys ():
449- if isinstance (data ['Contents' ], list ):
450- return data
451- else : # 只有一个Contents,将dict转为list,保持一致
476+ if 'Contents' in data .keys () and isinstance (data ['Contents' ], dict ): # 只有一个Contents,将dict转为list,保持一致
452477 lst = []
453478 lst .append (data ['Contents' ])
454479 data ['Contents' ] = lst
455- return data
456- else :
457- return data
480+ return data
481+
482+ def head_bucket (self , Bucket , ** kwargs ):
483+ """获取bucket信息"""
484+ headers = mapped (kwargs )
485+ url = self ._conf .uri (bucket = Bucket )
486+ logger .info ("head bucket, url=:{url} ,headers=:{headers}" .format (
487+ url = url ,
488+ headers = headers ))
489+ rt = self .send_request (
490+ method = 'HEAD' ,
491+ url = url ,
492+ auth = CosS3Auth (self ._conf ._access_id , self ._conf ._access_key ),
493+ headers = headers )
494+ return None
495+
496+ def put_bucket_acl (self , Bucket , ** kwargs ):
497+ """设置bucket ACL"""
498+ headers = mapped (kwargs )
499+ url = self ._conf .uri (bucket = Bucket , path = "?acl" )
500+ logger .info ("put bucket acl, url=:{url} ,headers=:{headers}" .format (
501+ url = url ,
502+ headers = headers ))
503+ rt = self .send_request (
504+ method = 'PUT' ,
505+ url = url ,
506+ auth = CosS3Auth (self ._conf ._access_id , self ._conf ._access_key ),
507+ headers = headers )
508+ return None
509+
510+ def get_bucket_acl (self , Bucket , ** kwargs ):
511+ """获取bucket ACL"""
512+ headers = mapped (kwargs )
513+ url = self ._conf .uri (bucket = Bucket , path = "?acl" )
514+ logger .info ("get bucket acl, url=:{url} ,headers=:{headers}" .format (
515+ url = url ,
516+ headers = headers ))
517+ rt = self .send_request (
518+ method = 'GET' ,
519+ url = url ,
520+ auth = CosS3Auth (self ._conf ._access_id , self ._conf ._access_key ),
521+ headers = headers )
522+ data = xml_to_dict (rt .text )
523+ if data ['AccessControlList' ] is not None and isinstance (data ['AccessControlList' ]['Grant' ], dict ):
524+ lst = []
525+ lst .append (data ['AccessControlList' ]['Grant' ])
526+ data ['AccessControlList' ]['Grant' ] = lst
527+ return data
458528
459529 # service interface begin
460530 def list_buckets (self , ** kwargs ):
@@ -468,6 +538,10 @@ def list_buckets(self, **kwargs):
468538 auth = CosS3Auth (self ._conf ._access_id , self ._conf ._access_key ),
469539 )
470540 data = xml_to_dict (rt .text )
541+ if data ['Buckets' ] is not None and isinstance (data ['Buckets' ]['Bucket' ], dict ):
542+ lst = []
543+ lst .append (data ['Buckets' ]['Bucket' ])
544+ data ['Buckets' ]['Bucket' ] = lst
471545 return data
472546
473547if __name__ == "__main__" :
0 commit comments