o
    iP                    @   s  d Z ddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lm	Z	 ddlT ddl
mZmZmZmZ ddlT ddl	T ddlZddlZeeZG dd deZG dd deZG dd deZdd ZdZdZdZdZdd Zdd Zdd Z G dd deZ!dS )u%.  
文件上传方法中的data参数
------------------------
诸如 :func:`put_object <Bucket.put_object>` 这样的上传接口都会有 `data` 参数用于接收用户数据。`data` 可以是下述类型
    - unicode类型（对于Python3则是str类型）：内部会自动转换为UTF-8的bytes
    - bytes类型：不做任何转换
    - file-like object：对于可以seek和tell的file object，从当前位置读取直到结束。其他类型，请确保当前位置是文件开始。
    - 可迭代类型：对于无法探知长度的数据，要求一定是可迭代的。此时会通过Chunked Encoding传输。

Bucket配置修改方法中的input参数
-----------------------------
诸如 :func:`put_bucket_cors <Bucket.put_bucket_cors>` 这样的Bucket配置修改接口都会有 `input` 参数接收用户提供的配置数据。
`input` 可以是下述类型
  - Bucket配置信息相关的类，如 `BucketCors`
  - unicode类型（对于Python3则是str类型）
  - 经过utf-8编码的bytes类型
  - file-like object
  - 可迭代类型，会通过Chunked Encoding传输
也就是说 `input` 参数可以比 `data` 参数多接受第一种类型的输入。

返回值
------
:class:`Service` 和 :class:`Bucket` 类的大多数方法都是返回 :class:`RequestResult <oss2.models.RequestResult>`
及其子类。`RequestResult` 包含了HTTP响应的状态码、头部以及OSS Request ID，而它的子类则包含用户真正想要的结果。例如，
`ListBucketsResult.buckets` 就是返回的Bucket信息列表；`GetObjectResult` 则是一个file-like object，可以调用 `read()` 来获取响应的
HTTP包体。

:class:`CryptoBucket`:
加密接口
-------
CryptoBucket仅提供上传下载加密数据的接口，诸如`get_object` 、 `put_object` ，返回值与Bucket相应接口一致。


异常
----
一般来说Python SDK可能会抛出三种类型的异常，这些异常都继承于 :class:`OssError <oss2.exceptions.OssError>` ：
    - :class:`ClientError <oss2.exceptions.ClientError>` ：由于用户参数错误而引发的异常；
    - :class:`ServerError <oss2.exceptions.ServerError>` 及其子类：OSS服务器返回非成功的状态码，如4xx或5xx；
    - :class:`RequestError <oss2.exceptions.RequestError>` ：底层requests库抛出的异常，如DNS解析错误，超时等；
当然，`Bucket.put_object_from_file` 和 `Bucket.get_object_to_file` 这类函数还会抛出文件相关的异常。


.. _byte_range:

指定下载范围
------------
诸如 :func:`get_object <Bucket.get_object>` 以及 :func:`upload_part_copy <Bucket.upload_part_copy>` 这样的函数，可以接受
`byte_range` 参数，表明读取数据的范围。该参数是一个二元tuple：(start, last)。这些接口会把它转换为Range头部的值，如：
    - byte_range 为 (0, 99) 转换为 'bytes=0-99'，表示读取前100个字节
    - byte_range 为 (None, 99) 转换为 'bytes=-99'，表示读取最后99个字节
    - byte_range 为 (100, None) 转换为 'bytes=100-'，表示读取第101个字节到文件结尾的部分（包含第101个字节）


分页罗列
-------
罗列各种资源的接口，如 :func:`list_buckets <Service.list_buckets>` 、 :func:`list_objects <Bucket.list_objects>` 都支持
分页查询。通过设定分页标记（如：`marker` 、 `key_marker` ）的方式可以指定查询某一页。首次调用将分页标记设为空（缺省值，可以不设），
后续的调用使用返回值中的 `next_marker` 、 `next_key_marker` 等。每次调用后检查返回值中的 `is_truncated` ，其值为 `False` 说明
已经到了最后一页。

.. _line_range:

指定查询CSV文件范围
------------
诸如 :func:`select_object <Bucket.select_object>` 以及 :func:`select_object_to_file <Bucket.select_object_to_file>` 这样的函数的select_csv_params参数，可以接受
`LineRange` 参数，表明读取CSV数据的范围。该参数是一个二元tuple：(start, last):
    - LineRange 为 (0, 99) 表示读取前100行
    - LineRange 为 (None, 99) 表示读取最后99行
    - LineRange 为 (100, None) 表示读取第101行到文件结尾的部分（包含第101行）

.. _split_range:

指定查询CSV文件范围
------------
split可以认为是切分好的大小大致相等的csv行簇。每个Split大小大致相等，这样以便更好的做到负载均衡。
诸如 :func:`select_object <Bucket.select_object>` 以及 :func:`select_object_to_file <Bucket.select_object_to_file>` 这样的函数的select_csv_params参数，可以接受
`SplitRange` 参数，表明读取CSV数据的范围。该参数是一个二元tuple：(start, last):
    - SplitRange 为 (0, 9) 表示读取前10个Split
    - SplitRange 为 (None, 9) 表示读取最后9个split
    - SplitRange 为 (10, None) 表示读取第11个split到文件结尾的部分（包含第11个Split）

分页查询
-------
和create_csv_object_meta配合使用，有两种方法：
    - 方法1：先获取文件总的行数(create_csv_object_meta返回)，然后把文件以line_range分成若干部分并行查询
    - 方法2：先获取文件总的Split数(create_csv_object_meta返回), 然后把文件分成若干个请求，每个请求含有大致相等的Split

.. _progress_callback:

上传下载进度
-----------
上传下载接口，诸如 `get_object` 、 `put_object` 、`resumable_upload`，都支持进度回调函数，可以用它实现进度条等功能。

`progress_callback` 的函数原型如下 ::

    def progress_callback(bytes_consumed, total_bytes):
        '''进度回调函数。

        :param int bytes_consumed: 已经消费的字节数。对于上传，就是已经上传的量；对于下载，就是已经下载的量。
        :param int total_bytes: 总长度。
        '''

其中 `total_bytes` 对于上传和下载有不同的含义：
    - 上传：当输入是bytes或可以seek/tell的文件对象，那么它的值就是总的字节数；否则，其值为None
    - 下载：当返回的HTTP相应中有Content-Length头部，那么它的值就是Content-Length的值；否则，其值为None


.. _unix_time:

Unix Time
---------
OSS Python SDK会把从服务器获得时间戳都转换为自1970年1月1日UTC零点以来的秒数，即Unix Time。
参见 `Unix Time <https://en.wikipedia.org/wiki/Unix_time>`_

OSS中常用的时间格式有
    - HTTP Date格式，形如 `Sat, 05 Dec 2015 11:04:39 GMT` 这样的GMT时间。
      用在If-Modified-Since、Last-Modified这些HTTP请求、响应头里。
    - ISO8601格式，形如 `2015-12-05T00:00:00.000Z`。
      用在生命周期管理配置、列举Bucket结果中的创建时间、列举文件结果中的最后修改时间等处。

`http_date` 函数把Unix Time转换为HTTP Date；而 `http_to_unixtime` 则做相反的转换。如 ::

    >>> import oss2, time
    >>> unix_time = int(time.time())             # 当前UNIX Time，设其值为 1449313829
    >>> date_str = oss2.http_date(unix_time)     # 得到 'Sat, 05 Dec 2015 11:10:29 GMT'
    >>> oss2.http_to_unixtime(date_str)          # 得到 1449313829

.. note::

    生成HTTP协议所需的日期（即HTTP Date）时，请使用 `http_date` ， 不要使用 `strftime` 这样的函数。因为后者是和locale相关的。
    比如，`strftime` 结果中可能会出现中文，而这样的格式，OSS服务器是不能识别的。

`iso8601_to_unixtime` 把ISO8601格式转换为Unix Time；`date_to_iso8601` 和 `iso8601_to_date` 则在ISO8601格式的字符串和
datetime.date之间相互转换。如 ::

    >>> import oss2
    >>> d = oss2.iso8601_to_date('2015-12-05T00:00:00.000Z')  # 得到 datetime.date(2015, 12, 5)
    >>> date_str = oss2.date_to_iso8601(d)                    # 得到 '2015-12-05T00:00:00.000Z'
    >>> oss2.iso8601_to_unixtime(date_str)                    # 得到 1449273600

.. _select_params:

    指定OSS Select的文件格式。
    对于Csv文件，支持如下Keys:
    >>> CsvHeaderInfo: None|Use|Ignore   #None表示没有CSV Schema头，Use表示启用CSV Schema头，可以在Select语句中使用Name，Ignore表示有CSV Schema头，但忽略它（Select语句中不可以使用Name)
                        默认值是None
    >>> CommentCharacter: Comment字符,默认值是#,不支持多个字符
    >>> RecordDelimiter: 行分隔符，默认是
,最多支持两个字符分隔符（比如:
)
    >>> FieldDelimiter: 列分隔符，默认是逗号(,), 不支持多个字符
    >>> QuoteCharacter: 列Quote字符，默认是双引号("),不支持多个字符。注意转义符合Quote字符相同。
    >>> LineRange: 指定查询CSV文件的行范围，参见 `line_range`。
    >>> SplitRange: 指定查询CSV文件的Split范围，参见 `split_range`.
        注意LineRange和SplitRange两种不能同时指定。若同时指定LineRange会被忽略。
    >>> CompressionType: 文件的压缩格式，默认值是None, 支持GZIP。
    >>> OutputRawData: 指定是响应Body返回Raw数据，默认值是False.
    >>> SkipPartialDataRecord: 当CSV行数据不完整时(select语句中出现的列在该行为空)，是否跳过该行。默认是False。
    >>> OutputHeader:是否输出CSV Header，默认是False.
    >>> EnablePayloadCrc:是否启用对Payload的CRC校验,默认是False. 该选项不能和OutputRawData:True混用。
    >>> MaxSkippedRecordsAllowed: 允许跳过的最大行数。默认值是0表示一旦有一行跳过就报错。当下列两种情况下该行CSV被跳过:1）当SkipPartialDataRecord为True时且该行不完整时 2）当该行的数据类型和SQL不匹配时
    对于Json 文件, 支持如下Keys:
    >>> Json_Type: DOCUMENT | LINES . DOCUMENT就是指一般的Json文件，LINES是指每一行是一个合法的JSON对象，文件由多行Json对象组成，整个文件本身不是合法的Json对象。
    >>> LineRange: 指定查询JSON LINE文件的行范围，参见 `line_range`。注意该参数仅支持LINES类型
    >>> SplitRange: 指定查询JSON LINE文件的Split范围，参见 `split_range`.注意该参数仅支持LINES类型
    >>> CompressionType: 文件的压缩格式，默认值是None, 支持GZIP。
    >>> OutputRawData: 指定是响应Body返回Raw数据，默认值是False. 
    >>> SkipPartialDataRecord: 当一条JSON记录数据不完整时(select语句中出现的Key在该对象为空)，是否跳过该Json记录。默认是False。
    >>> EnablePayloadCrc:是否启用对Payload的CRC校验,默认是False. 该选项不能和OutputRawData:True混用。
    >>> MaxSkippedRecordsAllowed: 允许跳过的最大Json记录数。默认值是0表示一旦有一条Json记录跳过就报错。当下列两种情况下该JSON被跳过:1）当SkipPartialDataRecord为True时且该条Json记录不完整时 2）当该记录的数据类型和SQL不匹配时
    >>> ParseJsonNumberAsString: 将Json文件中的数字解析成字符串。使用场景是当Json文件中的浮点数精度较高时，系统默认的浮点数精度无法达到要求，当解析成字符串时将完整保留原始数据精度，在Sql中使用Cast可以将字符串无精度损失地转成decimal.
    >>> AllowQuotedRecordDelimiter: 允许CSV中的列包含转义过的换行符。默认为true。当值为False时，select API可以用Range：bytes来设置选取目标对象内容的范围
    ‘
.. _select_meta_params:

    create_select_object_meta参数集合，支持如下Keys:
    - RecordDelimiter: CSV换行符，最多支持两个字符
    - FieldDelimiter: CSV列分隔符，最多支持一个字符
    - QuoteCharacter: CSV转移Quote符，最多支持一个字符
    - OverwriteIfExists: true|false. true表示重新获得csv meta，并覆盖原有的meta。一般情况下不需要使用

    N   )	xml_utils)http)utils)
exceptions)defaults)models)select_params)*)urlquoteurlparse
to_unicode	to_stringc                   @   s4   e Zd Z	dddZdd Zd	d
 Zedd ZdS )_Base TNFc                 C   s   || _ t| | _t| jdurtd||pt	 | _
t|tj| _|| _|| _|| _|	| _d| _|
| _| jd urBd| _t| j||| _|| _t| j dr_| j  dkrad| _d S d S d S )NTz:The endpoint you has specified is not valid, endpoint: {0}osszoss-cloudboxauth_versionv1F)auth_normalize_endpointstripendpointr   is_valid_endpointClientErrorformatr   Sessionsessionr   getconnect_timeouttimeoutapp_name
enable_crcproxiesregionproductcloudbox_id	_UrlMaker	_make_urlis_verify_object_stricthasattrr   )selfr   r   is_cnamer   r   r    r!   r"   r#   r%   is_path_styler(    r-   </home/ubuntu/.local/lib/python3.10/site-packages/oss2/api.py__init__   s&   

z_Base.__init__c           	      K   s   t |}tj|| ||f| j| j| j| j| jd|}| j	
||| | jj|| jd}|jd dkrDt|}td| |t|jdt}|d urX|dkrX|  |S )N)r    r"   r#   r$   r%   r   d      Exception: {0}content-lengthr   )r   r   Requestr'   r    r"   r#   r$   r%   r   _sign_requestr   
do_requestr   statusr   make_exceptionloggerinfor   r   _hgetheadersintread)	r*   methodbucket_namekeykwargsreqrespecontent_lengthr-   r-   r.   _do   s(   
z	_Base._doc                 K   s   t j||f| j| jd|}| jj|| jd}|jd dkr.t	|}t
d| |t|jdt}|d urB|dkrB|  |S )N)r    r"   r0   r1   r2   r3   r4   r   )r   r5   r    r"   r   r7   r   r8   r   r9   r:   r;   r   r   r<   r=   r>   r?   )r*   r@   sign_urlrC   rD   rE   rF   rG   r-   r-   r.   _do_url   s   
z_Base._do_urlc                 C   s   || }|||    |S N)r?   )rE   
parse_funcklassresultr-   r-   r.   _parse_result  s   z_Base._parse_result)r   TNNNFT)__name__
__module____qualname__r/   rH   rJ   staticmethodrO   r-   r-   r-   r.   r      s    
r   c                       s   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
Z							d1 fdd	Zd2ddZdd Zd3ddZd4ddZd5ddZd6ddZd7ddZdd  Zd!d" Zd5d#d$Zd%d& Zd5d'd(Zd)d* Zd+d, Zd5d-d.Zd/d0 Z  ZS )8Serviceu  用于Service操作的类，如罗列用户所有的Bucket。

    用法 ::

        >>> import oss2
        >>> auth = oss2.Auth('your-access-key-id', 'your-access-key-secret')
        >>> service = oss2.Service(auth, 'oss-cn-hangzhou.aliyuncs.com')
        >>> service.list_buckets()
        <oss2.models.ListBucketsResult object at 0x0299FAB0>

    :param auth: 包含了用户认证信息的Auth对象
    :type auth: oss2.Auth

    :param str endpoint: 访问域名，如杭州区域的域名为oss-cn-hangzhou.aliyuncs.com

    :param session: 会话。如果是None表示新开会话，非None则复用传入的会话
    :type session: oss2.Session

    :param float connect_timeout: 连接超时时间，以秒为单位。
    :param str app_name: 应用名。该参数不为空，则在User Agent中加入其值。
        注意到，最终这个字符串是要作为HTTP Header的值传输的，所以必须要遵循HTTP标准。
    qosInforegionszx-oss-write-get-object-responsepublicAccessBlockrequesterQosInfoqosRequesterresourcePoolInforesourcePoolresourcePoolBucketsNr   Fc
           
         s>   t d|||| tt| j||d|||||||	d
 d S )NzRInit oss service, endpoint: {0}, connect_timeout: {1}, app_name: {2}, proxies: {3}F)r    r"   r#   r%   r,   )r:   debugr   superrT   r/   )
r*   r   r   r   r   r    r"   r#   r%   r,   	__class__r-   r.   r/   6  s   
zService.__init__r1   c                 C   s   t d||| i }||d< ||d< t||d< t|}|dur(|| | jddd||d}t d	|j|j	 | 
|tjtS )
u  根据前缀罗列用户的Bucket。

        :param str prefix: 只罗列Bucket名为该前缀的Bucket，空串表示罗列所有的Bucket
        :param str marker: 分页标志。首次调用传空串，后续使用返回值中的next_marker
        :param int max_keys: 每次调用最多返回的Bucket数目
        :param dict params: list操作参数，传入'tag-key','tag-value'对结果进行过滤
        :param headers: 用户指定的HTTP头部。可以指定Content-Type、Content-MD5、x-oss-meta-开头的头部等。可以是dict，建议是oss2.CaseInsensitiveDict

        :return: 罗列的结果
        :rtype: oss2.models.ListBucketsResult
        z>Start to list buckets, prefix: {0}, marker: {1}, max-keys: {2}prefixmarkermax-keysNGETr   paramsr=   z0List buckets done, req_id: {0}, status_code: {1})r:   r]   r   strr   CaseInsensitiveDictupdaterH   
request_idr8   rO   r   parse_list_bucketsListBucketsResult)r*   ra   rb   max_keysrf   r=   	listParamrE   r-   r-   r.   list_bucketsD  s   

