Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ install:
- pip install nose
- pip install pycodestyle
- pip install importlib_metadata
- pip install dicttoxml
- pip install xmltodict
- pip install crcmod
- pip install pycryptodome
notifications:
Expand Down
2 changes: 1 addition & 1 deletion qcloud_cos/.travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ install:
- pip install six
- pip install nose
- pip install pycodestyle
- pip install dicttoxml
- pip install xmltodict
- pip install crcmod
notifications:
email:
Expand Down
102 changes: 25 additions & 77 deletions qcloud_cos/cos_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
from six.moves.urllib.parse import quote, unquote, urlencode
from six import text_type, binary_type
from hashlib import md5
from dicttoxml import dicttoxml
from .streambody import StreamBody
from .xml2dict import Xml2Dict
from .cos_auth import CosS3Auth
Expand Down Expand Up @@ -747,8 +746,7 @@ def delete_objects(self, Bucket, Delete={}, **kwargs):
Delete=objects
)
"""
lst = ['<Object>', '</Object>'] # 类型为list的标签
xml_config = format_xml(data=Delete, root='Delete', lst=lst)
xml_config = format_xml(data=Delete, root='Delete')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
Expand Down Expand Up @@ -1141,12 +1139,9 @@ def put_object_acl(self, Bucket, Key, AccessControlPolicy={}, **kwargs):
GrantRead='id="qcs::cam::uin/123:uin/456",id="qcs::cam::uin/123:uin/123"'
)
"""
lst = [ # 类型为list的标签
'<Grant>',
'</Grant>']
xml_config = ""
if AccessControlPolicy:
xml_config = format_xml(data=AccessControlPolicy, root='AccessControlPolicy', lst=lst)
xml_config = format_xml(data=AccessControlPolicy, root='AccessControlPolicy')
headers = mapped(kwargs)
params = {'acl': ''}
url = self._conf.uri(bucket=Bucket, path=Key)
Expand Down Expand Up @@ -1610,12 +1605,9 @@ def put_bucket_acl(self, Bucket, AccessControlPolicy={}, **kwargs):
GrantRead='id="qcs::cam::uin/123:uin/456",id="qcs::cam::uin/123:uin/123"'
)
"""
lst = [ # 类型为list的标签
'<Grant>',
'</Grant>']
xml_config = ""
if AccessControlPolicy:
xml_config = format_xml(data=AccessControlPolicy, root='AccessControlPolicy', lst=lst)
xml_config = format_xml(data=AccessControlPolicy, root='AccessControlPolicy')
headers = mapped(kwargs)
params = {'acl': ''}
url = self._conf.uri(bucket=Bucket)
Expand Down Expand Up @@ -1699,18 +1691,7 @@ def put_bucket_cors(self, Bucket, CORSConfiguration={}, **kwargs):
CORSConfiguration=cors_config
)
"""
lst = [ # 类型为list的标签
'<CORSRule>',
'<AllowedOrigin>',
'<AllowedMethod>',
'<AllowedHeader>',
'<ExposeHeader>',
'</CORSRule>',
'</AllowedOrigin>',
'</AllowedMethod>',
'</AllowedHeader>',
'</ExposeHeader>']
xml_config = format_xml(data=CORSConfiguration, root='CORSConfiguration', lst=lst)
xml_config = format_xml(data=CORSConfiguration, root='CORSConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
Expand Down Expand Up @@ -1833,17 +1814,7 @@ def put_bucket_lifecycle(self, Bucket, LifecycleConfiguration={}, **kwargs):
)
"""
# 类型为list的标签
lst = [
'<Rule>',
'<Tag>',
'<Transition>',
'<NoncurrentVersionTransition>',
'</NoncurrentVersionTransition>',
'</Transition>',
'</Tag>',
'</Rule>'
]
xml_config = format_xml(data=LifecycleConfiguration, root='LifecycleConfiguration', lst=lst)
xml_config = format_xml(data=LifecycleConfiguration, root='LifecycleConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
Expand Down Expand Up @@ -2068,8 +2039,7 @@ def put_bucket_replication(self, Bucket, ReplicationConfiguration={}, **kwargs):
ReplicationConfiguration=replication_config
)
"""
lst = ['<Rule>', '</Rule>'] # 类型为list的标签
xml_config = format_xml(data=ReplicationConfiguration, root='ReplicationConfiguration', lst=lst)
xml_config = format_xml(data=ReplicationConfiguration, root='ReplicationConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
Expand Down Expand Up @@ -2197,7 +2167,12 @@ def put_bucket_website(self, Bucket, WebsiteConfiguration={}, **kwargs):
WebsiteConfiguration=website_config
)
"""
xml_config = format_xml(data=WebsiteConfiguration, root='WebsiteConfiguration', parent_child=True)
# 重构 WebsiteConfiguration['RoutingRules']
WebsiteConfigurationCpy = copy.deepcopy(WebsiteConfiguration)
if 'RoutingRules' in WebsiteConfigurationCpy.keys():
WebsiteConfigurationCpy['RoutingRules'] = {'RoutingRule': WebsiteConfigurationCpy['RoutingRules']}

xml_config = format_xml(data=WebsiteConfigurationCpy, root='WebsiteConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
Expand Down Expand Up @@ -2496,8 +2471,7 @@ def put_bucket_domain(self, Bucket, DomainConfiguration={}, **kwargs):
DomainConfiguration=domain_config
)
"""
lst = ['<DomainRule>', '</DomainRule>'] # 类型为list的标签
xml_config = format_xml(data=DomainConfiguration, root='DomainConfiguration', lst=lst)
xml_config = format_xml(data=DomainConfiguration, root='DomainConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
Expand Down Expand Up @@ -2600,8 +2574,7 @@ def put_bucket_domain_certificate(self, Bucket, DomainCertificateConfiguration,
DomainCertificateConfiguration=domain_cert_config
)
"""
lst = ['<DomainList>', '</DomainList>'] # 类型为list的标签
xml_config = format_xml(data=DomainCertificateConfiguration, root='DomainCertificate', lst=lst)
xml_config = format_xml(data=DomainCertificateConfiguration, root='DomainCertificate')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
Expand Down Expand Up @@ -2714,8 +2687,7 @@ def put_bucket_origin(self, Bucket, OriginConfiguration={}, **kwargs):
OriginConfiguration=origin_config
)
"""
lst = ['<OriginRule>', '</OriginRule>'] # 类型为list的标签
xml_config = format_xml(data=OriginConfiguration, root='OriginConfiguration', lst=lst)
xml_config = format_xml(data=OriginConfiguration, root='OriginConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
Expand Down Expand Up @@ -2848,9 +2820,8 @@ def put_bucket_inventory(self, Bucket, Id, InventoryConfiguration={}, **kwargs):
InventoryConfiguration=inventory_config
)
"""
lst = ['<Field>', '</Field>'] # 类型为list的标签
InventoryConfiguration['Id'] = Id
xml_config = format_xml(data=InventoryConfiguration, root='InventoryConfiguration', lst=lst)
xml_config = format_xml(data=InventoryConfiguration, root='InventoryConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
Expand Down Expand Up @@ -2965,8 +2936,7 @@ def put_object_tagging(self, Bucket, Key, Tagging={}, **kwargs):
Tagging=tagging_set
)
"""
lst = ['<Tag>', '</Tag>'] # 类型为list的标签
xml_config = format_xml(data=Tagging, root='Tagging', lst=lst)
xml_config = format_xml(data=Tagging, root='Tagging')
headers = mapped(kwargs)
params = {'tagging': ''}
if 'versionId' in headers:
Expand Down Expand Up @@ -3089,8 +3059,7 @@ def put_bucket_tagging(self, Bucket, Tagging={}, **kwargs):
Tagging=tagging_set
)
"""
lst = ['<Tag>', '</Tag>'] # 类型为list的标签
xml_config = format_xml(data=Tagging, root='Tagging', lst=lst)
xml_config = format_xml(data=Tagging, root='Tagging')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
Expand Down Expand Up @@ -3203,8 +3172,7 @@ def put_bucket_referer(self, Bucket, RefererConfiguration={}, **kwargs):
RefererConfiguration=referer_config
)
"""
lst = ['<Domain>', '</Domain>'] # 类型为list的标签
xml_config = format_xml(data=RefererConfiguration, root='RefererConfiguration', lst=lst)
xml_config = format_xml(data=RefererConfiguration, root='RefererConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
Expand Down Expand Up @@ -4059,13 +4027,7 @@ def put_bucket_encryption(self, Bucket, ServerSideEncryptionConfiguration={}, **
:param kwargs(dict): 设置请求的headers.
:return: None.
"""
# 类型为list的标签
lst = [
'<Rule>',
'</Rule>'
]
xml_config = format_xml(data=ServerSideEncryptionConfiguration, root='ServerSideEncryptionConfiguration',
lst=lst)
xml_config = format_xml(data=ServerSideEncryptionConfiguration, root='ServerSideEncryptionConfiguration')
headers = mapped(kwargs)
params = {'encryption': ''}
url = self._conf.uri(bucket=Bucket)
Expand Down Expand Up @@ -6012,21 +5974,7 @@ def ci_auditing_image_batch(self, Bucket, Input, DetectType=None, BizType=None,
'Conf': conf
}

lst = [ # 类型为list的标签
'<Input>',
'<Object>',
'<Url>',
'<Interval>',
'<MaxFrames>',
'<DataId>',
'</Input>',
'</Object>',
'</Url>',
'</Interval>',
'</MaxFrames>',
'</DataId>']

xml_request = format_xml(data=request, root='Request', lst=lst)
xml_request = format_xml(data=request, root='Request')
headers['Content-Type'] = 'application/xml'

path = 'image/auditing'
Expand Down Expand Up @@ -6586,7 +6534,7 @@ def ci_create_media_jobs(self, Bucket, Jobs={}, Lst={}, **kwargs):

:param Bucket(string): 存储桶名称.
:param Jobs(dict): 创建任务的配置.
:param Lst(dict): 创建任务dict转xml时去除Key数组.
:param Lst(dict): 创建任务dict转xml时去除Key数组. TODO 替换成 xmltodict 库后可以将 Lst 参数去掉
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.

Expand All @@ -6613,7 +6561,7 @@ def ci_create_media_jobs(self, Bucket, Jobs={}, Lst={}, **kwargs):
headers = final_headers

params = format_values(params)
xml_config = format_xml(data=Jobs, root='Request', lst=Lst)
xml_config = format_xml(data=Jobs, root='Request')
path = "/jobs"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("create_media_jobs result, url=:{url} ,headers=:{headers}, params=:{params}, xml_config=:{xml_config}".format(
Expand All @@ -6640,7 +6588,7 @@ def ci_create_media_pic_jobs(self, Bucket, Jobs={}, Lst={}, **kwargs):

:param Bucket(string): 存储桶名称.
:param Jobs(dict): 创建任务的配置.
:param Lst(dict): 创建任务dict转xml时去除Key数组.
:param Lst(dict): 创建任务dict转xml时去除Key数组. TODO 替换为 xmltodict 库后可以将 Lst 参数去掉
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.

Expand All @@ -6667,7 +6615,7 @@ def ci_create_media_pic_jobs(self, Bucket, Jobs={}, Lst={}, **kwargs):
headers = final_headers

params = format_values(params)
xml_config = format_xml(data=Jobs, root='Request', lst=Lst)
xml_config = format_xml(data=Jobs, root='Request')
path = "/pic_jobs"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("create_media_pic_jobs result, url=:{url} ,headers=:{headers}, params=:{params}, xml_config=:{xml_config}".format(
Expand Down
23 changes: 15 additions & 8 deletions qcloud_cos/cos_comm.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import xml.dom.minidom
import xml.etree.ElementTree
from datetime import datetime
from dicttoxml import dicttoxml
from xmltodict import unparse
from .xml2dict import Xml2Dict
from .cos_exception import CosClientError
from .cos_exception import CosServiceError
Expand Down Expand Up @@ -202,14 +202,21 @@ def mapped(headers):
return _headers


def format_xml(data, root, lst=list(), parent_child=False):
# def format_xml(data, root, lst=list(), parent_child=False):
# """将dict转换为xml, xml_config是一个bytes"""
# if parent_child:
# xml_config = dicttoxml(data, item_func=lambda x: x[:-2], custom_root=root, attr_type=False)
# else:
# xml_config = dicttoxml(data, item_func=lambda x: x, custom_root=root, attr_type=False)
# for i in lst:
# xml_config = xml_config.replace(to_bytes(i + i), to_bytes(i))
# return xml_config


def format_xml(data, root):
"""将dict转换为xml, xml_config是一个bytes"""
if parent_child:
xml_config = dicttoxml(data, item_func=lambda x: x[:-1], custom_root=root, attr_type=False)
else:
xml_config = dicttoxml(data, item_func=lambda x: x, custom_root=root, attr_type=False)
for i in lst:
xml_config = xml_config.replace(to_bytes(i + i), to_bytes(i))
input_dict = {root: data}
xml_config = unparse(input_dict=input_dict).encode('utf-8')
return xml_config


Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
dicttoxml
xmltodict
six
crcmod
pycryptodome
Loading