zService.list_bucketsc                 C   H   t d | jdddtjdid}t d|j|j | |t	j
tS )uo   获取User的QoSInfo
        :return: :class:`GetUserQosInfoResult <oss2.models.GetUserQosInfoResult>`
        zStart to get user qos info.rd   r   rf   z*get use qos, req_id: {0}, status_code: {1})r:   r]   rH   rT   QOS_INFOr   rj   r8   rO   r   parse_get_qos_infoGetUserQosInfoResultr*   rE   r-   r-   r.   get_user_qos_info`  s   
zService.get_user_qos_infoc                 C   sH   t d | jdddtj|id}t d|j|j | |t	j
tS )u  查询所有支持地域或者指定地域对应的Endpoint信息，包括外网Endpoint、内网Endpoint和传输加速Endpoint。

        :param str regions : 地域。
        :return: :class:`DescribeRegionsResult <oss2.models.DescribeRegionsResult>`
        zStart to describe regionsrd   r   rq   z4Describe regions done, req_id: {0}, status_code: {1})r:   r]   rH   rT   REGIONSr   rj   r8   rO   r   parse_describe_regionsDescribeRegionsResult)r*   rV   rE   r-   r-   r.   describe_regionsi  s   
zService.describe_regionsc                 C   sx   t d| t|}|r||d< |r||d< |r||d< | jdddtjdi||d}t d|j|j	 t
|S )	u  write get object response.
        :param route: fc return route
        :param token: fc return token
        :param fwd_status: fwd_status

        :param data: 待上传的内容。
        :type data: bytes，str或file-like object

        :param headers: 用户指定的HTTP头部。可以指定Content-Type、Content-MD5、x-oss-meta-开头的头部等
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z0Start to write get object response, headers: {0}zx-oss-request-routezx-oss-request-tokenzx-oss-fwd-statusPOSTr   rf   r=   dataz=write get object response done, req_id: {0}, status_code: {1})r:   r]   r   r   rh   rH   rT   WRITE_GET_OBJECT_RESPONSErj   r8   RequestResult)r*   routetoken
fwd_statusr}   r=   rE   r-   r-   r.   write_get_object_responsev  s   
z!Service.write_get_object_responsec                 C   \   t d|| | jdddtjdd|dt|id}t d|j|j | 	|t
jtS )u.  列举请求者所有的存储冗余转换任务。

        :param str continuation_token: 分页标志,首次调用传空串
        :param int max_keys: 最多返回数目

        :return: :class:`ListUserDataRedundancyTransitionResult <oss2.models.ListUserDataRedundancyTransitionResult>`
        zUStart to list user data redundancy transition, continuation token: {0}, max keys: {1}rd   r   continuation-tokenrc   rq   zHList user data redundancy transition done, req_id: {0}, status_code: {1})r:   r]   r   rH   BucketREDUNDANCY_TRANSITIONrg   rj   r8   rO   r   *parse_list_user_data_redundancy_transition&ListUserDataRedundancyTransitionResultr*   continuation_tokenrm   rE   r-   r-   r.   $list_user_data_redundancy_transition     $z,Service.list_user_data_redundancy_transitionc              
   C   sT   t d | jdddtjddt|d|id}t d|j|j | 	|t
jtS )u  查询某个Bucket下所有接入点。
        param: int max_keys: 本次list返回access point的最大个数
        param: str continuation_token: list时指定的起始标记

        :return: :class:`ListBucketStyleResult <oss2.models.ListBucketStyleResult>`
        z!Start to list bucket access pointrd   r   rc   r   rq   z;query list access point done, req_id: {0}, status_code: {1})r:   r]   rH   r   ACCESS_POINTrg   r   rj   r8   rO   r   parse_list_access_point_resultListAccessPointResultr*   rm   r   rE   r-   r-   r.   list_access_points  s   
$zService.list_access_pointsc                 C   sL   t d t|}| jddd|tjdid}t d|j|j	 t
|S )u   为OSS全局开启阻止公共访问。

        :param bool block_public_access : 是否开启阻止公共访问。
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z Start to put public access blockPUTr   r}   rf   z;Put public access block done, req_id: {0}, status_code: {1})r:   r]   r   "to_put_public_access_block_requestrH   rT   PUBLIC_ACCESS_BLOCKr   rj   r8   r   r*   block_public_accessr}   rE   r-   r-   r.   put_public_access_block  s
   

zService.put_public_access_blockc                 C   rp   )u   获取OSS全局阻止公共访问的配置信息。

        :return: :class:`GetPublicAccessBlockResult <oss2.models.GetPublicAccessBlockResult>`
        z Start to get public access blockrd   r   rq   z;Get public access block done, req_id: {0}, status_code: {1})r:   r]   rH   rT   r   r   rj   r8   rO   r   $parse_get_public_access_block_resultGetPublicAccessBlockResultru   r-   r-   r.   get_public_access_block  s   
zService.get_public_access_blockc                 C   s@   t d | jdddtjdid}t d|j|j t|S )u~   删除OSS全局阻止公共访问配置信息。

        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z#Start to delete public access blockDELETEr   rq   z>Delete public access block done, req_id: {0}, status_code: {1})	r:   r]   rH   rT   r   r   rj   r8   r   ru   r-   r-   r.   delete_public_access_block  s   
z"Service.delete_public_access_blockc                 C   r   )u  列举当前主账号在当前地域下的资源池。

        :param str continuation_token: 分页标志,首次调用传空串
        :param int max_keys: 最多返回数目

        :return: :class:`ListResourcePoolsResult <oss2.models.ListResourcePoolsResult>`
        zDStart to list resource pools, continuation_token: {0}, max_keys: {1}rd   r   r   rc   rq   z7List resource pools done, req_id: {0}, status_code: {1})r:   r]   r   rH   rT   RESOURCE_POOLrg   rj   r8   rO   r   parse_list_resource_poolsListResourcePoolsResultr   r-   r-   r.   list_resource_pools  r   zService.list_resource_poolsc                 C   s`   t d| |std| jdddtjdtj|id}t d|j|j	 | 
|tjtS )u   获取特定资源池的基本信息。

        :param str resource_pool_name : 请求的资源池的名称。
        :return: :class:`ResourcePoolInfoResult <oss2.models.ResourcePoolInfoResult>`
        z*Start to get resource pool info, uid: {0}.&resource_pool_name should not be emptyrd   r   rq   z:Get resource pool info done, req_id: {0}, status_code: {1})r:   r]   r   r   rH   rT   RESOURCE_POOL_INFOr   rj   r8   rO   r   parse_get_resource_pool_infoResourcePoolInfoResult)r*   resource_pool_namerE   r-   r-   r.   get_resource_pool_info  s   zService.get_resource_pool_infoc                 C   p   t d||| |std| jdddtjdtj|d|dt|id}t d|j	|j
 | |tjtS )	uZ  获取特定资源池中的Bucket列表。

        :param str resource_pool_name : 请求的资源池的名称。
        :param str continuation_token: 分页标志,首次调用传空串
        :param int max_keys: 最多返回数目

        :return: :class:`ListResourcePoolBucketsResult <oss2.models.ListResourcePoolBucketsResult>`
        zbStart to list resource pool buckets, resource_pool_name:{0} continuation_token: {1}, max_keys: {2}r   rd   r   r   rc   rq   z>List resource pool buckets done, req_id: {0}, status_code: {1})r:   r]   r   r   rH   rT   RESOURCE_POOL_BUCKETSr   rg   rj   r8   rO   r    parse_list_resource_pool_bucketsListResourcePoolBucketsResultr*   r   r   rm   rE   r-   r-   r.   list_resource_pool_buckets     	*z"Service.list_resource_pool_bucketsc                 C   sz   t d||| |std|stdt|}| jddd|tjdtj	|tj
|id}t d|j|j t|S )uF  修改子账号在资源池的请求者流控配置。

        :param str uid: 请求者UID
        :param str resource_pool_name: 请求的资源池的名称
        :param qos_configuration :class:`QoSConfiguration <oss2.models.QoSConfiguration>`
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        zhStart to put resource pool requester qos info, uid: {0}, resource_pool_name: {1}, qos_configuration: {2}uid should not be emptyr   r   r   r   zHPut resource pool requester qos info done, req_id: {0}, status_code: {1})r:   r]   r   r   r   to_put_qos_inforH   rT   REQUESTER_QOS_INFOQOS_REQUESTERr   rj   r8   r   )r*   uidr   qos_configurationr}   rE   r-   r-   r.   $put_resource_pool_requester_qos_info  s   
&z,Service.put_resource_pool_requester_qos_infoc              
   C   st   t d|| |std|std| jdddtjdtj|tj|id}t d|j	|j
 | |tjtS )u   获取子账号在资源池的流控配置。

        :return: :class:`RequesterQoSInfoResult <oss2.models.RequesterQoSInfoResult>`
        zQStart to get resource pool requester qos info, uid: {0}, resource_pool_name: {1}.r   r   rd   r   rq   zHGet resource pool requester qos info done, req_id: {0}, status_code: {1})r:   r]   r   r   rH   rT   r   r   r   rj   r8   rO   r   parse_get_requester_qos_infoRequesterQoSInfoResultr*   r   r   rE   r-   r-   r.   $get_resource_pool_requester_qos_info  s   $z,Service.get_resource_pool_requester_qos_infoc                 C   r   )	uw  列举子账号账号在资源池的流控配置。

        :param str resource_pool_name : 请求的资源池的名称。
        :param str continuation_token: 分页标志,首次调用传空串
        :param int max_keys: 最多返回数目

        :return: :class:`ListResourcePoolRequesterQoSInfosResult <oss2.models.ListResourcePoolRequesterQoSInfosResult>`
        znStart to list resource pool requester qos infos, resource_pool_name:{0} continuation_token: {1}, max_keys: {2}r   rd   r   r   rc   rq   zJList resource pool requester qos infos done, req_id: {0}, status_code: {1})r:   r]   r   r   rH   rT   r   r   rg   rj   r8   rO   r   ,parse_list_resource_pool_requester_qos_infos'ListResourcePoolRequesterQoSInfosResultr   r-   r-   r.   &list_resource_pool_requester_qos_infos'  r   z.Service.list_resource_pool_requester_qos_infosc              
   C   sl   t d|| |std|std| jdddtjdtj|tj|id}t d|j	|j
 t|S )u   删除子账号在资源池的请求者流控配置。

        :return: :class:`RequestResult <oss2.models.RequestResult>`
        zTStart to delete resource pool requester qos info, uid: {0}, resource_pool_name: {1}.r   r   r   r   rq   zKDelete resource pool requester qos info done, req_id: {0}, status_code: {1})r:   r]   r   r   rH   rT   r   r   r   rj   r8   r   r   r-   r-   r.   'delete_resource_pool_requester_qos_info8  s   $z/Service.delete_resource_pool_requester_qos_info)NNr   NNNF)r   r   r1   NN)r   rK   r   r1   r1   r   F)rP   rQ   rR   __doc__rr   rw   r~   r   r   r   r   r   r   r/   ro   rv   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r-   r-   r_   r.   rT     sF    

	






rT   c                       sF  e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6Z8d7Z9d8Z:d7Z9d9Z;d:Z<d;Z=d<Z>	=	>	>	?	@	>	>	>	=	@d fdAdB	Z?ddCdDZ@dEdF ZAddHdIZBddKdLZC	>	>ddMdNZD	>	>ddOdPZEddQdRZF	>	>ddSdTZG	>	>	>ddUdVZH	>	>	>	>	>ddWdXZI	>	>	>	>ddYdZZJ	>	>	>	>	>dd[d\ZK	>	>	>dd]d^ZL	>	>	>dd_d`ZM	>	>	>ddadbZNddcddZOddedfZPddgdhZQddidjZRddkdlZSdmdn ZTddodpZUddqdrZVddsdtZWddudvZXddwdxZYddydzZZdd{d|Z[dd}d~Z\dddZ]dddZ^	?	?	?	?		>dddZ_	>dddZ`	>dddZadddZbdddZcdddZddd Zedd Zfdd Zgdd Zhdd Zidd ZjdddZkdd Zldd Zmdd Zndd Zodd Zpdd Zqdd Zrdd Zsdd Ztdd Zudd Zvdd Zwdd Zxdd Zydd Zzdd Z{dddZ|dd Z}ddÄ Z~ddń ZdddȄZddʄ Zddd̄Zddd΄ZdddЄZddd҄ZddԄ Zddք Zdd؄ ZdddڄZdd܄ ZdddބZ	?	>dddZdddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  ZdddZdd ZdddZdd Zdd	d
ZdddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Zd?d@ ZddAdBZdCdD ZdEdF ZdGdH ZddIdJZdKdL ZdMdN ZÐdOdP ZĐdQdR ZŐdSdT ZƐdUdV ZǐdWdX ZȐdYdZ Zɐd[d\ Zʐd]d^ Zːdd_d`Z̐dadb Z͐dcdd Zΐdedf ZϐddgdhZАdidj Zѐdkdl ZҐddmdnZӐdodp ZԐdqdr ZՐdsdt Z֐dudv ZאddwdxZؐdydz Zِd{d| Zڐd}d~ Zېdd Z܇  ZS (  r   u  用于Bucket和Object操作的类，诸如创建、删除Bucket，上传、下载Object等。

    用法（假设Bucket属于杭州区域） ::

        >>> import oss2
        >>> auth = oss2.Auth('your-access-key-id', 'your-access-key-secret')
        >>> bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', 'your-bucket')
        >>> bucket.put_object('readme.txt', 'content of the object')
        <oss2.models.PutObjectResult object at 0x029B9930>

    :param auth: 包含了用户认证信息的Auth对象
    :type auth: oss2.ProviderAuth or oss2.ProviderAuthV4

    :param str endpoint: 访问域名或者CNAME
    :param str bucket_name: Bucket名
    :param bool is_cname: 如果endpoint是CNAME则设为True；反之，则为False。

    :param session: 会话。如果是None表示新开会话，非None则复用传入的会话
    :type session: oss2.Session

    :param float connect_timeout: 连接超时时间，以秒为单位。

    :param str app_name: 应用名。该参数不为空，则在User Agent中加入其值。
        注意到，最终这个字符串是要作为HTTP Header的值传输的，所以必须要遵循HTTP标准。

    :param bool is_verify_object_strict: 严格验证对象名称的标志。默认为True。
    aclcors	lifecyclelocationloggingrefererwebsitelivecompr8   vodsymlinkstat
bucketInfox-oss-processtagging
encryptionversions
versioning	versionIdrestore
objectMetapolicyrequestPaymentrU   qos
asyncFetch
sequential	inventoryinventoryIdr   wormwormId
wormExtendreplicationreplicationLocationreplicationProgresstransferAccelerationcname	metaQueryaccessmonitorresourceGroupstyle	styleNamezx-oss-async-processcallbackbucketArchiveDirectReadhttpsConfigredundancyTransitionzx-oss-target-redundancy-typez"x-oss-redundancy-transition-taskidaccessPointaccessPointPolicyx-oss-access-point-namerW   rX   rY   rZ   r[   FNr   Tc                    sl   t d|||||||	|
 tt| j||||||||	|
|||d | | _t	| jdur4t
dd S )NzInit Bucket: {0}, endpoint: {1}, isCname: {2}, connect_timeout: {3}, app_name: {4}, enabled_crc: {5}, region: {6}, proxies: {6})r    r!   r"   r#   r%   r,   r(   Tz,The bucket_name is invalid, please check it.)r:   r]   r   r^   r   r/   r   rA   r   is_valid_bucket_namer   )r*   r   r   rA   r+   r   r   r    r!   r"   r#   r%   r,   r(   r_   r-   r.   r/     s   
zBucket.__init__c           
      C   s   |du st | dkrtdt|}| jr |dr tdtd|| j	t||||| t
j|| | j	||||| j| j| jd}d}	|du rX| j|| j	||}	|	S | jj|| j	|||d	}	|	S )
u  生成签名URL。

        常见的用法是生成加签的URL以供授信用户下载，如为log.jpg生成一个5分钟后过期的下载链接::

            >>> bucket.sign_url('GET', 'log.jpg', 5 * 60)
            r'http://your-bucket.oss-cn-hangzhou.aliyuncs.com/logo.jpg?OSSAccessKeyId=YourAccessKeyId\&Expires=1447178011&Signature=UJfeJgvcypWq6Q%2Bm3IJcSHbvSak%3D'

        :param method: HTTP方法，如'GET'、'PUT'、'DELETE'等
        :type method: str
        :param key: 文件名
        :param expires: 过期时间（单位：秒），链接在当前时间再过expires秒后过期

        :param headers: 需要签名的HTTP头部，如名称以x-oss-meta-开头的头部（作为用户自定义元数据）、
            Content-Type头部等。对于下载，不需要填。
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :param params: 需要签名的HTTP查询参数

        :param slash_safe: 是否开启key名称中的‘/’转义保护，如果不开启'/'将会转义成%2F
        :type slash_safe: bool

        :param additional_headers: 额外的需要签名的HTTP头

        :return: 签名URL。
        Nr   z$The key is invalid, please check it.?z/The key cannot start with `?`, please check it.zoStart to sign_url, method: {0}, bucket: {1}, key: {2}, expires: {3}, headers: {4}, params: {5}, slash_safe: {6})r=   rf   r#   r$   r%   r   )in_additional_headers)lenr   r   r   r(   
startswithr:   r]   r   rA   r   r5   r'   r#   r$   r%   r   	_sign_url)
r*   r@   rB   expiresr=   rf   
slash_safeadditional_headersrD   rI   r-   r-   r.   rI     s.   zBucket.sign_urlc                 C   sp   t d| j||| | | jdddddd | }i }|dur-|dkr-||d	< | j|| j|||S )
u  生成RTMP推流的签名URL。
        常见的用法是生成加签的URL以供授信用户向OSS推RTMP流。

        :param channel_name: 直播频道的名称
        :param expires: 过期时间（单位：秒），链接在当前时间再过expires秒后过期
        :param playlist_name: 播放列表名称，注意与创建live channel时一致
        :param params: 需要签名的HTTP查询参数

        :return: 签名URL。
        zOSign RTMP url, bucket: {0}, channel_name: {1}, playlist_name: {2}, expires: {3}r   http://zrtmp://https:///Nr   playlistName)r:   r]   r   rA   r'   replacer   _sign_rtmp_url)r*   channel_nameplaylist_namer   urlrf   r-   r-   r.   sign_rtmp_url  s   
zBucket.sign_rtmp_urlr1   c              	   C   sr   t |}td| jt||t|| | jd|||t|dd|d}td|j	|j
 | |tjtS )u:  根据前缀罗列Bucket里的文件。

        :param str prefix: 只罗列文件名为该前缀的文件
        :param str delimiter: 分隔符。可以用来模拟目录
        :param str marker: 分页标志。首次调用传空串，后续使用返回值的next_marker
        :param int max_keys: 最多返回文件的个数，文件和目录的和不能超过该值

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`ListObjectsResult <oss2.models.ListObjectsResult>`
        z[Start to List objects, bucket: {0}, prefix: {1}, delimiter: {2}, marker: {3}, max-keys: {4}rd   r  )ra   	delimiterrb   rc   encoding-typere   z0List objects done, req_id: {0}, status_code: {1})r   rh   r:   r]   r   rA   r   _Bucket__do_bucketrg   rj   r8   rO   r   parse_list_objectsListObjectsResult)r*   ra   r  rb   rm   r=   rE   r-   r-   r.   list_objects  s"   
zBucket.list_objectsr  c	           
      C   s   t |}td| jt||||||| | jdd||||t|	 t||d|d}	td|	j
|	j | |	tjtS )u!  根据前缀罗列Bucket里的文件。

        :param str prefix: 只罗列文件名为该前缀的文件
        :param str delimiter: 分隔符。可以用来模拟目录
        :param str continuation_token: 分页标志。首次调用传空串，后续使用返回值的next_continuation_token
        :param str start_after: 起始文件名称，OSS会返回按照字典序排列start_after之后的文件。
        :param bool fetch_owner: 是否获取文件的owner信息，默认不返回。
        :param int max_keys: 最多返回文件的个数，文件和目录的和不能超过该值

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`ListObjectsV2Result <oss2.models.ListObjectsV2Result>`
        zStart to List objects, bucket: {0}, prefix: {1}, delimiter: {2}, continuation_token: {3}, start-after: {4}, fetch-owner: {5}, encoding_type: {6}, max-keys: {7}rd   2)z	list-typera   r  r   zstart-afterzfetch-ownerrc   r  re   z3List objects V2 done, req_id: {0}, status_code: {1})r   rh   r:   r]   r   rA   r   r	  rg   lowerrj   r8   rO   r   parse_list_objects_v2ListObjectsV2Result)
r*   ra   r  r   start_afterfetch_ownerencoding_typerm   r=   rE   r-   r-   r.   list_objects_v2  s*   


zBucket.list_objects_v2c                 C   s   t t||}|rt ||}| jrt |}td	| j
t|| | jd|||d}td	|j|j t|}| jrQ|jdurQt d|j|j|j |S )u"  上传一个普通文件。

        用法 ::
            >>> bucket.put_object('readme.txt', 'content of readme.txt')
            >>> with open(u'local_file.txt', 'rb') as f:
            >>>     bucket.put_object('remote_file.txt', f)

        :param key: 上传到OSS的文件名

        :param data: 待上传的内容。
        :type data: bytes，str或file-like object

        :param headers: 用户指定的HTTP头部。可以指定Content-Type、Content-MD5、x-oss-meta-开头的头部等
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :param progress_callback: 用户指定的进度回调函数。可以用来实现进度条等功能。参考 :ref:`progress_callback` 。

        :return: :class:`PutObjectResult <oss2.models.PutObjectResult>`
        z8Start to put object, bucket: {0}, key: {1}, headers: {2}r   r}   r=   z.Put object done, req_id: {0}, status_code: {1}N
put object)r   set_content_typer   rh   make_progress_adapterr!   make_crc_adapterr:   r]   r   rA   r   _Bucket__do_objectrj   r8   PutObjectResultcrc	check_crc)r*   rB   r}   r=   progress_callbackrE   rN   r-   r-   r.   
put_object:  s   
zBucket.put_objectc                 C   sp   t t||}td| jt|| t	t
|d}| j||||dW  d   S 1 s1w   Y  dS )u%  上传一个本地文件到OSS的普通文件。

        :param str key: 上传到OSS的文件名
        :param str filename: 本地文件名，需要有可读权限

        :param headers: 用户指定的HTTP头部。可以指定Content-Type、Content-MD5、x-oss-meta-开头的头部等
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :param progress_callback: 用户指定的进度回调函数。参考 :ref:`progress_callback`

        :return: :class:`PutObjectResult <oss2.models.PutObjectResult>`
        z;Put object from file, bucket: {0}, key: {1}, file path: {2}rbr=   r  N)r   r  r   rh   r:   r]   r   rA   r   openr   r  )r*   rB   filenamer=   r  fr-   r-   r.   put_object_from_filec  s   $zBucket.put_object_from_filec                 C   s   t |}|rt||}| jrt|}td| j	|| | j
d|||d}td|j|j t|}| jrK|jdurKtd|j|j|j |S )u   使用加签的url上传对象

        :param sign_url: 加签的url
        :param data: 待上传的数据
        :param headers: 用户指定的HTTP头部。可以指定Content-Type、Content-MD5、x-oss-meta-开头的头部等，必须和签名时保持一致
        :param progress_callback: 用户指定的进度回调函数。参考 :ref:`progress_callback`
        :return:
        zMStart to put object with signed url, bucket: {0}, sign_url: {1}, headers: {2}r   r  z7Put object with url done, req_id: {0}, status_code: {1}Nr  )r   rh   r   r  r!   r  r:   r]   r   rA   rJ   rj   r8   r  r  r  )r*   rI   r}   r=   r  rE   rN   r-   r-   r.   put_object_with_urlx  s   


zBucket.put_object_with_urlc                 C   sZ   t d| j|| tt|d}| j||||dW  d   S 1 s&w   Y  dS )u   使用加签的url上传本地文件到oss

        :param sign_url: 加签的url
        :param filename: 本地文件路径
        :param headers: 用户指定的HTTP头部。可以指定Content-Type、Content-MD5、x-oss-meta-开头的头部等，必须和签名时保持一致
        :param progress_callback: 用户指定的进度回调函数。参考 :ref:`progress_callback`
        :return:
        zPPut object from file with signed url, bucket: {0}, sign_url: {1}, file path: {2}r   r!  N)r:   r]   r   rA   r"  r   r&  )r*   rI   r#  r=   r  r$  r-   r-   r.   put_object_with_url_from_file  s   $z$Bucket.put_object_with_url_from_filec           	      C   s   t t||}|rt ||}| jr|durt ||}td	| j
t||| | jd|||dt|dd}td	|j|j t|}| jra|jdura|durat d|j|j|j |S )	u  追加上传一个文件。

        :param str key: 新的文件名，或已经存在的可追加文件名
        :param int position: 追加上传一个新的文件， `position` 设为0；追加一个已经存在的可追加文件， `position` 设为文件的当前长度。
            `position` 可以从上次追加的结果 `AppendObjectResult.next_position` 中获得。

        :param data: 用户数据
        :type data: str、bytes、file-like object或可迭代对象

        :param headers: 用户指定的HTTP头部。可以指定Content-Type、Content-MD5、x-oss-开头的头部等
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :param progress_callback: 用户指定的进度回调函数。参考 :ref:`progress_callback`

        :return: :class:`AppendObjectResult <oss2.models.AppendObjectResult>`

        :raises: 如果 `position` 和当前文件长度不一致，抛出 :class:`PositionNotEqualToLength <oss2.exceptions.PositionNotEqualToLength>` ；
                 如果当前文件不是可追加类型，抛出 :class:`ObjectNotAppendable <oss2.exceptions.ObjectNotAppendable>` ；
                 还会抛出其他一些异常
        NzJStart to append object, bucket: {0}, key: {1}, headers: {2}, position: {3}r{   r   )appendpositionr}   r=   rf   z0Append object done, req_id: {0}, statu_code: {1}zappend object)r   r  r   rh   r  r!   r  r:   r]   r   rA   r   r  rg   rj   r8   AppendObjectResultr  r  )	r*   rB   r)  r}   r=   r  init_crcrE   rN   r-   r-   r.   append_object  s$   zBucket.append_objectc           	   	   C   s   t |}t|}|r||d< |du ri n|}|r!|tj|i td| j	t
|||| | jd|||d}td|j|j t||| jS )u]  下载一个文件。

        用法 ::

            >>> result = bucket.get_object('readme.txt')
            >>> print(result.read())
            'hello world'

        :param key: 文件名
        :param byte_range: 指定下载范围。参见 :ref:`byte_range`

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :param progress_callback: 用户指定的进度回调函数。参考 :ref:`progress_callback`

        :param process: oss文件处理，如图像服务等。指定后process，返回的内容为处理后的文件。

        :param params: http 请求的查询字符串参数
        :type params: dict

        :return: file-like object

        :raises: 如果文件不存在，则抛出 :class:`NoSuchKey <oss2.exceptions.NoSuchKey>` ；还可能抛出其他异常
        rangeNuS   Start to get object, bucket: {0}， key: {1}, range: {2}, headers: {3}, params: {4}rd   r=   rf   z.Get object done, req_id: {0}, status_code: {1})r   rh   _make_range_stringri   r   PROCESSr:   r]   r   rA   r   r  rj   r8   GetObjectResultr!   )	r*   rB   
byte_ranger=   r  processrf   range_stringrE   r-   r-   r.   
get_object  s   
zBucket.get_objectc                 C   s   d}t |}t|}|r||d< d}|dkr/|du s+tj|vs+t|tj  dkr/tdt	||}	ddi}
|durFtj
|v rFd	|
d< d
| _| jd||	||
d}d}|durktj|v rkt|tj  dkrkd}t|||S )u  Select一个文件内容，支持(Csv,Json Doc,Json Lines及其GZIP压缩文件).

        用法 ::
        对于Csv:
            >>> result = bucket.select_object('access.log', 'select * from ossobject where _4 > 40')
            >>> print(result.read())
            'hello world'
        对于Json Doc: { contacts:[{"firstName":"abc", "lastName":"def"},{"firstName":"abc1", "lastName":"def1"}]}
            >>> result = bucket.select_object('sample.json', 'select s.firstName, s.lastName from ossobject.contacts[*] s', select_params = {"Json_Type":"DOCUMENT"})
        
        对于Json Lines: {"firstName":"abc", "lastName":"def"},{"firstName":"abc1", "lastName":"def1"}
            >>> result = bucket.select_object('sample.json', 'select s.firstName, s.lastName from ossobject s', select_params = {"Json_Type":"LINES"})

        :param key: 文件名
        :param sql: sql statement
        :param select_params: select参数集合,对于Json文件必须制定Json_Type类型。参见 :ref:`select_params`

        :param progress_callback: 用户指定的进度回调函数。参考 :ref:`progress_callback`
        :param byte_range: select content of specific range。可以设置Bytes header指定select csv时的文件起始offset和长度。
        
        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: file-like object

        :raises: 如果文件不存在，则抛出 :class:`NoSuchKey <oss2.exceptions.NoSuchKey>` ；还可能抛出其他异常
        Fr.  TNfalsezm"AllowQuotedRecordDelimiter" must be specified in select_params as False when "Range" is specified in header.r   z
csv/selectzjson/select  r{   r*  true)r   rh   r0  SelectParametersAllowQuotedRecordDelimiterrg   r  r   r   to_select_object	Json_Typer   r  EnablePayloadCrcSelectObjectResult)r*   rB   sqlr  r	   r3  r=   range_selectr5  bodyrf   rE   crc_enabledr-   r-   r.   select_object  s*   !
 zBucket.select_objectc           
   	   C   s   t d| jt|| tt|dL}| j||||||d}	|	jdu r,t	
|	| ntj|	||	j|	jd | jrW|du rW|du sLd|vsL|d dkrWtd|	j|	j|	j |	W  d   S 1 scw   Y  dS )	u  下载一个文件到本地文件。

        :param key: 文件名
        :param filename: 本地文件名。要求父目录已经存在，且有写权限。
        :param byte_range: 指定下载范围。参见 :ref:`byte_range`

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :param progress_callback: 用户指定的进度回调函数。参考 :ref:`progress_callback`

        :param process: oss文件处理，如图像服务等。指定后process，返回的内容为处理后的文件。

        :param params: http 请求的查询字符串参数
        :type params: dict

        :return: 如果文件不存在，则抛出 :class:`NoSuchKey <oss2.exceptions.NoSuchKey>` ；还可能抛出其他异常
        zBStart to get object to file, bucket: {0}, key: {1}, file path: {2}wb)r3  r=   r  r4  rf   Nrj   zAccept-Encodinggzipr   )r:   r]   r   rA   r   r"  r   r6  rG   shutilcopyfileobjr   copyfileobj_and_verifyrj   r!   r  
client_crc
server_crc)
r*   rB   r#  r3  r=   r  r4  rf   r$  rN   r-   r-   r.   get_object_to_file>  s   
$zBucket.get_object_to_filec                 C   sT   t |}t|}|r||d< td| j||| | jd||d}t||| j	S )u1  使用加签的url下载文件

        :param sign_url: 加签的url
        :param byte_range: 指定下载范围。参见 :ref:`byte_range`

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict，必须和签名时保持一致

        :param progress_callback: 用户指定的进度回调函数。参考 :ref:`progress_callback`

        :return: file-like object

        :raises: 如果文件不存在，则抛出 :class:`NoSuchKey <oss2.exceptions.NoSuchKey>` ；还可能抛出其他异常
        r.  zRStart to get object with url, bucket: {0}, sign_url: {1}, range: {2}, headers: {3}rd   r=   )
r   rh   r0  r:   r]   r   rA   rJ   r2  r!   )r*   rI   r3  r=   r  r5  rE   r-   r-   r.   get_object_with_urlg  s   

zBucket.get_object_with_urlc              	   C   s   t d| j|||| tt|d*}| j||||d}|jdu r*t	|| nt
j|||j|jd |W  d   S 1 sAw   Y  dS )u  使用加签的url下载文件

        :param sign_url: 加签的url
        :param filename: 本地文件名。要求父目录已经存在，且有写权限。
        :param byte_range: 指定下载范围。参见 :ref:`byte_range`

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict，，必须和签名时保持一致

        :param progress_callback: 用户指定的进度回调函数。参考 :ref:`progress_callback`

        :return: file-like object

        :raises: 如果文件不存在，则抛出 :class:`NoSuchKey <oss2.exceptions.NoSuchKey>` ；还可能抛出其他异常
        zbStart to get object with url, bucket: {0}, sign_url: {1}, file path: {2}, range: {3}, headers: {4}rE  )r3  r=   r  NrF  )r:   r]   r   rA   r"  r   rO  rG   rH  rI  r   rJ  rj   )r*   rI   r#  r3  r=   r  r$  rN   r-   r-   r.   get_object_with_url_to_file  s   

$z"Bucket.get_object_with_url_to_filec           
      C   s^   t t|d}| j|||||d}|D ]}	||	 q|W  d   S 1 s(w   Y  dS )u&  Select一个文件的内容到本地文件

        :param key: OSS文件名
        :param filename: 本地文件名。其父亲目录已经存在且有写权限。

        :param progress_callback: 调用进度的callback。参考 :ref:`progress_callback`
        :param select_params: select参数集合。参见 :ref:`select_params`

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: 如果文件不存在, 抛出 :class:`NoSuchKey <oss2.exceptions.NoSuchKey>`
        rE  )r  r	   r=   N)r"  r   rD  write)
r*   rB   r#  r@  r  r	   r=   r$  rN   chunkr-   r-   r.   select_object_to_file  s   
$zBucket.select_object_to_filec                 C   sR   t d| jt|| | jd|||d}t d|j|j | |t	j
tS )u  获取文件元信息。

        HTTP响应的头部包含了文件元信息，可以通过 `RequestResult` 的 `headers` 成员获得。
        用法 ::

            >>> result = bucket.head_object('readme.txt')
            >>> print(result.content_type)
            text/plain

        :param key: 文件名

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :param params: HTTP请求参数，传入versionId，获取指定版本Object元信息
        :type params: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`HeadObjectResult <oss2.models.HeadObjectResult>`

        :raises: 如果Bucket不存在或者Object不存在，则抛出 :class:`NotFound <oss2.exceptions.NotFound>`
        z9Start to head object, bucket: {0}, key: {1}, headers: {2}HEADr/  z/Head object done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r  rj   r8   rO   r   parse_dummy_resultHeadObjectResult)r*   rB   r=   rf   rE   r-   r-   r.   head_object  s   zBucket.head_objectc                 C   sV   t |}t|}ddi}|durd|v rd|d< d| _| jd||||d}t|S )	uK  获取或创建CSV,JSON LINES 文件元信息。如果元信息存在，返回之；不然则创建后返回之

        HTTP响应的头部包含了文件元信息，可以通过 `RequestResult` 的 `headers` 成员获得。
        CSV文件用法 ::

            >>> select_meta_params = {  'FieldDelimiter': ',',
                                'RecordDelimiter': '
',
                                'QuoteCharacter': '"',
                                'OverwriteIfExists' : 'false'}
            >>> result = bucket.create_select_object_meta('csv.txt', select_meta_params)
            >>> print(result.rows)
           
        JSON LINES文件用法 ::
            >>> select_meta_params = { 'Json_Type':'LINES', 'OverwriteIfExists':'False'}
            >>> result = bucket.create_select_object_meta('jsonlines.json', select_meta_params)
        :param key: 文件名
        :param select_meta_params: 参数词典，可以是dict，参见ref:`csv_meta_params`

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`GetSelectObjectMetaResult <oss2.models.HeadObjectResult>`. 
          除了 rows 和splits 属性之外, 它也返回head object返回的其他属性。
          rows表示该文件的总记录数。
          splits表示该文件的总Split个数，一个Split包含若干条记录，每个Split的总字节数大致相当。用户可以以Split为单位进行分片查询。

        :raises: 如果Bucket不存在或者Object不存在，则抛出:class:`NotFound <oss2.exceptions.NotFound>`
        r   zcsv/metaNr=  z	json/metar8  r{   r*  )r   rh   r   to_get_select_object_metar   r  GetSelectObjectMetaResult)r*   rB   select_meta_paramsr=   rB  rf   rE   r-   r-   r.   create_select_object_meta  s   

z Bucket.create_select_object_metac                 C   st   t |}td| jt| |du rt }tj	|vr"d|tj	< | j
d|||d}td|j|j t|S )u  获取文件基本元信息，包括该Object的ETag、Size（文件大小）、LastModified，并不返回其内容。

        HTTP响应的头部包含了文件基本元信息，可以通过 `GetObjectMetaResult` 的 `last_modified`，`content_length`,`etag` 成员获得。

        :param key: 文件名
        :param dict params: 请求参数

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`GetObjectMetaResult <oss2.models.GetObjectMetaResult>`

        :raises: 如果文件不存在，则抛出 :class:`NoSuchKey <oss2.exceptions.NoSuchKey>` ；还可能抛出其他异常
        z3Start to get object metadata, bucket: {0}, key: {1}Nr   rT  re   z7Get object metadata done, req_id: {0}, status_code: {1})r   rh   r:   r]   r   rA   r   dictr   
OBJECTMETAr  rj   r8   GetObjectMetaResultr*   rB   rf   r=   rE   r-   r-   r.   get_object_meta  s   


zBucket.get_object_metac                 C   sn   t d| jt| z
| j||d W dS  tjy!   Y dS  tjy)     tj	y3   Y dS     )u{   如果文件存在就返回True，否则返回False。如果Bucket不存在，或是发生其他错误，则抛出异常。z6Start to check if object exists, bucket: {0}, key: {1}rN  FT)
r:   r]   r   rA   r   r`  r   	NoSuchKeyNoSuchBucketNotFoundr*   rB   r=   r-   r-   r.   object_exists#  s   
zBucket.object_existsc              	   C   s   t |}|r!tj|v r!d| d t|d d |tj  |t< nd| d t|d |t< td|t	|| j
t	|| | jd||d}td|j|j t|S )u  拷贝一个文件到当前Bucket。

        :param str source_bucket_name: 源Bucket名
        :param str source_key: 源文件名
        :param str target_key: 目标文件名
        :param dict params: 请求参数

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`PutObjectResult <oss2.models.PutObjectResult>`
        r   r   ?versionId=z^Start to copy object, source bucket: {0}, source key: {1}, bucket: {2}, key: {3}, headers: {4}r   rN  z/Copy object done, req_id: {0}, status_code: {1})r   rh   r   	VERSIONIDr   OSS_COPY_OBJECT_SOURCEr:   r]   r   r   rA   r  rj   r8   r  )r*   source_bucket_name
source_key
target_keyr=   rf   rE   r-   r-   r.   copy_objectC  s(   

zBucket.copy_objectc                 C   s<   |durd|t < td| jt| | j| j|||dS )u  更改Object的元数据信息，包括Content-Type这类标准的HTTP头部，以及以x-oss-meta-开头的自定义元数据。

        用户可以通过 :func:`head_object` 获得元数据信息。

        :param str key: 文件名

        :param headers: HTTP头部，包含了元数据信息
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`RequestResult <oss2.models.RequestResults>`
        NREPLACEz6Start to update object metadata, bucket: {0}, key: {1}rN  )OSS_METADATA_DIRECTIVEr:   r]   r   rA   r   rl  rd  r-   r-   r.   update_object_metaa  s   zBucket.update_object_metac                 C   sR   t |}td| jt| | jd|||d}td|j	|j
 t|S )u  删除一个文件。

        :param str key: 文件名
        :param params: 请求参数

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z-Start to delete object, bucket: {0}, key: {1}r   re   z1Delete object done, req_id: {0}, status_code: {1})r   rh   r:   r;   r   rA   r   r  r]   rj   r8   r   r_  r-   r-   r.   delete_objectt  s
   
zBucket.delete_objectc                 C   s   t |}td| jt| |du rt }tj	|vr"d|tj	< | 
ttj|}| jd||||d}td|j|j t|S )ux  restore an object
            如果是第一次针对该object调用接口，返回RequestResult.status = 202；
            如果已经成功调用过restore接口，且服务端仍处于解冻中，抛异常RestoreAlreadyInProgress(status=409)
            如果已经成功调用过restore接口，且服务端解冻已经完成，再次调用时返回RequestResult.status = 200，且会将object的可下载时间延长一天，最多延长7天。
            如果object不存在，则抛异常NoSuchKey(status=404)；
            对非Archive类型的Object提交restore，则抛异常OperationNotSupported(status=400)

            也可以通过调用head_object接口来获取meta信息来判断是否可以restore与restore的状态
            代码示例::
            >>> meta = bucket.head_object(key)
            >>> if meta.resp.headers['x-oss-storage-class'] == oss2.BUCKET_STORAGE_CLASS_ARCHIVE:
            >>>     bucket.restore_object(key)
            >>>         while True:
            >>>             meta = bucket.head_object(key)
            >>>             if meta.resp.headers['x-oss-restore'] == 'ongoing-request="true"':
            >>>                 time.sleep(5)
            >>>             else:
            >>>                 break
        :param str key: object name
        :param params: 请求参数

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :param input: 解冻配置。
        :type input: class:`RestoreConfiguration <oss2.models.RestoreConfiguration>`

        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z.Start to restore object, bucket: {0}, key: {1}Nr   r{   r|   z2Restore object done, req_id: {0}, status_code: {1})r   rh   r:   r]   r   rA   r   r\  r   RESTORE_Bucket__convert_dataRestoreConfigurationr   to_put_restore_configr  rj   r8   r   )r*   rB   rf   r=   inputr}   rE   r-   r-   r.   restore_object  s   


zBucket.restore_objectc                 C   s~   t d| jt|| t|}||t< |du rt }t	j
|vr'd|t	j
< | jd|||d}t d|j|j t|S )u  设置文件的ACL。

        :param str key: 文件名
        :param str permission: 可以是oss2.OBJECT_ACL_DEFAULT、oss2.OBJECT_ACL_PRIVATE、oss2.OBJECT_ACL_PUBLIC_READ或
            oss2.OBJECT_ACL_PUBLIC_READ_WRITE。
        :param dict params: 请求参数

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z8Start to put object acl, bucket: {0}, key: {1}, acl: {2}Nr   r   re   z2Put object acl done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r   rh   OSS_OBJECT_ACLr\  r   ACLr  rj   r8   r   )r*   rB   
permissionrf   r=   rE   r-   r-   r.   put_object_acl  s   


zBucket.put_object_aclc                 C   s|   t d| jt| t|}|du rt }tj	|vr"d|tj	< | j
d|||d}t d|j|j | |tjtS )u  获取文件的ACL。

        :param key: 文件名
        :param params: 请求参数

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`GetObjectAclResult <oss2.models.GetObjectAclResult>`
        z.Start to get object acl, bucket: {0}, key: {1}Nr   rd   re   z2Get object acl done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r   rh   r\  r   rx  r  rj   r8   rO   r   parse_get_object_aclGetObjectAclResultr_  r-   r-   r.   get_object_acl  s   


zBucket.get_object_aclc                 C   s   |st dtd| j| t|d}t|}t	
||d< | jd|ddd|d	}td
|j|j | |tjtS )u!  批量删除文件。待删除文件列表不能为空。

        :param key_list: 文件名列表，不能为空。
        :type key_list: list of str

        :param headers: HTTP头部

        :return: :class:`BatchDeleteObjectsResult <oss2.models.BatchDeleteObjectsResult>`
        zkey_list should not be emptyz/Start to delete objects, bucket: {0}, keys: {1}FContent-MD5r{   r   r  deleter  r}   rf   r=   z2Delete objects done, req_id: {0}, status_code: {1})r   r:   r]   r   rA   r   to_batch_delete_objects_requestr   rh   r   content_md5r	  rj   r8   rO   parse_batch_delete_objectsBatchDeleteObjectsResult)r*   key_listr=   r}   rE   r-   r-   r.   batch_delete_objects  s   

zBucket.batch_delete_objectsc                 C   s   |st dtd| j t|d}t|}t	
||d< | jd|ddd|d	}td
|j|j | |tjtS )u{  批量删除带版本文件。待删除文件列表不能为空。

        :param key_list_with_version: 带版本的文件名列表，不能为空。（如果传入，则不能为空）
        :type key_list: list of BatchDeleteObjectsList 

        :param headers: HTTP头部

        :return: :class:`BatchDeleteObjectsResult <oss2.models.BatchDeleteObjectsResult>`
        z$keylist_versions should not be emptyz,Start to delete object versions, bucket: {0}Fr~  r{   r   r  r  r  z:Delete object versions done, req_id: {0}, status_code: {1})r   r:   r]   r   rA   r   'to_batch_delete_objects_version_requestr   rh   r   r  r	  rj   r8   rO   r  r  )r*   keylist_versionsr=   r}   rE   r-   r-   r.   delete_object_versions  s   

zBucket.delete_object_versionsc                 C   s   t t||}|du rt }n| }d|d< td| j	t
||| | jd|||d}td|j|j | |tjtS )u  初始化分片上传。

        返回值中的 `upload_id` 以及Bucket名和Object名三元组唯一对应了此次分片上传事件。

        :param str key: 待上传的文件名

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`InitMultipartUploadResult <oss2.models.InitMultipartUploadResult>`
        Nr   uploadszQStart to init multipart upload, bucket: {0}, keys: {1}, headers: {2}, params: {3}r{   re   z9Init multipart upload done, req_id: {0}, status_code: {1})r   r  r   rh   r\  copyr:   r]   r   rA   r   r  rj   r8   rO   r   parse_init_multipart_uploadInitMultipartUploadResult)r*   rB   r=   rf   
tmp_paramsrE   r-   r-   r.   init_multipart_upload  s   zBucket.init_multipart_uploadc           	   	   C   s   t |}|rt||}| jrt|}td| j	t
|||| | jd||t|d||d}td|j|j t|}| jrU|jdurUtd|j|j|j |S )u  上传一个分片。

        :param str key: 待上传文件名，这个文件名要和 :func:`init_multipart_upload` 的文件名一致。
        :param str upload_id: 分片上传ID
        :param int part_number: 分片号，最小值是1.
        :param data: 待上传数据。
        :param progress_callback: 用户指定进度回调函数。可以用来实现进度条等功能。参考 :ref:`progress_callback` 。

        :param headers: 用户指定的HTTP头部。可以指定Content-MD5头部等
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`PutObjectResult <oss2.models.PutObjectResult>`
        z`Start to upload multipart, bucket: {0}, key: {1}, upload_id: {2}, part_number: {3}, headers: {4}r   )uploadId
partNumberr|   z4Upload multipart done, req_id: {0}, status_code: {1}Nzupload part)r   rh   r   r  r!   r  r:   r]   r   rA   r   r  rg   rj   r8   r  r  r  )	r*   rB   	upload_idpart_numberr}   r  r=   rE   rN   r-   r-   r.   upload_part9  s(   

zBucket.upload_partc           	      C   s   t |}d}|durt|dd d}t|}td| jt	||| | j
d|d|i||d}td	|j|j t|}| jrW|durWt|}td
||j|j |S )ue  完成分片上传，创建文件。

        :param str key: 待上传的文件名，这个文件名要和 :func:`init_multipart_upload` 的文件名一致。
        :param str upload_id: 分片上传ID

        :param parts: PartInfo列表。PartInfo中的part_number和etag是必填项。其中的etag可以从 :func:`upload_part` 的返回值中得到。
        :type parts: list of `PartInfo <oss2.models.PartInfo>`

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`PutObjectResult <oss2.models.PutObjectResult>`
        Nc                 S   s   | j S rK   )r  )pr-   r-   r.   <lambda>p  s    z2Bucket.complete_multipart_upload.<locals>.<lambda>)rB   zUStart to complete multipart upload, bucket: {0}, key: {1}, upload_id: {2}, parts: {3}r{   r  )rf   r}   r=   z=Complete multipart upload done, req_id: {0}, status_code: {1}zmultipart upload)r   rh   sortedr   to_complete_upload_requestr:   r]   r   rA   r   r  rj   r8   r  r!   r   calc_obj_crc_from_partsr  r  )	r*   rB   r  partsr=   r}   rE   rN   
object_crcr-   r-   r.   complete_multipart_upload^  s*   


z Bucket.complete_multipart_uploadc                 C   sX   t d| jt|| t|}| jd|d|i|d}t d|j|j	 t
|S )ux  取消分片上传。

        :param str key: 待上传的文件名，这个文件名要和 :func:`init_multipart_upload` 的文件名一致。
        :param str upload_id: 分片上传ID

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`RequestResult <oss2.models.RequestResult>`
        zFStart to abort multipart upload, bucket: {0}, key: {1}, upload_id: {2}r   r  re   z3Abort multipart done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r   rh   r  rj   r8   r   )r*   rB   r  r=   rE   r-   r-   r.   abort_multipart_upload  s   
zBucket.abort_multipart_upload  c              
   C   sx   t d| jt||t||| t|}| jdd||||t|dd|d}t d|j	|j
 | |tjtS )u  罗列正在进行中的分片上传。支持分页。

        :param str prefix: 只罗列匹配该前缀的文件的分片上传
        :param str delimiter: 目录分割符
        :param str key_marker: 文件名分页符。第一次调用可以不传，后续设为返回值中的 `next_key_marker`
        :param str upload_id_marker: 分片ID分页符。第一次调用可以不传，后续设为返回值中的 `next_upload_id_marker`
        :param int max_uploads: 一次罗列最多能够返回的条目数

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`ListMultipartUploadsResult <oss2.models.ListMultipartUploadsResult>`
        zStart to list multipart uploads, bucket: {0}, prefix: {1}, delimiter: {2}, key_marker: {3}, upload_id_marker: {4}, max_uploads: {5}rd   r   r  )r  ra   r  
key-markerzupload-id-markerzmax-uploadsr  re   z:List multipart uploads done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r   rh   r	  rg   rj   r8   rO   r   parse_list_multipart_uploadsListMultipartUploadsResult)r*   ra   r  
key_markerupload_id_markermax_uploadsr=   rE   r-   r-   r.   list_multipart_uploads  s(   
	zBucket.list_multipart_uploadsc	                 C   s   t |}|r!tj|v r!d| d t|d d |tj  |t< nd| d t|d |t< t|}	|	r8|	|t< t	d
|t|| jt||||| |du rSt }||d< t||d< | jd|||d	}
t	d

|
j|
j t|
S )u  分片拷贝。把一个已有文件的一部分或整体拷贝成目标文件的一个分片。
        :source_bucket_name: 源文件所在bucket的名称
        :source_key:源文件名称
        :param byte_range: 指定待拷贝内容在源文件里的范围。参见 :ref:`byte_range`
        :target_key: 目的文件的名称
        :target_upload_id: 目的文件的uploadid
        :target_part_number: 目的文件的分片号
        :param params: 请求参数

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`PutObjectResult <oss2.models.PutObjectResult>`
        r   r   rf  zStart to upload part copy, source bucket: {0}, source key: {1}, bucket: {2}, key: {3}, range: {4}, upload id: {5}, part_number: {6}, headers: {7}Nr  r  r   re   z4Upload part copy done, req_id: {0}, status_code: {1})r   rh   r   rg  r   rh  r0  OSS_COPY_OBJECT_SOURCE_RANGEr:   r]   r   r   rA   r\  rg   r  rj   r8   r  )r*   ri  rj  r3  rk  target_upload_idtarget_part_numberr=   rf   r5  rE   r-   r-   r.   upload_part_copy  s<   

zBucket.upload_part_copyc              	   C   sl   t d| jt|||| t|}| jd|||t|d|d}t d|j	|j
 | |tjtS )u  列举已经上传的分片。支持分页。

        :param headers: HTTP头部
        :param str key: 文件名
        :param str upload_id: 分片上传ID
        :param str marker: 分页符
        :param int max_parts: 一次最多罗列多少分片

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`ListPartsResult <oss2.models.ListPartsResult>`
        zWStart to list parts, bucket: {0}, key: {1}, upload_id: {2}, marker: {3}, max_parts: {4}rd   )r  zpart-number-markerz	max-partsre   z.List parts done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r   rh   r  rg   rj   r8   rO   r   parse_list_partsListPartsResult)r*   rB   r  rb   	max_partsr=   rE   r-   r-   r.   
list_parts  s   
zBucket.list_partsc                 C   sn   t |}t|d|t< td| jt|t|| | j	d||t
jdid}td|j|j t|S )u  创建Symlink。

        :param str target_key: 目标文件，目标文件不能为符号连接
        :param str symlink_key: 符号连接类文件，其实质是一个特殊的文件，数据指向目标文件

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`RequestResult <oss2.models.RequestResult>`
        r   zRStart to put symlink, bucket: {0}, target_key: {1}, symlink_key: {2}, headers: {3}r   r/  z/Put symlink done, req_id: {0}, status_code: {1})r   rh   r   OSS_SYMLINK_TARGETr:   r]   r   rA   r   r  r   SYMLINKrj   r8   r   )r*   rk  symlink_keyr=   rE   r-   r-   r.   put_symlink  s   
zBucket.put_symlinkc                 C   st   t d| jt| t|}|du rt }tj	|vr"d|tj	< | j
d|||d}t d|j|j t|S )u  获取符号连接文件的目标文件。

        :param str symlink_key: 符号连接类文件
        :param dict params: 请求参数

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`GetSymlinkResult <oss2.models.GetSymlinkResult>`

        :raises: 如果文件的符号链接不存在，则抛出 :class:`NoSuchKey <oss2.exceptions.NoSuchKey>` ；还可能抛出其他异常
        z3Start to get symlink, bucket: {0}, symlink_key: {1}Nr   rd   re   z/Get symlink done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r   rh   r\  r   r  r  rj   r8   GetSymlinkResult)r*   r  rf   r=   rE   r-   r-   r.   get_symlink!  s   


zBucket.get_symlinkc                 C   sj   t |}|r||t< | ttj|}td	| j
|| | jd||d}td	|j|j t|S )u9  创建新的Bucket。

        :param str permission: 指定Bucket的ACL。可以是oss2.BUCKET_ACL_PRIVATE（推荐、缺省）、oss2.BUCKET_ACL_PUBLIC_READ或是
            oss2.BUCKET_ACL_PUBLIC_READ_WRITE。

        :param input: :class:`BucketCreateConfig <oss2.models.BucketCreateConfig>` object
        zAStart to create bucket, bucket: {0}, permission: {1}, config: {2}r   )r=   r}   z1Create bucket done, req_id: {0}, status_code: {1})r   rh   OSS_CANNED_ACLrr  BucketCreateConfigr   to_put_bucket_configr:   r]   r   rA   r	  rj   r8   r   )r*   ry  ru  r=   r}   rE   r-   r-   r.   create_bucket=  s   
zBucket.create_bucketc                 C   s:   t d| j | d}t d|j|j t|S )u=  删除一个Bucket。只有没有任何文件，也没有任何未完成的分片上传的Bucket才能被删除。

        :return: :class:`RequestResult <oss2.models.RequestResult>`

        ":raises: 如果试图删除一个非空Bucket，则抛出 :class:`BucketNotEmpty <oss2.exceptions.BucketNotEmpty>`
        z#Start to delete bucket, bucket: {0}r   z1Delete bucket done, req_id: {0}, status_code: {1})	r:   r;   r   rA   r	  r]   rj   r8   r   ru   r-   r-   r.   delete_bucketP  s   
zBucket.delete_bucketc                 C   sL   t d| j| | jdt|itjdid}t d|j|j	 t
|S )u   设置Bucket的ACL。

        :param str permission: 新的ACL，可以是oss2.BUCKET_ACL_PRIVATE、oss2.BUCKET_ACL_PUBLIC_READ或
            oss2.BUCKET_ACL_PUBLIC_READ_WRITE
        z.Start to put bucket acl, bucket: {0}, acl: {1}r   r   r/  z2Put bucket acl done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r  r   rx  rj   r8   r   )r*   ry  rE   r-   r-   r.   put_bucket_acl\  s   zBucket.put_bucket_aclc                 C   L   t d| j | jdtjdid}t d|j|j | 	|t
jtS )um   获取Bucket的ACL。

        :return: :class:`GetBucketAclResult <oss2.models.GetBucketAclResult>`
        z$Start to get bucket acl, bucket: {0}rd   r   rq   z2Get bucket acl done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   rx  rj   r8   rO   r   parse_get_bucket_aclGetBucketAclResultru   r-   r-   r.   get_bucket_aclg     zBucket.get_bucket_aclc                 C   X   |  ttj|}td| j| | jd|t	j
did}td|j|j t|S )us   设置Bucket的CORS。

        :param input: :class:`BucketCors <oss2.models.BucketCors>` 对象或其他
        z0Start to put bucket cors, bucket: {0}, cors: {1}r   r   r   z3Put bucket cors done, req_id: {0}, status_code: {1})rr  
BucketCorsr   to_put_bucket_corsr:   r]   r   rA   r	  r   CORSrj   r8   r   r*   ru  r}   rE   r-   r-   r.   put_bucket_corsq  
   zBucket.put_bucket_corsc                 C   r  )uv   获取Bucket的CORS配置。

        :return: :class:`GetBucketCorsResult <oss2.models.GetBucketCorsResult>`
        z%Start to get bucket CORS, bucket: {0}rd   r   rq   z3Get bucket CORS done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r  rj   r8   rO   r   parse_get_bucket_corsGetBucketCorsResultru   r-   r-   r.   get_bucket_cors|  r  zBucket.get_bucket_corsc                 C   D   t d| j | jdtjdid}t d|j|j t	|S )u   删除Bucket的CORS配置。z(Start to delete bucket CORS, bucket: {0}r   r   rq   z6Delete bucket CORS done, req_id: {0}, status_code: {1})
r:   r]   r   rA   r	  r   r  rj   r8   r   ru   r-   r-   r.   delete_bucket_cors     zBucket.delete_bucket_corsc                 C   sd   t |}| ttj|}td| j	| | j
d|tjdi|d}td|j|j t|S )u   设置生命周期管理的配置。

        :param input: :class:`BucketLifecycle <oss2.models.BucketLifecycle>` 对象或其他
        z:Start to put bucket lifecycle, bucket: {0}, lifecycle: {1}r   r   r  8Put bucket lifecycle done, req_id: {0}, status_code: {1})r   rh   rr  BucketLifecycler   to_put_bucket_lifecycler:   r]   r   rA   r	  r   	LIFECYCLErj   r8   r   )r*   ru  r=   r}   rE   r-   r-   r.   put_bucket_lifecycle  s   
zBucket.put_bucket_lifecyclec                 C   r  )u   获取生命周期管理配置。

        :return: :class:`GetBucketLifecycleResult <oss2.models.GetBucketLifecycleResult>`

        :raises: 如果没有设置Lifecycle，则抛出 :class:`NoSuchLifecycle <oss2.exceptions.NoSuchLifecycle>`
        z*Start to get bucket lifecycle, bucket: {0}rd   r   rq   z8Get bucket lifecycle done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r  rj   r8   rO   r   parse_get_bucket_lifecycleGetBucketLifecycleResultru   r-   r-   r.   get_bucket_lifecycle     zBucket.get_bucket_lifecyclec                 C   r  )uQ   删除生命周期管理配置。如果Lifecycle没有设置，也返回成功。z-Start to delete bucket lifecycle, bucket: {0}r   r   rq   z;Delete bucket lifecycle done, req_id: {0}, status_code: {1})
r:   r]   r   rA   r	  r   r  rj   r8   r   ru   r-   r-   r.   delete_bucket_lifecycle  r  zBucket.delete_bucket_lifecyclec                 C   r  )u   获取Bucket的数据中心。

        :return: :class:`GetBucketLocationResult <oss2.models.GetBucketLocationResult>`
        z)Start to get bucket location, bucket: {0}rd   r   rq   z7Get bucket location done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   LOCATIONrj   r8   rO   r   parse_get_bucket_locationGetBucketLocationResultru   r-   r-   r.   get_bucket_location  r  zBucket.get_bucket_locationc                 C   r  )u   设置Bucket的访问日志功能。

        :param input: :class:`BucketLogging <oss2.models.BucketLogging>` 对象或其他
        z6Start to put bucket logging, bucket: {0}, logging: {1}r   r   r   z6Put bucket logging done, req_id: {0}, status_code: {1})rr  BucketLoggingr   to_put_bucket_loggingr:   r]   r   rA   r	  r   LOGGINGrj   r8   r   r  r-   r-   r.   put_bucket_logging  r  zBucket.put_bucket_loggingc                 C   r  )u   获取Bucket的访问日志功能配置。

        :return: :class:`GetBucketLoggingResult <oss2.models.GetBucketLoggingResult>`
        z(Start to get bucket logging, bucket: {0}rd   r   rq   z6Get bucket logging done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r  rj   r8   rO   r   parse_get_bucket_loggingGetBucketLoggingResultru   r-   r-   r.   get_bucket_logging  r  zBucket.get_bucket_loggingc                 C   r  )u$   关闭Bucket的访问日志功能。z,Start to delete bucket loggging, bucket: {0}r   r   rq   r  )
r:   r]   r   rA   r	  r   r  rj   r8   r   ru   r-   r-   r.   delete_bucket_logging  r  zBucket.delete_bucket_loggingc                 C   s\   |  ttj|}td| jt| | j	d|t
jdid}td|j|j t|S )u~   为Bucket设置防盗链。

        :param input: :class:`BucketReferer <oss2.models.BucketReferer>` 对象或其他
        z6Start to put bucket referer, bucket: {0}, referer: {1}r   r   r   z6Put bucket referer done, req_id: {0}, status_code: {1})rr  BucketRefererr   to_put_bucket_refererr:   r]   r   rA   r   r	  r   REFERERrj   r8   r   r  r-   r-   r.   put_bucket_referer  s
   zBucket.put_bucket_refererc                 C   r  )u   获取Bucket的防盗链配置。

        :return: :class:`GetBucketRefererResult <oss2.models.GetBucketRefererResult>`
        z(Start to get bucket referer, bucket: {0}rd   r   rq   z6Get bucket referer done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r  rj   r8   rO   r   parse_get_bucket_refererGetBucketRefererResultru   r-   r-   r.   get_bucket_referer  r  zBucket.get_bucket_refererc                 C   r  )u   查看Bucket的状态，目前包括bucket大小，bucket的object数量，bucket正在上传的Multipart Upload事件个数等。

        :return: :class:`GetBucketStatResult <oss2.models.GetBucketStatResult>`
        z%Start to get bucket stat, bucket: {0}rd   r   rq   z3Get bucket stat done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   STATrj   r8   rO   r   parse_get_bucket_statGetBucketStatResultru   r-   r-   r.   get_bucket_stat  r  zBucket.get_bucket_statc                 C   r  )u   获取bucket相关信息，如创建时间，访问Endpoint，Owner与ACL等。

        :return: :class:`GetBucketInfoResult <oss2.models.GetBucketInfoResult>`
        z%Start to get bucket info, bucket: {0}rd   r   rq   z3Get bucket info done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   BUCKET_INFOrj   r8   rO   r   parse_get_bucket_infoGetBucketInfoResultru   r-   r-   r.   get_bucket_info  r  zBucket.get_bucket_infoc                 C   st   |  ttj|}t }t||d< t	d
| jt| | jd|tjdi|d}t	d
|j|j t|S )u}   为Bucket配置静态网站托管功能。

        :param input: :class:`BucketWebsite <oss2.models.BucketWebsite>`
        r~  z6Start to put bucket website, bucket: {0}, website: {1}r   r   r  z6Put bucket website done, req_id: {0}, status_code: {1})rr  BucketWebsiter   to_put_bucket_websiter   rh   r   r  r:   r]   r   rA   r   r	  r   WEBSITErj   r8   r   )r*   ru  r}   r=   rE   r-   r-   r.   put_bucket_website  s   zBucket.put_bucket_websitec                 C   r  )u
  获取Bucket的静态网站托管配置。

        :return: :class:`GetBucketWebsiteResult <oss2.models.GetBucketWebsiteResult>`

        :raises: 如果没有设置静态网站托管，那么就抛出 :class:`NoSuchWebsite <oss2.exceptions.NoSuchWebsite>`
        z(Start to get bucket website, bucket: {0}rd   r   rq   z6Get bucket website done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r  rj   r8   rO   r   parse_get_bucket_websiteGetBucketWebsiteResultru   r-   r-   r.   get_bucket_website
  s   zBucket.get_bucket_websitec                 C   r  )u*   关闭Bucket的静态网站托管功能。z+Start to delete bucket website, bucket: {0}r   r   rq   z9Delete bucket website done, req_id: {0}, status_code: {1})
r:   r]   r   rA   r	  r   r  rj   r8   r   ru   r-   r-   r.   delete_bucket_website  r  zBucket.delete_bucket_websitec                 C   sl   |  ttj|}td| jt|t| | j	d||t
jdid}td|j|j | |tjtS )u  创建推流直播频道

        :param str channel_name: 要创建的live channel的名称
        :param input: LiveChannelInfo类型，包含了live channel中的描述信息

        :return: :class:`CreateLiveChannelResult <oss2.models.CreateLiveChannelResult>`
        zGStart to create live-channel, bucket: {0}, channel_name: {1}, info: {2}r   r   r   z7Create live-channel done, req_id: {0}, status_code: {1})rr  LiveChannelInfor   to_create_live_channelr:   r]   r   rA   r   r  r   LIVErj   r8   rO   parse_create_live_channelCreateLiveChannelResult)r*   r  ru  r}   rE   r-   r-   r.   create_live_channel  s   zBucket.create_live_channelc                 C   sL   t d| jt| | jd|tjdid}t d|j|j	 t
|S )ue   删除推流直播频道

        :param str channel_name: 要删除的live channel的名称
        z<Start to delete live-channel, bucket: {0}, live_channel: {1}r   r   rq   z7Delete live-channel done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r  r   r  rj   r8   r   r*   r  rE   r-   r-   r.   delete_live_channel.  s   
zBucket.delete_live_channelc                 C   sT   t d| jt| | jd|tjdid}t d|j|j	 | 
|tjtS )u   获取直播频道配置

        :param str channel_name: 要获取的live channel的名称

        :return: :class:`GetLiveChannelResult <oss2.models.GetLiveChannelResult>`
        z>Start to get live-channel info: bucket: {0}, live_channel: {1}rd   r   rq   z4Get live-channel done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r  r   r  rj   r8   rO   r   parse_get_live_channelGetLiveChannelResultr   r-   r-   r.   get_live_channel9  s   
zBucket.get_live_channelc                 C   sj   t d| jt|t|| | jdtjdd|d|dt|id}t d|j	|j
 | |tjtS )	uN  列举出Bucket下所有符合条件的live channel

        param: str prefix: list时channel_id的公共前缀
        param: str marker: list时指定的起始标记
        param: int max_keys: 本次list返回live channel的最大个数

        return: :class:`ListLiveChannelResult <oss2.models.ListLiveChannelResult>`
        zQStart to list live-channels, bucket: {0}, prefix: {1}, marker: {2}, max_keys: {3}rd   r   ra   rb   rc   rq   z5List live-channel done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r	  r   r  rg   rj   r8   rO   r   parse_list_live_channelListLiveChannelResult)r*   ra   rb   rm   rE   r-   r-   r.   list_live_channelF  s   	zBucket.list_live_channelc                 C   Z   t d| jt| | jd|tjdtjdid}t d|j	|j
 | |tjtS )u   获取live channel当前推流的状态

        param str channel_name: 要获取推流状态的live channel的名称

        return: :class:`GetLiveChannelStatResult <oss2.models.GetLiveChannelStatResult>`
        z>Start to get live-channel stat, bucket: {0}, channel_name: {1}rd   r   r   rq   z9Get live-channel stat done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r  r   r  COMPrj   r8   rO   r   parse_live_channel_statGetLiveChannelStatResultr   r-   r-   r.   get_live_channel_statX  s   
zBucket.get_live_channel_statc                 C   sT   t d| jt|| | jd|tjdtj|id}t d|j	|j
 t|S )u   更改live channel的status，仅能在“enabled”和“disabled”两种状态中更改

        param str channel_name: 要更改status的live channel的名称
        param str status: live channel的目标status
        zMStart to put live-channel status, bucket: {0}, channel_name: {1}, status: {2}r   r   rq   z;Put live-channel status done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r  r   r  STATUSrj   r8   r   )r*   r  r8   rE   r-   r-   r.   put_live_channel_statusf  s   zBucket.put_live_channel_statusc                 C   r  )u0  获取live channel中最近的最多十次的推流记录，记录中包含推流的起止时间和远端的地址

        param str channel_name: 要获取最近推流记录的live channel的名称

        return: :class:`GetLiveChannelHistoryResult <oss2.models.GetLiveChannelHistoryResult>`
        zAStart to get live-channel history, bucket: {0}, channel_name: {1}rd   r   historyrq   z<Get live-channel history done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r  r   r  r	  rj   r8   rO   r   parse_live_channel_historyGetLiveChannelHistoryResultr   r-   r-   r.   get_live_channel_historyr  s   
zBucket.get_live_channel_historyr   c              
   C   sn   t d| jt|||| |d | }| jd|tjddt|dt|id}t d|j	|j
 t|S )	u  根据指定的playlist name以及startTime和endTime生成一个点播的播放列表

        param str channel_name: 要生成点播列表的live channel的名称
        param str playlist_name: 要生成点播列表m3u8文件的名称
        param int start_time: 点播的起始时间，Unix Time格式，可以使用int(time.time())获取
        param int end_time: 点播的结束时间，Unix Time格式，可以使用int(time.time())获取
        znStart to post vod playlist, bucket: {0}, channel_name: {1}, playlist_name: {2}, start_time: {3}, end_time: {4}r   r{   r   	startTimeendTimerq   z5Post vod playlist done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r  r   VODrg   rj   r8   r   )r*   r  r  
start_timeend_timerB   rE   r-   r-   r.   post_vod_playlist  s   zBucket.post_vod_playlistc              
   C   sd   t d| jt||| | jd|tjddt|dt|id}t d|j	|j
 t|}|S )uS  查看指定时间段内的播放列表

        param str channel_name: 要获取点播列表的live channel的名称
        param int start_time: 点播的起始时间，Unix Time格式，可以使用int(time.time())获取
        param int end_time: 点播的结束时间，Unix Time格式，可以使用int(time.time())获取
        zZStart to get vod playlist, bucket: {0}, channel_name: {1},  start_time: {2}, end_time: {3}rd   r   r  r  rq   z4get vod playlist done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r  r   r  rg   rj   r8   GetVodPlaylistResult)r*   r  r  r  rE   rN   r-   r-   r.   get_vod_playlist  s   zBucket.get_vod_playlistc                 C   sj   t |}td| jt|| dtj|f }| j	d|tjdi||d}td|j
|j t|S )u  处理图片的接口，支持包括调整大小，旋转，裁剪，水印，格式转换等，支持多种方式组合处理。

        :param str key: 处理的图片的对象名称
        :param str process: 处理的字符串，例如"image/resize,w_100|sys/saveas,o_dGVzdC5qcGc,b_dGVzdA"

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict
        z<Start to process object, bucket: {0}, key: {1}, process: {2}%s=%sr{   r   r|   z2Process object done, req_id: {0}, status_code: {1})r   rh   r:   r]   r   rA   r   r   r1  r  rj   r8   ProcessObjectResultr*   rB   r4  r=   process_datarE   r-   r-   r.   process_object  s   

zBucket.process_objectc                 C   sp   t d| jt|| |durt|}|du rt }d|tj	< | 
ttj|}| jd||||d}t|S )u  

        :param str key: 上传tagging的对象名称，不能为空。

        :param tagging: tag 标签内容 
        :type tagging: :class:`Tagging <oss2.models.Tagging>` 对象

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :param dict params: HTTP请求参数

        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z@Start to put object tagging, bucket: {0}, key: {1}, tagging: {2}Nr   r   r  )r:   r]   r   rA   r   r   rh   r\  r   TAGGINGrr  Taggingr   to_put_taggingr  r   )r*   rB   r   r=   rf   r}   rE   r-   r-   r.   put_object_tagging  s   

zBucket.put_object_taggingc                 C   sb   t d| jt|t| t|}|du rt }d|t	j
< | jd|||d}| |tjtS )u#  
        :param str key: 要获取tagging的对象名称
        :param dict params: 请求参数

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`GetTaggingResult <oss2.models.GetTaggingResult>` 
        z>Start to get object tagging, bucket: {0}, key: {1} params: {2}Nr   rd   re   )r:   r]   r   rA   r   rg   r   rh   r\  r   r   r  rO   r   parse_get_taggingGetTaggingResultr_  r-   r-   r.   get_object_tagging  s   

zBucket.get_object_taggingc                 C   sj   t d| jt| t|}|du rt }d|tj	< | j
d|||d}t d|j|j t|S )u  
        :param str key: 要删除tagging的对象名称
        :param dict params: 请求参数

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`RequestResult <oss2.models.RequestResult>` 
        z5Start to delete object tagging, bucket: {0}, key: {1}Nr   r   re   z9Delete object tagging done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r   rh   r\  r   r   r  rj   r8   r   r_  r-   r-   r.   delete_object_tagging  s   



zBucket.delete_object_taggingc                 C   r  )u   设置bucket加密配置。

        :param rule: :class:` ServerSideEncryptionRule<oss2.models.ServerSideEncryptionRule>` 对象
        z6Start to put bucket encryption, bucket: {0}, rule: {1}r   r   r   z9Put bucket encryption done, req_id: {0}, status_code: {1})rr  ServerSideEncryptionRuler   to_put_bucket_encryptionr:   r]   r   rA   r	  r   
ENCRYPTIONrj   r8   r   )r*   ruler}   rE   r-   r-   r.   put_bucket_encryption	  s
   zBucket.put_bucket_encryptionc                 C   r  )u$  获取bucket加密配置。

        :return: :class:`GetServerSideEncryptionResult <oss2.models.GetServerSideEncryptionResult>`

        :raises: 如果没有设置Bucket encryption，则抛出 :class:`NoSuchServerSideEncryptionRule <oss2.exceptions.NoSuchServerSideEncryptionRule>`
        z+Start to get bucket encryption, bucket: {0}rd   r   rq   z9Get bucket encryption done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r*  rj   r8   rO   r   parse_get_bucket_encryptionGetServerSideEncryptionResultru   r-   r-   r.   get_bucket_encryption	  r  zBucket.get_bucket_encryptionc                 C   r  )uN   删除Bucket加密配置。如果Bucket加密没有设置，也返回成功。z.Start to delete bucket encryption, bucket: {0}r   r   rq   z<Delete bucket encryption done, req_id: {0}, status_code: {1})
r:   r]   r   rA   r	  r   r*  rj   r8   r   ru   r-   r-   r.   delete_bucket_encryption	  r  zBucket.delete_bucket_encryptionc                 C   sd   t d| j| t|}| ttj	|}| j
d|tjdi|d}t d|j|j t|S )u  

        :param str key: 上传tagging的对象名称，不能为空。

        :param tagging: tag 标签内容 
        :type tagging: :class:`Tagging <oss2.models.Tagging>` 对象

        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z5Start to put object tagging, bucket: {0} tagging: {1}r   r   r  z6Put bucket tagging done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   rh   rr  r!  r   r"  r	  r   r   rj   r8   r   )r*   r   r=   r}   rE   r-   r-   r.   put_bucket_tagging#	  s   

zBucket.put_bucket_taggingc                 C   r  )u   
        :param str key: 要获取tagging的对象名称
        :param dict params: 请求参数
        :return: :class:`GetTaggingResult<oss2.models.GetTaggingResult>` 
        z(Start to get bucket tagging, bucket: {0}rd   r   rq   z6Get bucket tagging done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r   rj   r8   rO   r   r$  r%  ru   r-   r-   r.   get_bucket_tagging8	  s   zBucket.get_bucket_taggingc                 C   s`   t d| j |du rt }tj|vrd|tj< | jd|d}t d|j|j	 t
|S )zN
        :return: :class:`RequestResult <oss2.models.RequestResult>` 
        z+Start to delete bucket tagging, bucket: {0}Nr   r   rq   z9Delete bucket tagging done, req_id: {0}, status_code: {1})r:   r]   r   rA   r\  r   r   r	  rj   r8   r   )r*   rf   rE   r-   r-   r.   delete_bucket_taggingG	  s   

zBucket.delete_bucket_taggingc                 C   s   t dd| jt||t|t||  t|}| jdd|d|d|d|dt|d	d
t	j
di|d}t d|j|j | |tjtS )u  根据前缀罗列Bucket里的文件的版本。

        :param str prefix: 只罗列文件名为该前缀的文件
        :param str delimiter: 分隔符。可以用来模拟目录
        :param str key_marker: 分页标志。首次调用传空串，后续使用返回值的next_marker
        :param int max_keys: 最多返回文件的个数，文件和目录的和不能超过该值
        :param str versionid_marker: 设定结果从key-marker对象的
            versionid-marker之后按新旧版本排序开始返回，该版本不会在返回的结果当中。 

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict

        :return: :class:`ListObjectVersionsResult <oss2.models.ListObjectVersionsResult>`
        zHStart to List object versions, bucket: {0}, prefix: {1}, delimiter: {2},z5key_marker: {3}, versionid_marker: {4}, max-keys: {5}rd   ra   r  r  zversion-id-markerrc   r  r  r   re   z8List object versions done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r   rh   r	  rg   r   VERSIONSrj   r8   rO   r   parse_list_object_versionsListObjectVersionsResult)r*   ra   r  r  rm   versionid_markerr=   rE   r-   r-   r.   list_object_versions[	  s0   
	zBucket.list_object_versionsc                 C   sp   t d| j | ttj|}t	|}t
||d< | jd|tjdi|d}t d|j|j t|S )u   

        :param str operation: 设置bucket是否开启多版本特性，可取值为:[Enabled,Suspend] 

        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z+Start to put object versioning, bucket: {0}r~  r   r   r  z7Put bucket versiong done, req_id: {0}, status_code: {1})r:   r]   r   rA   rr  BucketVersioningConfigr   to_put_bucket_versioningr   rh   r   r  r	  r   
VERSIONINGrj   r8   r   )r*   configr=   r}   rE   r-   r-   r.   put_bucket_versioning	  s   
zBucket.put_bucket_versioningc                 C   r  )ze
        :return: :class:`GetBucketVersioningResult<oss2.models.GetBucketVersioningResult>` 
        z+Start to get bucket versioning, bucket: {0}rd   r   rq   z7Get bucket versiong done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r;  rj   r8   rO   r   parse_get_bucket_versioningGetBucketVersioningResultru   r-   r-   r.   get_bucket_versioning	  s   zBucket.get_bucket_versioningc                 C   sT   t d| j| | jd|tjdidt|id}t d|j	|j
 t|S )uy   设置bucket授权策略, 具体policy书写规则请参考官方文档

        :param str policy: 授权策略
        z4Start to put bucket policy, bucket: {0}, policy: {1}r   r   r~  r  z5Put bucket policy done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   POLICYr   r  rj   r8   r   )r*   r   rE   r-   r-   r.   put_bucket_policy	  s   "zBucket.put_bucket_policyc                 C   r  )uv   获取bucket授权策略

        :return: :class:`GetBucketPolicyResult <oss2.models.GetBucketPolicyResult>`
        z'Start to get bucket policy, bucket: {0}rd   r   rq   z5Get bucket policy done, req_id: {0}, status_code: {1})
r:   r]   r   rA   r	  r   rA  rj   r8   GetBucketPolicyResultru   r-   r-   r.   get_bucket_policy	  s   zBucket.get_bucket_policyc                 C   r  )ue   删除bucket授权策略
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z*Start to delete bucket policy, bucket: {0}r   r   rq   z8Delete bucket policy done, req_id: {0}, status_code: {1})
r:   r]   r   rA   r	  r   rA  rj   r8   r   ru   r-   r-   r.   delete_bucket_policy	     zBucket.delete_bucket_policyc                 C   s^   t |}td| j| | jd|tjdidt	
|id}td|j|j t|S )u?   设置付费者。

        :param input: :class: str 
        z<Start to put bucket request payment, bucket: {0}, payer: {1}r   r   r~  r  z>Put bucket request payment done, req_id: {0}, status_code: {1})r   to_put_bucket_request_paymentr:   r]   r   rA   r	  r   REQUESTPAYMENTr   r  rj   r8   r   )r*   payerr}   rE   r-   r-   r.   put_bucket_request_payment	  s
   
"z!Bucket.put_bucket_request_paymentc                 C   r  )u   获取付费者设置。

        :return: :class:`GetBucketRequestPaymentResult <oss2.models.GetBucketRequestPaymentResult>`
        z1Start to get bucket request payment, bucket: {0}.rd   r   rq   z>Get bucket request payment done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   rH  rj   r8   rO   r    parse_get_bucket_request_paymentGetBucketRequestPaymentResultru   r-   r-   r.   get_bucket_request_payment	     z!Bucket.get_bucket_request_paymentc                 C   sn   t d| j | ttj|}t	 }t
||d< | jd|tjdi|d}t d|j|j t|S )u   配置bucket的QoSInfo

        :param bucket_qos_info :class:`BucketQosInfo <oss2.models.BucketQosInfo>`
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z)Start to put bucket qos info, bucket: {0}r~  r   r   r  z7Get bucket qos info done, req_id: {0}, status_code: {1})r:   r]   r   rA   rr  BucketQosInfor   r   r   rh   r   r  r	  r   rr   rj   r8   r   )r*   bucket_qos_infor}   r=   rE   r-   r-   r.   put_bucket_qos_info	  s   zBucket.put_bucket_qos_infoc                 C   r  )uv   获取bucket的QoSInfo

        :return: :class:`GetBucketQosInfoResult <oss2.models.GetBucketQosInfoResult>`
        z)Start to get bucket qos info, bucket: {0}rd   r   rq   z2Get bucket qos info, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   rr   rj   r8   rO   r   rs   GetBucketQosInfoResultru   r-   r-   r.   get_bucket_qos_info	  rN  zBucket.get_bucket_qos_infoc                 C   r  )ud   删除bucket的QoSInfo

        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z,Start to delete bucket qos info, bucket: {0}r   r   rq   z:Delete bucket qos info done, req_id: {0}, status_code: {1})
r:   r]   r   rA   r	  r   rr   rj   r8   r   ru   r-   r-   r.   delete_bucket_qos_info	  s   zBucket.delete_bucket_qos_infoc                 C   P   t d| j t|}| jd|tjdid}t d|j	|j
 t|S )uu   设置Bucket的容量，单位GB

        :param user_qos :class:`BucketUserQos <oss2.models.BucketUserQos>`
        z)Start to set bucket storage capacity: {0}r   r   r   z?Set bucket storage capacity done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   to_put_bucket_user_qosr	  r   USER_QOSrj   r8   r   )r*   user_qosr}   rE   r-   r-   r.   set_bucket_storage_capacity	  s
   
z"Bucket.set_bucket_storage_capacityc                 C   r  )u~   获取bucket的容量信息。

        :return: :class:`GetBucketUserQosResult <oss2.models.GetBucketUserQosResult>`
        z0Start to get bucket storage capacity, bucket:{0}rd   r   rq   z?Get bucket storage capacity done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   rW  rj   r8   rO   r   parse_get_bucket_user_qosGetBucketUserQosResultru   r-   r-   r.   get_bucket_storage_capacity
  rN  z"Bucket.get_bucket_storage_capacityc                 C   sp   t d| j t|}t }t	||d< | j
d|tjdi|d}t d|j|j | |tjtS )u)  创建一个异步获取文件到bucket的任务。

        :param task_config: 任务配置
        :type task_config: class:`AsyncFetchTaskConfiguration <oss2.models.AsyncFetchTaskConfiguration>` 

        :return: :class:`PutAsyncFetchTaskResult <oss2.models.PutAsyncFetchTaskResult>`
        z)Start to put async fetch task, bucket:{0}r~  r{   r   r  8Put async fetch task done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   to_put_async_fetch_taskr   rh   r   r  r	  r   ASYNC_FETCHrj   r8   rO   !parse_put_async_fetch_task_resultPutAsyncFetchTaskResult)r*   task_configr}   r=   rE   r-   r-   r.   put_async_fetch_task
  s   
zBucket.put_async_fetch_taskc                 C   sT   t d| j| | jdt|itjdid}t d|j|j	 | 
|tjtS )u   获取一个异步获取文件到bucket的任务信息。

        :param str task_id: 任务id
        :return: :class:`GetAsyncFetchTaskResult <oss2.models.GetAsyncFetchTaskResult>`
        z6Start to get async fetch task, bucket:{0}, task_id:{1}rd   r   r/  r]  )r:   r]   r   rA   r	  OSS_TASK_IDr   r_  rj   r8   rO   r   !parse_get_async_fetch_task_resultGetAsyncFetchTaskResult)r*   task_idrE   r-   r-   r.   get_async_fetch_task!
  s   zBucket.get_async_fetch_taskc                 C   sv   t d| j | ttj|}t	 }t
||d< | jd|tjdtj|ji|d}t d|j|j t|S )u   设置bucket清单配置

        :param inventory_configuration :class:`InventoryConfiguration <oss2.models.InventoryConfiguration>`
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z8Start to put bucket inventory configuration, bucket: {0}r~  r   r   r  zFPut bucket inventory configuration done, req_id: {0}, status_code: {1})r:   r]   r   rA   rr  InventoryConfigurationr   to_put_inventory_configurationr   rh   r   r  r	  r   	INVENTORYINVENTORY_CONFIG_IDinventory_idrj   r8   r   )r*   inventory_configurationr}   r=   rE   r-   r-   r.   "put_bucket_inventory_configuration-
  s    z)Bucket.put_bucket_inventory_configurationc                 C   R   t d| j | jdtjdtj|id}t d|j|j	 | 
|tjtS )u   获取指定的清单配置。

        :param str inventory_id : 清单配置id
        :return: :class:`GetInventoryConfigurationResult <oss2.models.GetInventoryConfigurationResult>`
        z8Start to get bucket inventory configuration, bucket: {0}rd   r   rq   zEGet bucket inventory cinfguration done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   rk  rl  rj   r8   rO   r   (parse_get_bucket_inventory_configurationGetInventoryConfigurationResultr*   rm  rE   r-   r-   r.   "get_bucket_inventory_configuration=
  s   z)Bucket.get_bucket_inventory_configurationc                 C   sb   t d| j tjdi}|dur||tj< | jd|d}t d|j|j	 | 
|tjtS )u  罗列清单配置，默认单次最大返回100条配置，如果存在超过100条配置，罗列结果将会分页，
        分页信息保存在 class:`ListInventoryConfigurationResult <oss2.models.ListInventoryConfigurationResult>`中。

        :param str continuation_token: 分页标识, 默认值为None, 如果上次罗列不完整，这里设置为上次罗列结果中的next_continuation_token值。
        :return: :class:`ListInventoryConfigurationResult <oss2.models.ListInventoryConfigurationResult>`
        z9Start to list bucket inventory configuration, bucket: {0}r   Nrd   rq   zGList bucket inventory configuration done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   rk  CONTINUATION_TOKENr	  rj   r8   rO   r   *parse_list_bucket_inventory_configurations!ListInventoryConfigurationsResult)r*   r   rf   rE   r-   r-   r.   $list_bucket_inventory_configurationsI
  s   

z+Bucket.list_bucket_inventory_configurationsc                 C   L   t d| j| | jdtjdtj|id}t d|j|j	 t
|S )u   删除指定的清单配置

        :param str inventory_id : 清单配置id
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        zSStart to delete bucket inventory configuration, bucket: {0}, configuration id: {1}.r   r   rq   zDDelete bucket inventory configuration, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   rk  rl  rj   r8   r   rs  r-   r-   r.   %delete_bucket_inventory_configurationY
  s   z,Bucket.delete_bucket_inventory_configurationc                 C   s|   t d| j| t|}t }t	||d< | j
d|tjdi|d}t d|j|j t|}|jd|_|S )u   创建一条合规保留策略

        :param int retention_period_days : 指定object的保留天数
        :return: :class:`InitBucketWormResult <oss2.models.InitBucketWormResult>`
        zCStart to init bucket worm, bucket: {0}, retention_period_days: {1}.r~  r{   r   r  z4init bucket worm done, req_id: {0}, status_code: {1}zx-oss-worm-id)r:   r]   r   rA   r   to_put_init_bucket_wormr   rh   r   r  r	  r   WORMrj   r8   InitBucketWormResultr=   r   worm_id)r*   retention_period_daysr}   r=   rE   rN   r-   r-   r.   init_bucket_wormf
  s   

zBucket.init_bucket_wormc                 C   r  )u   删除一条合规保留策略
        只有未锁定保留策略的状态下才能删除，一旦锁定bucket数据将处于保护状态。

        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z(Start to abort bucket worm, bucket: {0}.r   r   rq   z5abort bucket worm done, req_id: {0}, status_code: {1})
r:   r]   r   rA   r	  r   r|  rj   r8   r   ru   r-   r-   r.   abort_bucket_wormx
  s   zBucket.abort_bucket_wormc                 C   sF   t d| j| | jdtj|id}t d|j|j t	|S )u   锁定一条合规保留策略

        :param str worm_id : 合规保留策略的id。
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z9Start to complete bucket worm, bucket: {0}, worm_id: {1}.r{   rq   z8complete bucket worm done, req_id: {0}, status_code: {1})
r:   r]   r   rA   r	  r   WORM_IDrj   r8   r   )r*   r~  rE   r-   r-   r.   complete_bucket_worm
  s   zBucket.complete_bucket_wormc                 C   sr   t |}t }t||d< td| j	|| | j
d|tj|tjdi|d}td|j|j t|S )u  延长已经锁定的合规保留策略的object保护天数。

        :param str worm_id : 合规保留策略的id。
        :param int retention_period_days : 指定object的保留天数
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        r~  zNStart to extend bucket worm, bucket: {0}, worm_id: {1}, retention_period_days.r{   r   r  z6extend bucket worm done, req_id: {0}, status_code: {1})r   to_put_extend_bucket_wormr   rh   r   r  r:   r]   r   rA   r	  r   r  WORM_EXTENDrj   r8   r   )r*   r~  r  r}   r=   rE   r-   r-   r.   extend_bucket_worm
  s   
zBucket.extend_bucket_wormc                 C   r  )ur   获取合规保留策略

        :return: :class:`GetBucketWormResult <oss2.models.GetBucketWormResult>`
        z&Start to get bucket worm, bucket: {0}.rd   r   rq   z3get bucket worm done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r|  rj   r8   rO   r   parse_get_bucket_worm_resultGetBucketWormResultru   r-   r-   r.   get_bucket_worm
  rN  zBucket.get_bucket_wormc                 C   l   t d| j t|}t }t	||d< | j
d|tjdddi|d}t d|j|j t|S )	u   设置bucket跨区域复制规则

        :param rule :class:`ReplicationRule <oss2.models.ReplicationRule>`
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z$Start to put bucket replication: {0}r~  r{   r   r   addr  z:Put bucket replication done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   to_put_bucket_replicationr   rh   r   r  r	  r   REPLICATIONrj   r8   r   )r*   r+  r}   r=   rE   r-   r-   r.   put_bucket_replication
     
zBucket.put_bucket_replicationc                 C   r  )u   获取bucket跨区域复制规则

        :return: :class:`GetBucketReplicationResult <oss2.models.GetBucketReplicationResult>`
        z$Start to get bucket replication: {0}rd   r   rq   z:Get bucket replication done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r  rj   r8   rO   r   #parse_get_bucket_replication_resultGetBucketReplicationResultru   r-   r-   r.   get_bucket_replication
  rN  zBucket.get_bucket_replicationc                 C   r  )	u   停止Bucket的跨区域复制并删除Bucket的复制配置
        :param str rule_id: Bucket跨区域复制规则的id。

        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z'Start to delete bucket replication: {0}r~  r{   r   r   r  r  z=Delete bucket replication done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   to_delete_bucket_replicationr   rh   r   r  r	  r   r  rj   r8   r   )r*   rule_idr}   r=   rE   r-   r-   r.   delete_bucket_replication
  r  z Bucket.delete_bucket_replicationc                 C   r  )u   获取可复制到的Bucket所在的地域

        :return: :class:`ReplicationLocation <oss2.models.GetBucketReplicationLocationResult>`
        z-Start to get bucket replication location: {0}rd   r   rq   zCGet bucket replication location done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   REPLICATION_LOCATIONrj   r8   rO   r   ,parse_get_bucket_replication_location_result"GetBucketReplicationLocationResultru   r-   r-   r.   get_bucket_replication_location
  rN  z&Bucket.get_bucket_replication_locationc                 C   sP   t d| j | jdtjdd|id}t d|j|j | 	|t
jtS )u   获取获取某个Bucket的跨区域复制进度

        :param str rule_id: Bucket跨区域复制规则的id。
        :return: :class:`GetBucketReplicationProgressResult <oss2.models.GetBucketReplicationProgressResult>`
        z-Start to get bucket replication progress: {0}rd   r   zrule-idrq   zCGet bucket replication progress done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   REPLICATION_PROGRESSrj   r8   rO   r   ,parse_get_bucket_replication_progress_result"GetBucketReplicationProgressResult)r*   r  rE   r-   r-   r.   get_bucket_replication_progress
  s   z&Bucket.get_bucket_replication_progressc                 C   s>   t d| j | jd|did}t d|j|j |S )uW  获得Bucket某项配置，具体哪种配置由 `config` 指定。该接口直接返回 `RequestResult` 对象。
        通过read()接口可以获得XML字符串。不建议使用。

        :param str config: 可以是 `Bucket.ACL` 、 `Bucket.LOGGING` 等。

        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z'Start to get bucket config, bucket: {0}rd   r   rq   z5Get bucket config done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  rj   r8   )r*   r<  rE   r-   r-   r.   _get_bucket_config
  s   zBucket._get_bucket_configc                 C   sj   t d| j| t|}t }t	||d< | j
d|tjdi|d}t d|j|j t|S )u   为存储空间（Bucket）配置传输加速

        :param str enabled : 是否开启传输加速。true：开启传输加速; false：关闭传输加速.
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        zAStart to bucket transfer acceleration, bucket: {0}, enabled: {1}.r~  r   r   r  z@bucket transfer acceleration done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   #to_put_bucket_transfer_accelerationr   rh   r   r  r	  r   TRANSFER_ACCELERATIONrj   r8   r   )r*   enabledr}   r=   rE   r-   r-   r.    put_bucket_transfer_acceleration
  s   

z'Bucket.put_bucket_transfer_accelerationc                 C   r  )u   获取目标存储空间（Bucket）的传输加速配置

        :return: :class:`GetBucketTransferAccelerationResult <oss2.models.GetBucketTransferAccelerationResult>`
        z.Start to get bucket transfer acceleration: {0}rd   r   rq   zDGet bucket transfer acceleration done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r  rj   r8   rO   r   -parse_get_bucket_transfer_acceleration_result#GetBucketTransferAccelerationResultru   r-   r-   r.    get_bucket_transfer_acceleration	  rN  z'Bucket.get_bucket_transfer_accelerationc                 C   s^   t d| j t|}| jd|tjdtj	did}t d|j
|j | |tjtS )u   创建域名所有权验证所需的CnameToken。

        :param str domain : 绑定的Cname名称。
        :return: :class:`CreateBucketCnameTokenResult <oss2.models.CreateBucketCnameTokenResult>`
        z0Start to create bucket cname token, bucket: {0}.r{   r   r   r   z6bucket cname token done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   to_bucket_cname_configurationr	  r   CNAMEr	  rj   r8   rO   parse_create_bucket_cname_tokenCreateBucketCnameTokenResultr*   domainr}   rE   r-   r-   r.   create_bucket_cname_token  s
   
z Bucket.create_bucket_cname_tokenc                 C   sR   t d| j | jdtj|tjdid}t d|j|j	 | 
|tjtS )u   获取已创建的CnameToken。

        :param str domain : 绑定的Cname名称。
        :return: :class:`GetBucketCnameTokenResult <oss2.models.GetBucketCnameTokenResult>`
        zStart to get bucket cname: {0}rd   r   rq   z4Get bucket cname done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r  r	  rj   r8   rO   r   parse_get_bucket_cname_tokenGetBucketCnameTokenResult)r*   r  rE   r-   r-   r.   get_bucket_cname_token   s   zBucket.get_bucket_cname_tokenc                 C   s\   t d| j t|j|j}| jd|t	j
dt	jdid}t d|j|j t|S )u   为某个存储空间（Bucket）绑定自定义域名。

        :param input: PutBucketCnameRequest类型，包含了证书和自定义域名信息
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z'Start to add bucket cname, bucket: {0}.r{   r   r  r   z0bucket cname done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r  r  certr	  r   r  r	  rj   r8   r   r  r-   r-   r.   put_bucket_cname+  s
   zBucket.put_bucket_cnamec                 C   r  )u   查询某个存储空间（Bucket）下绑定的所有Cname列表。

        :return: :class:`ListBucketCnameResult <oss2.models.ListBucketCnameResult>`
        z(Start to do query list bucket cname: {0}rd   r   rq   ;query list bucket cname done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r  rj   r8   rO   r   parse_list_bucket_cnameListBucketCnameResultru   r-   r-   r.   list_bucket_cname7     zBucket.list_bucket_cnamec                 C   sV   t d| j t|}| jd|tjdtj	did}t d|j
|j t|S )u   删除某个存储空间（Bucket）已绑定的Cname

        :param str domain : 绑定的Cname名称。
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z!Start to delete bucket cname: {0}r{   r   r  r   z7delete bucket cname done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r  r	  r   r  r	  rj   r8   r   r  r-   r-   r.   delete_bucket_cnameB  s
   
zBucket.delete_bucket_cnamec                 C   sH   t d| j | jdtjdddid}t d|j|j t	|S )u   为存储空间（Bucket）开启元数据管理功能

        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z(Start to bucket meta query, bucket: {0}.r{   r   r   r  rq   5bucket meta query done, req_id: {0}, status_code: {1})
r:   r]   r   rA   r	  r   
META_QUERYrj   r8   r   ru   r-   r-   r.   open_bucket_meta_queryN  s   zBucket.open_bucket_meta_queryc                 C   r  )u   获取指定存储空间（Bucket）的元数据索引库信息。

        :return: :class:`GetBucketMetaQueryResult <oss2.models.GetBucketMetaQueryResult>`
        z#Start to get bucket meta query: {0}rd   r   rq   z9Get bucket meta query done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r  rj   r8   rO   r   "parse_get_bucket_meta_query_resultGetBucketMetaQueryResultru   r-   r-   r.   get_bucket_meta_query_statusX  r  z#Bucket.get_bucket_meta_query_statusc                 C   sd   t d| j | ttj|}| jd|t	j
dt	jdid}t d|j|j | |tjtS )u  查询满足指定条件的文件（Object），并按照指定字段和排序方式列出文件信息。

        :param do_meta_query_request :class:`MetaQuery <oss2.models.MetaQuery>`
        :return: :class:`DoBucketMetaQueryResult <oss2.models.DoBucketMetaQueryResult>`
        z"Start to do bucket meta query: {0}r{   r   queryr   z8do bucket meta query done, req_id: {0}, status_code: {1})r:   r]   r   rA   rr  	MetaQueryr   to_do_bucket_meta_query_requestr	  r   r  r	  rj   r8   rO   !parse_do_bucket_meta_query_resultDoBucketMetaQueryResult)r*   do_meta_query_requestr}   rE   r-   r-   r.   do_bucket_meta_queryb  s
   zBucket.do_bucket_meta_queryc                 C   sJ   t d| j | jdtjdtjdid}t d|j|j	 t
|S )u   关闭存储空间（Bucket）的元数据管理功能

        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z%Start to close bucket meta query: {0}r{   r   r  rq   r  )r:   r]   r   rA   r	  r   r  r	  rj   r8   r   ru   r-   r-   r.   close_bucket_meta_queryo  s   zBucket.close_bucket_meta_queryc                 C   rU  )u   更新 Bucket 访问跟踪状态。

        :param str status : bucket访问跟踪的开启状态
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z0Start to put bucket access monitor, bucket: {0}.r   r   r   z9bucket access monitor done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   to_put_bucket_access_monitorr	  r   ACCESS_MONITORrj   r8   r   )r*   r8   r}   rE   r-   r-   r.   put_bucket_access_monitory  
   
z Bucket.put_bucket_access_monitorc                 C   r  )u   获取当前Bucket的访问跟踪的状态。

        :return: :class:`GetBucketAccessMonitorResult <oss2.models.GetBucketAccessMonitorResult>`
        z'Start to get bucket access monitor: {0}rd   r   rq   r  )r:   r]   r   rA   r	  r   r  rj   r8   rO   r   &parse_get_bucket_access_monitor_resultGetBucketAccessMonitorResultru   r-   r-   r.   get_bucket_access_monitor  r  z Bucket.get_bucket_access_monitorc                 C   r  )u   查询存储空间（Bucket）的资源组ID。

        :return: :class:`GetBucketResourceGroupResult <oss2.models.GetBucketResourceGroupResult>`
        z'Start to get bucket resource group: {0}rd   r   rq   z=Get bucket resource group done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   RESOURCE_GROUPrj   r8   rO   r   &parse_get_bucket_resource_group_resultGetBucketResourceGroupResultru   r-   r-   r.   get_bucket_resource_group  rN  z Bucket.get_bucket_resource_groupc                 C   rU  )u   为存储空间（Bucket）配置所属资源组。

        :param str resourceGroupId : Bucket所属的资源组ID。
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z0Start to put bucket resource group, bucket: {0}.r   r   r   z9bucket resource group done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   to_put_bucket_resource_groupr	  r   r  rj   r8   r   )r*   resourceGroupIdr}   rE   r-   r-   r.   put_bucket_resource_group  r  z Bucket.put_bucket_resource_groupc                 C   sV   t d| j t|}| jd|tjdtj	|id}t d|j
|j t|S )u  新增图片样式。

        :param str styleName : 样式名称。
        :param str content : 图片样式内容，图片样式可以包含一个或多个图片处理操作。
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z'Start to put bucket style, bucket: {0}.r   r   r   z0bucket style done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   to_put_bucket_styler	  r   STYLE
STYLE_NAMErj   r8   r   )r*   r   contentr}   rE   r-   r-   r.   put_bucket_style  s
   
zBucket.put_bucket_stylec                 C   rp  )u   查询某个Bucket下指定的图片样式信息。

        :param str styleName : 样式名称。
        :return: :class:`GetBucketStyleResult <oss2.models.GetBucketStyleResult>`
        zStart to get bucket style: {0}rd   r   rq   z4Get bucket style done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r  r  rj   r8   rO   r   parse_get_bucket_style_resultGetBucketStyleResultr*   r   rE   r-   r-   r.   get_bucket_style  s   zBucket.get_bucket_stylec                 C   r  )u   查询某个Bucket下已创建的所有图片样式。

        :return: :class:`ListBucketStyleResult <oss2.models.ListBucketStyleResult>`
        zStart to list bucket style: {0}rd   r   rq   z;query list bucket style done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r  rj   r8   rO   r   parse_list_bucket_styleListBucketStyleResultru   r-   r-   r.   list_bucket_style  r  zBucket.list_bucket_stylec                 C   J   t d| j | jdtjdtj|id}t d|j|j	 t
|S )u   删除某个Bucket下指定的图片样式。

        :param str styleName : 样式名称。
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z!Start to delete bucket style: {0}r   r   rq   z7delete bucket style done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r  r  rj   r8   r   r  r-   r-   r.   delete_bucket_style  s   zBucket.delete_bucket_stylec                 C   sr   t |}td| jt|| dtj|f }| j	d|tjdi||d}td|j
|j | |tjtS )u  异步处理多媒体接口。

        :param str key: 处理的多媒体的对象名称
        :param str process: 处理的字符串，例如"video/convert,f_mp4,vcodec_h265,s_1920x1080,vb_2000000,fps_30,acodec_aac,ab_100000,sn_1|sys/saveas,o_dGVzdC5qcGc,b_dGVzdA"

        :param headers: HTTP头部
        :type headers: 可以是dict，建议是oss2.CaseInsensitiveDict
        zBStart to async process object, bucket: {0}, key: {1}, process: {2}r  r{   r   r|   z8Async process object done, req_id: {0}, status_code: {1})r   rh   r:   r]   r   rA   r   r   ASYNC_PROCESSr  rj   r8   rO   r   parse_async_process_objectAsyncProcessObjectr  r-   r-   r.   async_process_object  s   

zBucket.async_process_objectc                 C   sZ   t d| j| t|}| jd|tjdtj	tj
id}t d|j|j t|S )uR   设置bucket回调策略

        :param str callbackPolicy: 回调策略
        zFStart to put bucket callback policy, bucket: {0}, callback policy: {1}r   r   r   z>Put bucket callback policy done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   $to_do_bucket_callback_policy_requestr	  r   rA  r	  CALLBACKrj   r8   r   )r*   callbackPolicyr}   rE   r-   r-   r.   put_bucket_callback_policy  s
   
z!Bucket.put_bucket_callback_policyc                 C   sT   t d| j | jdtjdtjtjid}t d|j	|j
 | |tjtS )ut   获取bucket回调策略
        :return: :class:`GetBucketPolicyResult <oss2.models.CallbackPolicyResult>`
        z0Start to get bucket callback policy, bucket: {0}rd   r   rq   z>Get bucket callback policy done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   rA  r	  r  rj   r8   rO   r   parse_callback_policy_resultCallbackPolicyResultru   r-   r-   r.   get_bucket_callback_policy  s   z!Bucket.get_bucket_callback_policyc                 C   sL   t d| j | jdtjdtjtjid}t d|j	|j
 t|S )ue   删除bucket回调策略
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z3Start to delete bucket callback policy, bucket: {0}r   r   rq   zADelete bucket callback policy done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   rA  r	  r  rj   r8   r   ru   r-   r-   r.   delete_bucket_callback_policy  s   z$Bucket.delete_bucket_callback_policyc                 C   R   t d| j| t|}| jd|tjdid}t d|j	|j
 t|S )u[   设置归档直读

        :param boolean enabled: Bucket是否开启归档直读
        zBStart to put bucket archive direct read, bucket: {0}, enabled: {1}r   r   r   z>bucket archive direct read done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   !to_put_bucket_archive_direct_readr	  r   ARCHIVE_DIRECT_READrj   r8   r   )r*   r  r}   rE   r-   r-   r.   put_bucket_archive_direct_read  s
   
z%Bucket.put_bucket_archive_direct_readc                 C   r  )u   获取归档直读
        :return: :class:`GetBucketArchiveDirectReadResult <oss2.models.GetBucketArchiveDirectReadResult>`
        z4Start to get bucket archive direct read, bucket: {0}rd   r   rq   zBGet bucket archive direct read done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r  rj   r8   rO   r   $parse_get_bucket_archive_direct_read GetBucketArchiveDirectReadResultru   r-   r-   r.   get_bucket_archive_direct_read  r  z%Bucket.get_bucket_archive_direct_readc                 C   r  )ub   Bucket开启或关闭TLS版本设置。
        :param httpsConfig: TLS版本信息设置
        z@Start to put bucket https config, bucket: {0}, https config: {1}r   r   r   z;Put bucket https config done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   !to_do_bucket_https_config_requestr	  r   HTTPS_CONFIGrj   r8   r   )r*   r   r}   rE   r-   r-   r.   put_bucket_https_config   s
   
zBucket.put_bucket_https_configc                 C   T   t d| j| | jdtjdtj|id}t d|j|j	 | 
|tjtS )ul   为Bucket创建存储冗余转换任务。

        :param str targetType: 目标存储冗余类型
        zPStart to create bucket data redundancy transition, bucket: {0}, target type: {1}r{   r   rq   zLCreate bucket data redundancy transition done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r   TARGET_REDUNDANCY_TYPErj   r8   rO   r   .parse_create_data_redundancy_transition_result$CreateDataRedundancyTransitionResult)r*   
targetTyperE   r-   r-   r.   (create_bucket_data_redundancy_transition+  s   z/Bucket.create_bucket_data_redundancy_transitionc                 C   rp  )u   获取存储冗余转换任务。
        :return: :class:`DataRedundancyTransitionInfoResult <oss2.models.DataRedundancyTransitionInfoResult>`
        z;Start to get bucket data redundancy transition, bucket: {0}rd   r   rq   zIGet bucket data redundancy transition done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r   REDUNDANCY_TRANSITION_TASK_IDrj   r8   rO   r   +parse_get_bucket_data_redundancy_transition"DataRedundancyTransitionInfoResultr*   taskIdrE   r-   r-   r.   %get_bucket_data_redundancy_transition7  s   z,Bucket.get_bucket_data_redundancy_transitionc                 C   r  )un   删除存储冗余转换任务。
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z>Start to delete bucket data redundancy transition, bucket: {0}r   r   rq   zLDelete bucket data redundancy transition done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r   r  rj   r8   r   r  r-   r-   r.   (delete_bucket_data_redundancy_transitionA  s   z/Bucket.delete_bucket_data_redundancy_transitionc                 C   r  )uv   查看Bucket的TLS版本设置。
        :return: :class:`HttpsConfigResult <oss2.models.HttpsConfigResult>`
        z-Start to get bucket https config, bucket: {0}rd   r   rq   z;Get bucket https config done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r  rj   r8   rO   r   parse_get_bucket_https_configHttpsConfigResultru   r-   r-   r.   get_bucket_https_configJ  s   zBucket.get_bucket_https_configc                 C   r  )u   列举某个Bucket下所有的存储冗余转换任务。

        :return: :class:`ListBucketDataRedundancyTransitionResult <oss2.models.ListBucketDataRedundancyTransitionResult>`
        z=Start to do query list bucket data redundancy transition: {0}rd   r   rq   zPquery list bucket data redundancy transition done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r   rj   r8   rO   r   ,parse_list_bucket_data_redundancy_transition(ListBucketDataRedundancyTransitionResultru   r-   r-   r.   &list_bucket_data_redundancy_transitionT  r  z-Bucket.list_bucket_data_redundancy_transitionc                 C   sX   t d| j t|}| jd|tjdid}t d|j	|j
 | |tjtS )u   创建接入点
        :param accessPoint :class:`CreateAccessPointRequest <oss2.models.CreateAccessPointRequest>`
        :return: :class:`CreateAccessPointResult <oss2.models.CreateAccessPointResult>`
        z)Start to create access point, bucket: {0}r   r   r   z7Create access point done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   !to_do_create_access_point_requestr	  r   r   rj   r8   rO    parse_create_access_point_resultCreateAccessPointResult)r*   r   r}   rE   r-   r-   r.   create_access_point_  s
   
zBucket.create_access_pointc                 C   s^   t d| j t }||d< | jdtjdi|d}t d|j	|j
 | |tjtS )u   获取接入点信息
        :param str accessPointName: 接入点名称
        :return: :class:`GetAccessPointResult <oss2.models.GetAccessPointResult>`
        z&Start to get access point, bucket: {0}r   rd   r   re   z4Get access point done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   rh   r	  r   r   rj   r8   rO   r   parse_get_access_point_resultGetAccessPointResultr*   accessPointNamer=   rE   r-   r-   r.   get_access_pointj  s   zBucket.get_access_pointc                 C   V   t d| j t }||d< | jdtjdi|d}t d|j	|j
 t|S )u   删除接入点
         :param str accessPointName: 接入点名称
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z)Start to delete access point, bucket: {0}r   r   r   re   z7Delete access point done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   rh   r	  r   r   rj   r8   r   r  r-   r-   r.   delete_access_pointw     zBucket.delete_access_pointc                 C   sX   t d| j | jdtjddt|d|id}t d|j|j	 | 
|tjtS )u  查询某个Bucket下所有接入点。
        param: int max_keys: 本次list返回access point的最大个数
        param: str continuation_token: list时指定的起始标记
        :return: :class:`ListAccessPointResult <oss2.models.ListAccessPointResult>`
        z&Start to list bucket access point: {0}rd   r   rc   r   rq   zBquery list bucket access point done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r   rg   rj   r8   rO   r   r   r   r   r-   r-   r.   list_bucket_access_points  s    z Bucket.list_bucket_access_pointsc                 C   sZ   t d| j| t }||d< | jd|tjdi|d}t d|j	|j
 t|S )u   设置接入点策略
        :param str accessPointName: 接入点名称
        :param str accessPointPolicy : 接入点策略
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        zEStart to put access point policy, bucket: {0}, accessPointPolicy: {1}r   r   r   r  z>Create access point policy done, req_id: {0}, status_code: {1}r:   r]   r   rA   r   rh   r	  r   ACCESS_POINT_POLICYrj   r8   r   )r*   r  r   r=   rE   r-   r-   r.   put_access_point_policy  s   zBucket.put_access_point_policyc                 C   r  )u   获取接入点策略
        :param str accessPointName: 接入点名称
        :return: :class:`GetAccessPointPolicyResult <oss2.models.GetAccessPointPolicyResult>`
        z-Start to get access point policy, bucket: {0}r   rd   r   re   z;Get access point policy done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   rh   r	  r   r  rj   r8   GetAccessPointPolicyResultr  r-   r-   r.   get_access_point_policy  s   zBucket.get_access_point_policyc                 C   r  )u   删除接入点策略
        :param str accessPointName: 接入点名称
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z0Start to delete access point policy, bucket: {0}r   r   r   re   z>Delete access point policy done, req_id: {0}, status_code: {1}r  r  r-   r-   r.   delete_access_point_policy  r  z!Bucket.delete_access_point_policyc                 C   r  )u   为Bucket开启阻止公共访问。

        :param bool block_public_access : 是否开启阻止公共访问。
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        zCStart to bucket put public access block, bucket: {0}, enabled: {1}.r   r   r   z>bucket public access block done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r   r	  r   r   rj   r8   r   r   r-   r-   r.   put_bucket_public_access_block  s   

z%Bucket.put_bucket_public_access_blockc                 C   r  )u   获取指定Bucket的阻止公共访问配置信息。

        :return: :class:`GetBucketPublicAccessBlockResult <oss2.models.GetBucketPublicAccessBlockResult>`
        z,Start to get bucket public access block: {0}rd   r   rq   zBGet bucket public access block done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r   rj   r8   rO   r   r    GetBucketPublicAccessBlockResultru   r-   r-   r.   get_bucket_public_access_block  rN  z%Bucket.get_bucket_public_access_blockc                 C   r  )u   删除指定Bucket的阻止公共访问配置信息。
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        z7Start to delete bucket public access block, bucket: {0}r   r   rq   zEDelete bucket public access block done, req_id: {0}, status_code: {1})
r:   r]   r   rA   r	  r   r   rj   r8   r   ru   r-   r-   r.   !delete_bucket_public_access_block  rF  z(Bucket.delete_bucket_public_access_blockc                 C   sZ   t d| j|| t|}| jd|tjdtj	|id}t d|j
|j t|S )u   为接入点开启阻止公共访问。

        :param bool block_public_access : 是否开启阻止公共访问。
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        zmStart to put access point public access block, bucket: {0}, access point name: {1}, block public access: {2}.r   r   r   zDaccess point public access block done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r   r	  r   r   OSS_ACCESS_POINT_NAMErj   r8   r   )r*   access_point_namer   r}   rE   r-   r-   r.   $put_access_point_public_access_block  s   
z+Bucket.put_access_point_public_access_blockc                 C   r  )u   获取指定接入点的阻止公共访问配置信息。

        :return: :class:`GetBucketPublicAccessBlockResult <oss2.models.GetBucketPublicAccessBlockResult>`
        zKStart to get access point public access block: {0}, access point name: {1}.rd   r   rq   zHGet access point public access block done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r   r"  rj   r8   rO   r   r   r  r*   r#  rE   r-   r-   r.   $get_access_point_public_access_block  s   z+Bucket.get_access_point_public_access_blockc                 C   ry  )u   删除指定接入点的阻止公共访问配置信息。
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        zVStart to delete access point public access block, bucket: {0}, access point name: {1}.r   r   rq   zKDelete access point public access block done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r   r"  rj   r8   r   r%  r-   r-   r.   'delete_access_point_public_access_block  s   z.Bucket.delete_access_point_public_access_blockc                 C   sf   t d| j|| |stdt|}| jd|tj	dtj
|id}t d|j|j t|S )u   修改请求者在Bucket上的流控配置。

        :param str uid: 请求者UID
        :param qos_configuration :class:`QoSConfiguration <oss2.models.QoSConfiguration>`
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        zVStart to put bucket requester qos info, bucket: {0}, uid: {1}, qos_configuration: {2}.r   r   r   r   zAput bucket requester qos info done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r   r   r	  r   r   r   rj   r8   r   )r*   r   r   r}   rE   r-   r-   r.   put_bucket_requester_qos_info  s   
z$Bucket.put_bucket_requester_qos_infoc                 C   s`   t d| j| |std| jdtjdtj|id}t d|j	|j
 | |tjtS )u   获取请求者在Bucket上的流控配置。

        :return: :class:`RequesterQoSInfoResult <oss2.models.RequesterQoSInfoResult>`
        z6Start to get bucket requester qos info: {0}, uid: {1}.r   rd   r   rq   z<Get bucket requester qos info, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r	  r   r   r   rj   r8   rO   r   r   r   r*   r   rE   r-   r-   r.   get_bucket_requester_qos_info  s   z$Bucket.get_bucket_requester_qos_infoc              	   C   sX   t d| j | jdtjdd|dt|id}t d|j|j	 | 
|tjtS )u#  列举所有对该Bucket的请求者流控配置。

        :param str continuation_token: 分页标志,首次调用传空串
        :param int max_keys: 最多返回数目
        :return: :class:`ListBucketRequesterQoSInfosResult <oss2.models.ListBucketRequesterQoSInfosResult>`
        z6Start to do query list bucket requester qos infos: {0}rd   r   r   rc   rq   zIquery list bucket requester qos infos done, req_id: {0}, status_code: {1})r:   r]   r   rA   r	  r   r   rg   rj   r8   rO   r   %parse_list_bucket_requester_qos_infos!ListBucketRequesterQoSInfosResultr   r-   r-   r.   list_bucket_requester_qos_infos   s    z&Bucket.list_bucket_requester_qos_infosc                 C   sX   t d| j| |std| jdtjdtj|id}t d|j	|j
 t|S )uz   删除在Bucket上的请求者流控配置。
        :return: :class:`RequestResult <oss2.models.RequestResult>`
        zAStart to delete bucket requester qos info, bucket: {0}, uid: {1}.r   r   r   rq   zDDelete bucket requester qos info done, req_id: {0}, status_code: {1})r:   r]   r   rA   r   r	  r   r   r   rj   r8   r   r)  r-   r-   r.    delete_bucket_requester_qos_info.  s   z'Bucket.delete_bucket_requester_qos_infoc                 K   s2   | j std|std| j|| j |fi |S )Nz(Bucket name should not be null or empty.z key should not be null or empty.)rA   r   rH   )r*   r@   rB   rC   r-   r-   r.   __do_object;  s
   zBucket.__do_objectc                 K   s   | j || jdfi |S Nr   )rH   rA   )r*   r@   rC   r-   r-   r.   __do_bucketB  s   zBucket.__do_bucketc                 C   s   t ||r	||S |S rK   )
isinstance)r*   rM   	converterr}   r-   r-   r.   __convert_dataE  s   
zBucket.__convert_data)
FNNr   TNNNFT)NNFN)r   r   r   r1   N)r   r   r   r   Fr  r1   N)NN)NNN)NNNNN)NNNNrK   )r   r   r   r   r  N)r   r  N)r   r   r1   )r   r   )r   r   r   r1   r   Nr   r   r   )rP   rQ   rR   r   rx  r  r  r  r  r  r  r  r	  r  r  r  r  r  r1  r   r*  r4  r;  rg  rq  r]  rA  rH  rr   rW  r_  
SEQUENTIALrk  rl  ru  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r   r  r"  r   r   r   r   r   r/   rI   r  r  r  r  r%  r&  r'  r-  r6  rD  rM  rO  rP  rS  rW  r[  r`  re  rl  ro  rp  rv  rz  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r&  r'  r,  r/  r0  r1  r2  r3  r8  r=  r@  rB  rD  rE  rJ  rM  rQ  rS  rT  rY  r\  rc  rh  ro  rt  rx  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r  r  r  r  r   r!  r$  r&  r'  r(  r*  r-  r.  r  r	  rr  r   r-   r-   r_   r.   r   I  s    1"*/1;*#( -%')0






&
	




	

	
	
r   c                 C   s`   | }|  ds|  dsd|  }t|}|jd ur(|jd |j d t|j S |jd |j S )Nr   r   z://:)r   r   portschemehostnamerg   )r   r  r  r-   r-   r.   r   L  s   
r   r2      c                 C   s>   | d u rdS | d }| d }|d u r|d u rdS dt || S )Nr   r   r   zbytes=)_range)r.  startlastr-   r-   r.   r0  _  s   r0  c                 C   s   dd }|| d || S )Nc                 S   s   | d u rdS t | S r0  )rg   )posr-   r-   r.   to_strm  s   z_range.<locals>.to_str-r-   )r<  r=  r?  r-   r-   r.   r;  l  s   r;  c                 C   s0   t | rtS |rtS |rtS t |rtS tS rK   )r   is_ip_or_localhost_ENDPOINT_TYPE_IP_ENDPOINT_TYPE_CNAME_ENDPOINT_TYPE_PATH_STYLEr   _ENDPOINT_TYPE_ALIYUN)netlocr+   rA   r,   r-   r-   r.   _determine_endpoint_typev  s   

rG  c                   @   s   e Zd Zdd ZdddZdS )r&   c                 C   s(   t |}|j| _|j| _|| _|| _d S rK   )r   r8  rF  r+   r,   )r*   r   r+   r,   r  r-   r-   r.   r/     s
   
z_UrlMaker.__init__Fc                 C   s   t | j| j|| j| _|du rdnd}t||d}| jtkr'd| j| j|S | jt	ks1| jt
krF|r=d| j| j||S d| j| j|S |sT|rLJ d| j| jS d| j|| j|S )	NTr   r   )safez{0}://{1}/{2}z{0}://{1}/{2}/{3}z	{0}://{1}z{0}://{1}.{2}/{3})rG  rF  r+   r,   typer   rC  r   r8  rB  rD  )r*   rA   rB   r   rH  r-   r-   r.   __call__  s   
z_UrlMaker.__call__Nr   )rP   rQ   rR   r/   rJ  r-   r-   r-   r.   r&     s    r&   )"r   r   r   r   r   r   r   r   r   r	   compatr   r   r   r   r=   timerH  	getLoggerrP   r:   objectr   rT   r   r   rE  rC  rB  rD  r0  r;  rG  r&   r-   r-   r-   r.   <module>   sj    5
H  7                      
