
    -pj?                    "   S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKJr  SSKJr  SSKJrJrJr  SSKJrJrJrJr  SSKrSSKrSSKrSSKrSSKJr  SSKJr  SS	KJr  SS
KJ r   SSK!J"r"  SSK!J#r#  SSK!J$r$  SSK%J&r&  SSK%J'r'  SSK%J(r(  SSK%J)r)  SSK%J*r*  SSK+J,r,  SSK-J.r.  SSK-J/r/  SSK-J0r0  SSK1J2r2  SSKJ3r3  SSK4J5r6  \Rn                  " \85      r9Sr:Sr;Sr<Sr= " S S5      r> " S S \ 5      r? " S! S"\@5      rA " S# S$\@5      rBg)%z.
This module provides a client class for BOS.
    N)str)bytes)	iteritemsiterkeys
itervalues)ThreadPoolExecutorwaitALL_COMPLETEDFIRST_COMPLETED)bce_client_configuration)utils)bce_v1_signer)BceBaseClient)BceClientError)BceServerError)BceHttpClientError)bce_http_client)handler)http_content_types)http_headers)http_methods)bos)bos_handler)common)storage_class)required)compats   syncs   asyncAES256s   httpc                   *    \ rS rSrSrS rS rS rSrg)UploadTaskHandleA   z7
handle to control multi upload file with multi-thread
c                 F    SU l         [        R                  " 5       U l        g NF)cancel_flag	threadingLockcancel_lockselfs    \/var/www/html/pdf-tiff/venv/lib/python3.13/site-packages/baidubce/services/bos/bos_client.py__init__UploadTaskHandle.__init__E   s     $>>+    c                 z    U R                   R                  5         SU l        U R                   R                  5         g)z9
cancel putting super object from file with multi-thread
TNr'   acquirer$   releaser(   s    r*   cancelUploadTaskHandle.cancelI   s0     	  "  "r-   c                     U R                   R                  5         U R                  nU R                   R                  5         U$ )z
get cancel flag
r/   )r)   results     r*   	is_cancelUploadTaskHandle.is_cancelQ   s8     	  "!!  "r-   )r$   r'   N)	__name__
__module____qualname____firstlineno____doc__r+   r2   r6   __static_attributes__ r-   r*   r    r    A   s    ,#r-   r    c                   ~   \ rS rSrSrSS jrSS jr\" \\	4S9SS j5       r
\" \\	4S9SS j5       r\" \\	4S9SS	 j5       r\" \\	4S9SS
 j5       r\S 5       r\" \\	4\\4S9SS j5       r\" \\	4\4S9SS j5       r\" \\	4\\	4S9SS j5       r\" \\	4S9SS j5       r\" \\	4S9SS j5       r\" \\	4S9SS j5       r\" \\	4S9SS j5       r\" \\	4S9SS j5       r\" \\	4S9\S4S j5       r\" \\	4S9SS j5       r\" \\	4S9SS j5       r\" \\	4\4S9SS j5       r\" \\	4S9SS j5       r\" \\	4S9SS j5       r \" \\	4\4S9SS j5       r!\" \\	4S9SS  j5       r"\" \\	4S9SS! j5       r#\" \\	4S9SS" j5       r$\" \\	4S9SS# j5       r%\" \\	4\4S$9SS% j5       r&\" \\	4\\	4S&9SS' j5       r'\" \\	4\\	4S&9SS( j5       r(\" \\	4S9SS) j5       r)\" \\	4S9SS* j5       r*\" \\	4S9SS+ j5       r+\" \\	4S9SS, j5       r,\" \\	4\\	4S-9S.S/SSSSS\-R\                  4S0 j5       r/\" \\	4\\4S19 SS2 j5       r0\" \\	4S9SS3 j5       r1\" \\	4S9SS4 j5       r2\" \\	4\4S59 SS6 j5       r3\" \\	4S9SS7 j5       r4\" \\	4S9SS8 j5       r5\" \\	4S9  SS9 j5       r6\" \\	4S9SS: j5       r7\S; 5       r8\S< 5       r9\" \\	4\\	4S-9  SS= j5       r:\" \\	4\\	4S-9SS> j5       r;\SS? j5       r<\S@ 5       r=\" \\	4\\	4S-9SSA j5       r>\" \\	4\\	4\\	4SB9  SSC j5       r?\" \\	4\\	4S-9SSD j5       r@\" \\	4\\	4\A4\BR                  4SE9               SSF j5       rD\" \\	4\\	4\\	4SG9              SSH j5       rE\" \\	4\\	4\A4\BR                  4SE9                  SSI j5       rF\" \\	4\\	4\\	4SJ9                  SSK j5       rG\" \\	4\\	4\\	4SL9                   SSM j5       rH\" \\	4\\	4\\	4\\	4SN9          SSO j5       rI\" \\	4\\	4S-9SSP j5       rJ\" \\	4\4SQ9SSR j5       rK\" \\	4\\	4\\	4SS9  SST j5       rL\" \\	4S9SSU j5       rM\" \\	4S9SSV j5       rN\" \\	4\\	4S-9    SSW j5       rO\" \\	4\\	4\\	4\P4\BR                  4\A4SX9   SSY j5       rQ\" \\	4\\	4\\	4\\	4\\	4\P4\BR                  4\BR                  4SZ9     SS[ j5       rR\" \\	4\\	4\\	4\P4\BR                  4\\	4\BR                  4S\9    SS] j5       rS\" \\	4\\	4\\	4\4S^9        SS_ j5       rT\" \\	4\\	4\\	4S`9SSa j5       rU\" \\	4\\	4\\	4S`9  SSb j5       rV\" \\	4\\	4\\	4S`9SSc j5       rW\" \\	4S9   SSd j5       rX\" \\	4S9SSe j5       rY  SSf jrZ\" \\	4\\	4\\	4SB9              SSg j5       r[\" \\	4\\	4\\4Sh9SSi j5       r\\" \\	4\\	4S-9    SSj j5       r]\" \\	4\\	4S-9SSk j5       r^\" \\	4\\	4S-9SSl j5       r_\" \\	4\\	4\\	4Sm9   SSn j5       r`\" \\	4\\	4\\	4\a4So9  SSp j5       rb\" \\	4\\	4Sq9SSr j5       rc\" \\	4\\	4\Ss9SSt j5       rdSSu jre\" \P\P4Sv9SSw j5       rfSSx jrg\" \\	4S9SSy j5       rh\" \\	4\4Sz9SS{ j5       ri\" \\	4S9SS| j5       rj\" \\	4\4S}9SS~ j5       rk\" \\	4S9SS j5       rl\" \\	4S9SS j5       rm\" \\	4\\	4\4S9SS j5       rnSS jro\" \\	4\\	4S-9SS j5       rp\" \\	4\\	4S-9SS j5       rq\" \\	4\\	4S9SS j5       rr\" \\	4S9SS j5       rs\" \\	4S9  SS j5       rt\" \\	4\P4S9 SS j5       ru\" \\	4S9SS j5       rv\" \\	4S9SS j5       rw\" \\	4S9 SS j5       rx\" \\	4\P4S9 SS j5       ry\" \\	4S9 SS j5       rz\" \\	4\4S9 SS j5       r{\" \\	4S9 SS j5       r|\" \\	4S9 SS j5       r}\" \\	4\4S9 SS j5       r~\" \\	4S9 SS j5       r\                 SS j5       r\S 5       r\SS j5       rS r\SS j5       rS rS r\S 5       r\S 5       r   SS jrSrg)	BosClient[   z
sdk client
Nc                 0    [         R                  " X5        g N)r   r+   r)   configs     r*   r+   BosClient.__init___   s    t,r-   c                 >    U R                  [        R                  US9$ )z
List buckets of user

:param config: None
:type config: BceClientConfiguration
:returns: all buckets owned by the user.
:rtype: baidubce.bce_response.BceResponse
rE   _send_requestr   GETrD   s     r*   list_bucketsBosClient.list_bucketsb   s      !!,"2"26!BBr-   )bucket_namec                 `    SS0nU R                  [        R                  XUS9nUR                  $ )z
Get the region which the bucket located in.

:param bucket_name: the name of bucket
:type bucket_name: string or unicode
:param config: None
:type config: BceClientConfiguration

:return: region of the bucket
:rtype: str
s   locationr-   paramsrE   )rJ   r   rK   location_constraint)r)   rN   rE   rQ   responses        r*   get_bucket_locationBosClient.get_bucket_locationm   s8     s#%%l&6&6[a%b+++r-   c                     0 nUb  X%[         R                  '   U(       a:  [        R                  U[         R                  '   [
        R                  " SS05      nOSnU R                  [        R                  UUUUS9$ )z
Create bucket with specific name

:param bucket_name: the name of bucket
:type bucket_name: string or unicode
:param config: None
:type config: BceClientConfiguration
:returns:
:rtype: baidubce.bce_response.BceResponse
NenableMultiAzT)headersbodyrE   )
r   BOS_TAG_LISTr   JSONCONTENT_TYPEjsondumpsrJ   r   PUT)r)   rN   tag_list
enable_mazrE   rX   rY   s          r*   create_bucketBosClient.create_bucket~   s{     19L--.1C1H1HGL--.::56DD!! " 
 	
r-   c                     U R                  [        R                  XS9  g! [         a  n[	        UR
                  [        5      (       an  UR
                  R                  [        R                  R                  :X  a   SnAgUR
                  R                  [        R                  R                  :X  a   SnAgUeSnAff = f)z
Check whether there is a bucket with specific name

:param bucket_name: None
:type bucket_name: str
:return:True or False
:rtype: bool
rH   TNF)rJ   r   HEADr   
isinstance
last_errorr   status_codehttpclient	FORBIDDEN	NOT_FOUND)r)   rN   rE   es       r*   does_bucket_existBosClient.does_bucket_exist   s    		|00+M! 	!,,77<<++t{{/D/DD<<++t{{/D/DD G	s!   ! 
B?AB:2B:8B::B?c                 F    U R                  [        R                  USS0US9$ )zp
Get Access Control Level of bucket

:type bucket: string
:param bucket: None
:return:
    **json text of acl**
   aclr-   rP   rI   r)   rN   rE   s      r*   get_bucket_aclBosClient.get_bucket_acl   s2     !!  }	 "  	r-   c                 ~    0 n[        U R                  5       H!  u  p#UR                  S5      (       a  M  X1U'   M#     U$ )N_)r   __dict__
startswith)aclr5   kvs       r*   _dump_acl_objectBosClient._dump_acl_object   s9    cll+DA<<$$q	 , r-   )rN   ry   c           	          U R                  [        R                  U[        R                  " SU0[
        R                  S9[        R                  [        R                  0SS0US9$ )z
Set Access Control Level of bucket

:type bucket: string
:param bucket: None

:type grant_list: list of grant
:param grant_list: None
:return:
    **HttpResponse Class**
accessControlListdefaultrq   r-   rY   rX   rQ   rE   rJ   r   r_   r]   r^   r@   r|   r   r\   r   r[   )r)   rN   ry   rE   s       r*   set_bucket_aclBosClient.set_bucket_acl   sd     !!,"2"2& $

,?+E3<3M3M!O$0$=$=?Q?V?V#W#)3-"( " * 	*r-   )rN   
canned_aclc                 h    U R                  [        R                  U[        R                  U0SS0US9$ )zA

:param bucket_name:
:param canned_acl:
:param config:
:return:
rq   r-   rX   rQ   rE   )rJ   r   r_   r   BCE_ACL)r)   rN   r   rE   s       r*   set_bucket_canned_aclBosClient.set_bucket_canned_acl   s?     !!,"2"2&$0$8$8*#E#)3-"(	 " * 	*r-   )rN   r   c           	          [         R                  " U5      nU R                  [        R                  U[
        R                  " SU0[        R                  S9[        R                  [        R                  0SS0US9$ ).

:param bucket_name:
:param config:
:return:
storageClassr      storageClassr-   r   r   convert_to_stringrJ   r   r_   r]   r^   r@   r|   r   r\   r   r[   )r)   rN   r   rE   s       r*   set_bucket_storage_class"BosClient.set_bucket_storage_class   st     00?!!,"2"2& $

NM+J3<3M3M!O$0$=$=?Q?V?V#W#2C"8"( " * 	*r-   c                 F    U R                  [        R                  USS0US9$ )r   r   r-   rP   rI   rr   s      r*   get_bucket_storage_class"BosClient.get_bucket_storage_class   s2     !!,"2"2&#2C"8"( " * 	*r-   c                 >    U R                  [        R                  XS9$ )z
Delete a Bucket(Must Delete all the Object in Bucket before)

:type bucket: string
:param bucket: None
:return:
    **HttpResponse Class**
rH   rJ   r   DELETErr   s      r*   delete_bucketBosClient.delete_bucket  s      !!,"5"5{!RRr-   c           	          0 nUb  X%S'   Ub  X5S'   U R                  [        R                  U[        R                  " U[
        R                  S9[        R                  [        R                  0SS0US9$ )ac  
Set index page and not_found 404 page for static website trusteeship

:type bucket_name: string
:param bucket_name: None

:type index:string
:param index:object name of index page for static website trusteeship

:type not_found:string
:param not_found:object name of not_found 404 page for static website trusteeship

:return:
    **HttpResponse Class**
indexnotFoundr      websiter-   r   r   )r)   rN   r   	not_foundrE   rY   s         r*   put_bucket_static_website#BosClient.put_bucket_static_website  s    " !M (!!,"2"2& $

43<3M3M!O$0$=$=?Q?V?V#W#-s"3"( " * 	*r-   c                 F    U R                  [        R                  USS0US9$ )z~
Get Information of static website trusteeship

:type bucket: string
:param bucket: None

:return:
    **HttpResponse Class**
r   r-   rP   rI   rr   s      r*   get_bucket_static_website#BosClient.get_bucket_static_website7  s2     !!,"2"2&#-s"3"( " * 	*r-   c                 F    U R                  [        R                  USS0US9$ )z
Delete Information of static website trusteeship to be closed

:type bucket: string
:param bucket: None

:return:
    **HttpResponse Class**
r   r-   rP   r   rr   s      r*   delete_bucket_static_website&BosClient.delete_bucket_static_websiteH  s2     !!,"5"5&#-s"3"( " * 	*r-   c           	          [         R                  " U5      nU R                  [        R                  U[
        R                  " SU0[        R                  S9[        R                  [        R                  0SS0US9$ )a  
Set server encryption for bucket

:type bucket: string
:param bucket: None

:type encryption_algorithm: string
:param grant_list: server encryption algorithm for bucekt.Now the value of encryption_algorithm
only is 'AES256'

:return:
    **HttpResponse Class**
encryptionAlgorithmr   
   encryptionr-   r   r   )r)   rN   encryption_algorithmrE   s       r*   put_bucket_encryptionBosClient.put_bucket_encryptionY  sx      &778LM!!,"2"2& $

,ABV+W3<3M3M!O$0$=$=?Q?V?V#W#0#"6"( " * 	*r-   c                 F    U R                  [        R                  USS0US9$ )zp
Get status of server encryption

:type bucket: string
:param bucket: None

:return:
    **HttpResponse Class**
r   r-   rP   rI   rr   s      r*   get_bucket_encryptionBosClient.get_bucket_encryptionq  s2     !!,"2"2&#0#"6"( " * 	*r-   c                 F    U R                  [        R                  USS0US9$ )zh
Close server encryption

:type bucket: string
:param bucket: None

:return:
    **HttpResponse Class**
r   r-   rP   r   rr   s      r*   delete_bucket_encryption"BosClient.delete_bucket_encryption  s2     !!,"5"5&#0#"6"( " * 	*r-   )rN   resourcec           	          U R                  [        R                  U[        R                  " SU0[
        R                  S9[        R                  [        R                  0SS0US9$ )z
Open image copyright protection and set resource

:type bucket: string
:param bucket: None

:type resource: list of  string
:param grant_list: resource range to be protected

:return:
    **HttpResponse Class**
r   r      copyrightProtectionr-   r   r   )r)   rN   r   rE   s       r*   put_bucket_copyright_protection)BosClient.put_bucket_copyright_protection  sd     !!,"2"2& $

J+A3<3M3M!O$0$=$=?Q?V?V#W#93"?"( " * 	*r-   c                 F    U R                  [        R                  USS0US9$ )z
Get configuration of image copyright protection

:type bucket: string
:param grant_list: None

:return:
    **HttpResponse Class**
r   r-   rP   rI   rr   s      r*   get_bucket_copyright_protection)BosClient.get_bucket_copyright_protection  s2     !!,"2"2&#93"?"( " * 	*r-   c                 F    U R                  [        R                  USS0US9$ )zq
Close image copyright protection

:type bucket: string
:param bucket: None

:return:
    **HttpResponse Class**
r   r-   rP   r   rr   s      r*   "delete_bucket_copyright_protection,BosClient.delete_bucket_copyright_protection  s2     !!,"5"5&#93"?"( " * 	*r-   )rN   replicationc           	         SS0nSU;   a  [         R                  " US   5      US'   U R                  [        R                  U[
        R                  " U[        R                  S9[        R                  [        R                  0UUS9$ )z
Open cross-region replication

:type bucket: string
:param bucket: None

:type replication: dict
:type replication: configuration for cross-region replication

:return:
    **HttpResponse Class**
   replicationr-   id   idr   r   r   convert_to_bytesrJ   r   r_   r]   r^   r@   r|   r   r\   r   r[   )r)   rN   r   rE   rQ   s        r*   put_bucket_replication BosClient.put_bucket_replication  s     $;"33K4EFF5M!!,"2"2& $

;3<3M3M!O$0$=$=?Q?V?V#W"("( " * 	*r-   c                     SS0nUb  [         R                  " U5      US'   U R                  [        R                  UUUS9$ )z
Get configuration of cross-region replication 

:type bucket: string
:param bucket: None

:type id: string
:param id: replication rule id

:return:
    **HttpResponse Class**
r   r-   r   rP   r   r   rJ   r   rK   r)   rN   r   rE   rQ   s        r*   get_bucket_replication BosClient.get_bucket_replication  sP     $>"33B7F5M!!,"2"2&"("( " * 	*r-   c                     SS0nUb  [         R                  " U5      US'   U R                  [        R                  UUUS9$ )z
Delete configuration of cross-region replication and close it 

:type bucket: string
:param bucket: None

:type id: string
:param id: replication rule id

:return:
    **HttpResponse Class**
r   r-   r   rP   r   r   rJ   r   r   r   s        r*   delete_bucket_replication#BosClient.delete_bucket_replication  sP     $>"33B7F5M!!,"5"5&"("( " * 	*r-   c                     SS0nUb  [         R                  " U5      US'   U R                  [        R                  UUUS9$ )z
Get status of cross-region replication,for exapmle 'historyReplicationPercent',
'latestReplicationTime'

:type bucket: string
:param bucket: None

:type id: string
:param id: replication rule id

:return:
    **HttpResponse Class**
s   replicationProgressr-   r   rP   r   r   s        r*   get_bucket_replication_progress)BosClient.get_bucket_replication_progress  sP     ',>"33B7F5M!!,"2"2&"("( " * 	*r-   c                 H    U R                  [        R                  USSS.US9$ )z
list configuration of cross-region replication rule

:type bucket: string
:param bucket: None

:return:
    **HttpResponse Class**
r-   )r   s   listrP   rI   rr   s      r*   list_bucket_replication!BosClient.list_bucket_replication*  s2     !!,"2"2&36"E"( " * 	*r-   )rN   	inventoryc           	          [         R                  " US   5      nU R                  [        R                  U[
        R                  " U[        R                  S9[        R                  [        R                  0SUS.US9$ )z
set bucket inventoru

:type bucket: string
:param bucket: None

:type inventory: dict
:param inventory: configuration for bucket inventory

:return:
    **HttpResponse Class**
r   r   r-   	   inventoryr   r   r   )r)   rN   r   rE   conf_ids        r*   put_bucket_inventoryBosClient.put_bucket_inventory:  ss     )))D/:!!,"2"2& $

93<3M3M!O$0$=$=?Q?V?V#W14W"E"( " * 	*r-   )rN   inventory_conf_idc                 p    U R                  [        R                  US[        R                  " U5      S.US9$ )zv
Get configuration of bucket inventory

:type bucket: string
:param bucket: None

:return:
    **HttpResponse Class**
r-   r   rP   )rJ   r   rK   r   r   r)   rN   r   rE   s       r*   get_bucket_inventoryBosClient.get_bucket_inventoryQ  s>     !!,"2"2&14V=T=TUf=g"h"( " * 	*r-   c                 p    U R                  [        R                  US[        R                  " U5      S.US9$ )zy
Delete configuration of bucket inventory

:type bucket: string
:param bucket: None

:return:
    **HttpResponse Class**
r-   r   rP   )rJ   r   r   r   r   r   s       r*   delete_bucket_inventory!BosClient.delete_bucket_inventorya  s>     !!,"5"5&14V=T=TUf=g"h"( " * 	*r-   c                 F    U R                  [        R                  USS0US9$ )zw
list configuration of bucket inventory

:type bucket: string
:param bucket: None

:return:
    **HttpResponse Class**
r   r-   rP   rI   rr   s      r*   list_bucket_inventoryBosClient.list_bucket_inventoryq  s2     !!,"2"2&#/"5"( " * 	*r-   c           	          Ub  [         R                  " U5      nU R                  [        R                  U[
        R                  " SU0[        R                  S9[        R                  [        R                  0SS0US9$ )z
Open bucket trash function

:type bucket: string
:param bucket: None

:type trash_dir: string
:param trash_dir: directory of trash,optional

:return:
    **HttpResponse Class**
trashDirr      trashr-   r   r   )r)   rN   	trash_dirrE   s       r*   put_bucket_trashBosClient.put_bucket_trash  sy      00;I!!,"2"2& $

J	+B3<3M3M!O$0$=$=?Q?V?V#W#+S/"( " * 	*r-   c                 F    U R                  [        R                  USS0US9$ )zo
Get status of bucket trash

:type bucket: string
:param grant_list: None

:return:
    **HttpResponse Class**
r   r-   rP   rI   rr   s      r*   get_bucket_trashBosClient.get_bucket_trash  s1     !!,"2"2&#+S/"( " * 	*r-   c                 F    U R                  [        R                  USS0US9$ )zc
Close bucket trash

:type bucket: string
:param bucket: None

:return:
    **HttpResponse Class**
r   r-   rP   r   rr   s      r*   delete_bucket_trashBosClient.delete_bucket_trash  s1     !!,"5"5&#+S/"( " * 	*r-   )rN   keyr   i  c           
      8   [         R                  " U5      nU=(       d    SR                  S5      n[        R                  " U5        [        R
                  " U5        [         R                  " U5      nUS:X  a  [        S5      eU R                  X5      n	U(       a  [        U5      O0 nU(       a  [        U5      O0 nUR                  [        R                  R                  5       S5        UR                  [        R                  S5        Ubq  [        U[        5      (       aV  UR                  5       nUS:X  a  [         R"                  U	l        O0US:X  a  [         R&                  U	l        O[        SU-  5      eXl        [(        R*                  " U	R,                  U	R$                  5      u  pnUnXR.                  :w  a  US	[         R                  " U5      -   -  nX[        R0                  '   U	R2                  S
L a!  [4        R6                  U[        R8                  '   U R;                  XU5      nU
[<        R>                  :w  a   U
[<        R@                  :w  a  [C        S/5      nU	RD                  b+  U	RD                  U[        RF                  R                  5       '   [H        RJ                  " U	RL                  U
UUUUUU5      U[        R                  R                  5       '   S[         R                  " URN                  5      UU[(        RP                  " US5      4-  $ )a  
Get an authorization url with expire time.
specified  protocol in endpoint > protocal > default protocol in config.

:type timestamp: int
:param timestamp: None

:type expiration_in_seconds: int
:param expiration_in_seconds: None

:type options: dict
:param options: None

:param is_official_domain: default use not official domain,example: bucket.bj.bcebos.com

:return:
    **URL string**
 /s   v1z!generate url the key param error!Nri   httpszInvalid protocol: %s   :Ts   hosts   %s://%s%s?%sF))r   r   stripr   validate_bucket_namevalidate_object_keyr   
ValueError_merge_configdictpopr   AUTHORIZATIONlowerrf   r   ProtocolHTTPprotocolHTTPSr   parse_host_portendpointdefault_portHOSTrequest_payerr   REQUEST_PAYER_REQUESTERBOS_REQUEST_PAYER	_get_pathr   rK   re   setsecurity_tokenSTS_SECURITY_TOKENr   signcredentialsnameget_canonical_querystring)r)   rN   r   	timestampexpiration_in_secondsrX   rQ   headers_to_signr  rE   
httpmethodpendpoint_protocolendpoint_hostendpoint_port	full_hostpaths                    r*   generate_pre_signed_url!BosClient.generate_pre_signed_url  s   < &&s+yb$((5'',%%c*%<@AA##F8#*$w-!'fR

<--335t<

<--t4 (C((NN$;&.mmFO'\&.nnFO$%;h%FGG"*!!&//6??C 	8- "	::: 7 7 FFFI%.!!"4'5;5S5SF<112~~f37)))jL<M<M.M!7)nO   ,>D>S>SF<2288:;5B5G5G!6|))//12 &"9"9:K:P:P"Q!*!%!&!@!@!O"Q Q 	Qr-   )rN   rulesc           	      t    U R                  [        R                  USS0[        R                  " SU05      US9$ )z
Put Bucket Lifecycle

:type bucket: string
:param bucket: None

:type rules: list
:param rules: None

:return:**Http Response**
	   lifecycler-   rulerQ   rY   rE   rJ   r   r_   r]   r^   )r)   rN   r$  rE   s       r*   put_bucket_lifecycleBosClient.put_bucket_lifecycle  sB      !!,"2"2"-*6)<'+zz65/'B)/	 " 1 	1r-   c                 F    U R                  [        R                  USS0US9$ )z[
Get Bucket Lifecycle

:type bucket: string
:param bucket: None

:return:**Http Response**
r&  r-   rP   rI   rr   s      r*   get_bucket_lifecycleBosClient.get_bucket_lifecycle*  s2     !!,"2"2"-*6)<)/ " 1 	1r-   c                 F    U R                  [        R                  USS0US9$ )z^
Delete Bucket Lifecycle

:type bucket: string
:param bucket: None

:return:**Http Response**
r&  r-   rP   r   rr   s      r*   delete_bucket_lifecycle!BosClient.delete_bucket_lifecycle9  s2     !!,"5"5"-*6)<)/ " 1 	1r-   )rN   cors_configurationc           	      t    U R                  [        R                  USS0[        R                  " SU05      US9$ )z
Put Bucket Cors
:type bucket: string
:param bucket: None

:type cors_configuration: list
:param cors_configuration: None

:return:**Http Response**
   corsr-   corsConfigurationr(  r)  )r)   rN   r2  rE   s       r*   put_bucket_corsBosClient.put_bucket_corsH  sD     !!,"2"2"-*13'+zz3FHZ2['\)/	 " 1 	1r-   c                 F    U R                  [        R                  USS0US9$ )zV
Get Bucket Cors

:type bucket: string
:param bucket: None

:return:**Http Response**
r4  r-   rP   rI   rr   s      r*   get_bucket_corsBosClient.get_bucket_cors]  s1     !!,"2"2"-*13)/ " 1 	1r-   c                 F    U R                  [        R                  USS0US9$ )zY
Delete Bucket Cors

:type bucket: string
:param bucket: None

:return:**Http Response**
r4  r-   rP   r   rr   s      r*   delete_bucket_corsBosClient.delete_bucket_corsl  s1     !!,"5"5"-*13)/ " 1 	1r-   c                 |    0 nUb  X'S'   Ub  X7S'   Ub  XGS'   Ub  XWS'   U R                  [        R                  XUS9$ )1  
Get Object Information of bucket

:type bucket: string
:param bucket: None

:type delimiter: string
:param delimiter: None

:type marker: string
:param marker: None

:type max_keys: int
:param max_keys: value <= 1000

:type prefix: string
:param prefix: None

:return:
    **_ListObjectsResponse Class**
   maxKeys   prefix   marker	   delimiterrP   rI   )r)   rN   max_keysprefixmarker	delimiterrE   rQ   s           r*   list_objectsBosClient.list_objects{  s`    2 !): &9 &9 #,< !!,"2"2KW]!^^r-   c              #      #    Sn U R                  XX#US9nUR                   H  nUv   M	     UR                  (       a  UR                  nOgMI  7f)O

:param bucket_name:
:param prefix:
:param delimiter:
:param config:
:return:
N)rF  rE  rG  rE   )rH  contentsis_truncatednext_marker)r)   rN   rE  rG  rE   rF  rS   items           r*   list_all_objectsBosClient.list_all_objects  s^      ((6W] ) _H ))
 *$$!-- s   AAc                     U c  g [        U [        [        45      (       d  [        S5      e[	        U 5      S:w  a  [        S5      e[        R                  S[        U 5      -  0$ )Nz!range should be a list or a tuple   zrange should have length of 2   bytes=%d-%d)rf   listtuple	TypeErrorlenr   r   RANGE)ranges    r*   _get_range_header_dict BosClient._get_range_header_dict  sX    =%$//?@@u:?<==""NU5\$ABBr-   c                    0 nU R                  5       n[        R                  (       a1  / nU H'  u  pVUR                  5       nUR	                  XV45        M)     Un[        R
                  " [        R                  5      nU HX  u  pVUR                  U5      (       d  M  U[        U5      S n[        R                  " U5      U[        R                  " U5      '   MZ     X!R                  l        Xl        g)a  Sets response.body to http_response and response.user_metadata to a dict consists of all http
headers starts with 'x-bce-meta-'.

:param http_response: the http_response object returned by HTTPConnection.getresponse()
:type http_response: httplib.HTTPResponse

:param response: general response object which will be returned to the caller
:type response: baidubce.BceResponse

:return: always true
:rtype bool
NT)
getheadersr   PY3r  appendr   r   BCE_USER_METADATA_PREFIXrx   rX  convert_to_unicodemetadatauser_metadatadata)http_responserS   rd  headers_list
temp_headsrz   r{   rE  s           r*   _parse_bos_objectBosClient._parse_bos_object  s     $//1::J$GGI!!1&) % &L))55
 !DA||F##c&klO--a0 f77:; !
 +8'%r-   c           
         0 nUb  [         R                  " U5      nSU0n[         R                  " U5      n[        U5      S:X  d  UR                  S5      (       a  [	        S5      e[
        R                  U5      n	Ub  U	c  0 n	XI[        R                  '   Ub%  U	c  0 n	U R                  [        R                  X5      n	U R                  [        R                  UUU	UU[
        R                  S9$ )z

:param bucket_name:
:param key:
:param range:
:param traffic_limit:
:param version_id:
:param cond_read_write:
:param config:
:return:
	   versionIdr      /(Key can not be empty or start with '/' .rX   rQ   rE   body_parser)r   r   rX  rx   r   r@   r[  r   BOS_TRAFFIC_LIMIT_get_cond_read_write_headersr   rK   rJ   ri  )
r)   rN   r   rZ  traffic_limit
version_idcond_read_writerE   query_paramsrange_headers
             r*   
get_objectBosClient.get_object  s     !00<J&
3L%%c*s8q=CNN400 !KLL 77>$#!;H778&#!<<\=M=M|mL!! !33 " 5 	5r-   c           
         [         R                  " U5      n0 nUb  X6[        R                  '   Ub  [	        U[
        5      (       a  UO0[	        U[        5      (       a  UR                  S5      O
[        U5      nUS;  a  [        SR                  U5      5      e[         R                  " U5      U[        R                  '   O[        S5      eU R                  [        R                  UUUSS0U[        R                   S9$ )z:

:param bucket_name:
:param key:
:param config:
:return:
zutf-8)Standard	ExpeditedLowCostz}invalid tier:{} for restore_object.The valid value is "Standard" or                                  "Expedited" or "LowCost"z(tier can not be None for restore_object.s   restorer-   ro  )r   r   r   BOS_RESTORE_DAYSrf   r   r   decoder   formatBOS_RESTORE_TIERr   rJ   r   POSTr@   ri  )r)   rN   r   daystierrE   rX   tier_strs           r*   restore_objectBosClient.restore_object  s     %%c*59L112)$44tR\]achRiRi$++g:NorswoxHCC  ";;A6$<J J5;5L5LT5RGL112 !KLL!!$!33 " 5 	5r-   c                 6   [        US5      n U(       a7  [        UR                  R                  5      n[        R
                  " XU5      nOU n[        R                  " XuU5        U R                  5         UR                  5         g! UR                  5         f = f)NwbT)	openintrc  content_lengthr   make_progress_adaptershutilcopyfileobjclose)rf  rS   	file_namebuf_sizeprogress_callbackf	file_sizestreams           r*   _save_body_to_fileBosClient._save_body_to_file,  sy    D!	  1 1 @ @A	44]W`a&v(3!GGI GGIs   A'B Bc                 &    UR                  X5        g)NT)init_from_http_responserf  rS   select_responses      r*   _parse_select_messageBosClient._parse_select_message=  s    //Hr-   c           	          [         R                  " U5      nU R                  XX4XVS9nUR                  R	                  5       nUR                  R                  5         U$ )zH

:param bucket_name:
:param key:
:param range:
:param config:
:return:
)rZ  rt  ru  rE   )r   r   rx  re  readr  )	r)   rN   r   rZ  rt  ru  rE   rS   ss	            r*   get_object_as_stringBosClient.get_object_as_stringB  sV     %%c*??;55D # UMM r-   )rN   r   r  c
                   ^ ^^^ 0 n
U	b  [         R                  " U	5      n	SU	0n
[         R                  " U5      n[        U5      S:X  d  UR                  S5      (       a  [	        S5      e[         R                  " T5      m[
        R                  U5      nUb  Uc  0 nX{[        R                  '   Ub%  Uc  0 nT R                  [        R                  X5      nT R                  [        R                  UUUU
TUUUU 4S jS9$ )a;  
Get Content of Object and Put Content to File

:type bucket: string
:param bucket: None

:type key: string
:param key: None

:type file_name: string
:param file_name: None

:type range: tuple
:param range: (0,9) represent get object contents of 0-9 in bytes. 10 bytes date in total.
:return:
    **HTTP Response**
rl  r   rm  rn  c           	      R   > [         R                  U UTTR                  TS5      TS9$ )Nrecv_buf_size)r  )r@   r  _get_config_parameter)rf  rS   rE   r  r  r)   s     r*   <lambda>.BosClient.get_object_to_file.<locals>.<lambda>  s2    	8T8T**6?C"3 9U 95r-   ro  )r   r   rX  rx   r   r@   r[  r   rq  rr  r   rK   rJ   )r)   rN   r   r  rZ  rE   r  rs  ru  rt  rv  rw  s   `  ` ``     r*   get_object_to_fileBosClient.get_object_to_fileS  s    ( !00<J&
3L%%c*s8q=CNN400 !KLL++I6	 77>$#!;H778&#!<<\=M=M|mL!! 5 " 6 	6r-   c           	          0 nUb  [         R                  " U5      nSU0n0 nUb   U R                  [        R                  Xt5      n[         R                  " U5      nU R                  [        R                  XXvUS9$ )z
Get head of object

:type bucket: string
:param bucket: None

:type key: string
:param key: None
:return:
    **_GetObjectMetaDataResponse Class**
rl  r   )r   r   rr  r   re   rJ   )r)   rN   r   rt  ru  rE   rv  rX   s           r*   get_object_meta_dataBosClient.get_object_meta_data  s     !00<J&
3L&778I8I7dG%%c*!!,"3"3[*1v " W 	Wr-   )rN   r   re  r  c                 "   [         R                  " U5      nUcF  U	cC  U
c@  Uc=  Uc:  Sn[        U5       H)  n [        R                  " X4U R                  US5      S9n
  O   U(       a  [         R                  " U5      nU	(       a  [         R                  " U	5      n	U
(       a  [         R                  " U
5      n
U(       a  [         R                  " U5      nUb  [         R                  " U5      nU(       a  [         R                  " U5      nU R                  UUUU	U
UUUUUUUUS9nU[        R                  :  a  [        S	[        R                  -  5      eS
S0nUb  UUS'   U(       a  [        R                  " UU5      nU R!                  ["        R$                  UUUUUUS9$ ! [         ab  nUUS-
  :  a+  [        R                  SUS-   U[        U5      5         SnAGM  [        R                  SU[        U5      5        Sn
 SnAGM  SnAff = f)z
Put an appendable object to BOS or add content to an appendable object

:type bucket: string
:param bucket: None

:type key: string
:param key: None

:type content_length: long
:type offset: long
:return:
    **HTTP Response**
N   r  lengthr     6CRC32 calculation failed, retrying (attempt %d/%d): %s.CRC32 calculation failed after %d attempts: %s)r  content_md5content_typecontent_sha256content_crc32content_crc32ccontent_crc32c_flagcontent_crc64ecmard  r   user_headersrs  object_taggingDObject length should be less than %d. Use multi-part upload instead.s   appendr-   s   offsetr   )r   r   rZ  r   get_crc32_from_fpr  	Exception_loggerwarningr   error_prepare_object_headersr   MAX_APPEND_OBJECT_LENGTHr   r  rJ   r   r  )r)   rN   r   re  r  r  offsetr  rd  r  r  r  r  r  r   r  r  rs  r  rE   max_retriesretry_countrm   rX   rQ   s                            r*   append_objectBosClient.append_object  s    F %%c*>#9m>S#1#9>O>WK$[1-$)$;$;D9=9S9STZ\k9l%nM	  2  11+>K#44^DN"33MBM#44^DN*"("9"9:M"N & 7 78I J..)#%)') 3/''%') / + C888 >@C@\@\] ^ ^ S! &F9..t5FGD!! "  	_ ! -"[1_4(`&1Ao{CFL &VXcehijekl(,-s   %F""
H,-H	 "H		H)rN   r   re  c                    [         R                  " U5      n[        U[        5      (       a  UR	                  [
        R                  5      nSn [        R                  " U5      nU	c%  [        R                  " UU R                  US5      S9n	U R                  UUUU[        U5      UUUUU	U
UUUUUUUS9Ub  UR                  5         $ $ ! Ub  UR                  5         f f = f)zv
Create an appendable object and put content of string to the object
or add content of string to an appendable object
Nr  r  )rN   r   re  r  r  r  r  rd  r  r  r  r  r  r   r  r  rs  rE   )r   r   rf   r   encodebaidubceDEFAULT_ENCODINGioBytesIOr   r  r  r  rX  r  )r)   rN   r   re  r  r  r  rd  r  r  r  r  r  r   r  r  rs  rE   fps                      r*   append_object_from_string#BosClient.append_object_from_string  s    , %%c*dC  ;;x889D	D!B$ % 7 7!;!;FO!T!V %%+*-+-2=58Y-33?4A5C4A5C:M8I4A3?8I4A-3# & 5& ~
 r~
 s   A&C	 	Cc                 V   [         R                  " U5      nUcF  UcC  Uc@  U	c=  Uc:  Sn[        U5       H)  n [        R                  " X4U R                  US5      S9n  O   U(       a  [         R                  " U5      nU(       a  [         R                  " U5      nU(       a  [         R                  " U5      nU	(       a  [         R                  " U	5      n	U
b  [         R                  " U
5      n
U(       a  [         R                  " U5      nU R                  UUUUUU	U
UUUUUUUUUS9nUb!  U R                  [        R                  UU5      nU[        R                   :  a  [#        S	[        R                   -  5      eU(       a  [        R$                  " UU5      nU R'                  [        R                  UUUUUS
9$ ! [         ab  nUUS-
  :  a+  [        R                  SUS-   U[        U5      5         SnAGM  [        R                  SU[        U5      5        Sn SnAGM  SnAff = f)a  
Put object and put content of file to the object

:type bucket: string
:param bucket: None

:type key: string
:param key: None

:type fp: FILE
:param fp: None

:type file_size: long
:type offset: long
:type content_length: long
:return:
    **HTTP Response**
Nr  r  r  r  r  r  )r  r  r  r  r  r  r  r  rd  r   r  
encryptioncustomer_keycustomer_key_md5rs  r  r  )rY   rX   rE   )r   r   rZ  r   r  r  r  r  r  r   r  r  rr  r   r_   r   MAX_PUT_OBJECT_LENGTHr   r  rJ   )r)   rN   r   re  r  r  r  r  r  r  r  r  rd  r   r  r  r  r  r  rs  r  ru  rE   r  r  rm   rX   s                              r*   
put_objectBosClient.put_object>  s-   T %%c*>#9m>S#1#9>O>WK$[1-$)$;$;D9=9S9STZ\k9l%nM	  2  11+>K#44^DN"33MBM#44^DN*"("9"9:M"N & 7 78I J..)#%)') 3/''%!%-')! / ,$ &778H8H'SbcGC555 >@C@Y@YZ [ [ ..t5FGD!! "  	c ! -"[1_4(`&1Ao{CFL &VXcehijekl(,-s   %F<<
H(-H#:"H##H()bucketr   re  c                    [         R                  " U5      n[        U[        5      (       a  UR	                  [
        R                  5      nSn [        R                  " U5      nUc%  [        R                  " UU R                  US5      S9nU R                  XU[        U5      UUUUUU	U
UUUUUUUUUUUS9Ub  UR                  5         $ $ ! Ub  UR                  5         f f = f)a  
Create object and put content of string to the object

:type bucket: string
:param bucket: None

:type key: string
:param key: None

:type input_content: string
:param input_content: None

:type options: dict
:param options: None
:return:
    **HTTP Response**
Nr  r  r  r  r  r  r  r  r  r  rd  r   r  r  r  r  r  rs  r  ru  rE   )r   r   rf   r   r  r  r  r  r  r   r  r  r  rX  r  )r)   r  r   re  r  r  r  r  r  r  r  rd  r   r  r  r  r  r  rs  r  ru  rE   r  s                          r*   put_object_from_string BosClient.put_object_from_string  s    J %%c*dC  ;;x889D	D!B$ % 7 7!;!;FO!T!V??625d)/:0<2@1>2@7J5F1>1>0<.80<4D7H1>2@3B*0' # 2* ~
 r~
 s   A)C C")r  r   r  c                    [         R                  " U5      n[        US5      n UcA  UR                  S[        R
                  5        UR                  5       nUR                  S5        Uc(  U R                  US5      n[        R                  " UUUS9nUc  [        R                  " U5      nU R                  XUUUUUUU	U
UUUUUUUUUUUUS9UR                  5         $ ! UR                  5         f = f)z
Put object and put content of file to the object

:type bucket: string
:param bucket: None

:type key: string
:param key: None

:type file_name: string
:param file_name: None

:type options: dict
:param options: None
:return:
    **HttpResponse Class**
rbr   r  r  r  )r   r   r  seekosSEEK_ENDtellr  r   r  guess_content_type_by_file_namer  r  )r)   r  r   r  r  r  r  r  r  r  r  r  rd  r   r  r  r  r  r  rs  r  ru  rE   r  r  s                            r*   put_object_from_fileBosClient.put_object_from_file  s    P %%c*)T" 	%2;;'!#
$ $ : :6? S % 7 7>=J!L#$DDYO??62@/:0<2@1>2@7J5F1>1>0<.80<4D5F1>2@3B*0' # 2* HHJBHHJs   B*C C1)source_bucket_name
source_keytarget_bucket_name
target_keyc           	         [         R                  " U5      n[         R                  " U5      n[        R                  " U5        U R	                  UUUU	UUS9n[
        R                  " S[         R                  " U5      U4-  S5      nUb  US[         R                  " U5      -  -   nUU[        R                  '   Ub  X_[        R                  '   Uc  Ub  SU[        R                  '   OSU[        R                  '   U
b   [        R                  XS5      nU R                  [        R                   UUUU[        R"                  S	9$ ! [         a  nUeSnAff = f)
a  
Copy one object to another object

:type source_bucket: string
:param source_bucket: None

:type source_key: string
:param source_key: None

:type target_bucket: string
:param target_bucket: None

:type target_key: string
:param target_key: None
:return:
    **HttpResponse Class**
)r  rd  r   r  rs  r     /%s/%sFNs   ?versionId=%ss   replaces   copyT)rX   rE   rp  )r   r   r   r   r  r   normalize_stringr   BCE_COPY_SOURCEBCE_COPY_SOURCE_IF_MATCHBCE_COPY_METADATA_DIRECTIVEr@   _get_user_headerr  rJ   r   r_   parse_copy_object_response)r)   r  r  r  r  etagr  rd  r   r  copy_object_user_headersrs  r  source_version_idrE   rX   merge_source_keyrm   s                     r*   copy_objectBosClient.copy_object=  sr   D ,,Z8
,,Z8
''
3..%''%') / + !11''(:; "$ (/2BVE\E\]nEo2oo0@,,-=AL99:$(@@JGL<<=@GGL<<=#/#44WX\] !!#>> " @ 	@  s   ?E 
EEEc                     0 nUb  [         R                  " U5      nSU0n[         R                  " U5      nU R                  [        R                  XXTS9$ )z
Delete Object

:type bucket: string
:param bucket: None

:type key: string
:param key: None
:return:
    **HttpResponse Class**
rl  rP   r   )r)   rN   r   rt  rE   rv  s         r*   delete_objectBosClient.delete_object  s^     !00<J&
3L%%c*!!,"5"5{ " 0 	0r-   )rN   key_listc                     U Vs/ s H  nS[         R                  " U5      0PM     nnU R                  [        R                  U[
        R                  " SU05      SS0US9$ s  snf )z
Delete Multiple Objects

:type bucket: string
:param bucket: None

:type key_list: string list
:param key_list: None
:return:
    **HttpResponse Class**
r   objectss   deleter-   rY   rQ   rE   )r   r   rJ   r   r  r]   r^   )r)   rN   r   rE   rz   key_list_jsons         r*   delete_multiple_objects!BosClient.delete_multiple_objects  so     HPPx!%!9!9!!<=xP!!,"3"3"-'+zz9m2L'M*3S)9)/	 " 1 	1 Qs   "A")source_buckettarget_buckettarget_prefixc                     S[         R                  " U5      0nUb  [         R                  " U5      US'   U R                  [        R                  USS0[
        R                  " U5      US9$ )z
Put Bucket Logging

:type source_bucket: string
:param source_bucket: None

:type target_bucket: string
:param target_bucket: None
:return:
    **HttpResponse Class**
targetBuckettargetPrefix   loggingr-   r(  )r   r   rJ   r   r_   r]   r^   )r)   r  r  r	  rE   rY   s         r*   put_bucket_loggingBosClient.put_bucket_logging  sn    &  8 8 GH$#)#;#;M#JD !!,"2"2"/*4c):'+zz$'7)/	 " 1 	1r-   c                 F    U R                  [        R                  USS0US9$ )zl
Get Bucket Logging

:type bucket_name: string
:param bucket_name: None
:return:
    **HttpResponse Class**
r  r-   rP   rI   rr   s      r*   get_bucket_loggingBosClient.get_bucket_logging  s2     !!,"2"2"-*4c):)/ " 1 	1r-   c                 F    U R                  [        R                  USS0US9$ )zo
Delete Bucket Logging

:type bucket_name: string
:param bucket_name: None
:return:
    **HttpResponse Class**
r  r-   rP   r   rr   s      r*   delete_bucket_loggingBosClient.delete_bucket_logging  s2     !!,"5"5"-*4c):)/ " 1 	1r-   c           	         [         R                  " U5      n0 nUb  XG[        R                  '   Ub(  [        R
                  " U5      U[        R                  '   O![        R                  U[        R                  '   Ub   [        R                  XuS5      nU R                  [        R                  UUUSS0US9$ ! [         a  nUeSnAff = f)z
Initialize multi_upload_file.

:type bucket: string
:param bucket: None

:type key: string
:param key: None
:return:
    **HttpResponse**
NF   uploadsr-   r   )r   r   r   BOS_STORAGE_CLASSr   convert_to_standard_stringr\   r   OCTET_STREAMr@   r  r  rJ   r   r  )	r)   rN   r   r  r   r  rE   rX   rm   s	            r*   initiate_multipart_upload#BosClient.initiate_multipart_upload  s    & %%c*$6CL223#161Q1QR^1_GL--.1C1P1PGL--.##44WER !!$ "  	  s   >B8 8
C	CC	)rN   r   	upload_idpart_number	part_sizepart_fpc                    [         R                  " U5      nU[        R                  :  d  U[        R                  :  a-  [        SU[        R                  [        R                  4-  5      eU[        R                  :  a  [        S[        R                  -  5      eUcF  UcC  U	c@  U
c=  Uc:  Sn[        U5       H)  n [        R                  " XeU R                  US5      S9n  O   U(       a  [         R                  " U5      nU	(       a  [         R                  " U	5      n	U(       a  [         R                  " U5      nU
(       a  [         R                  " U
5      n
U(       a  [         R                  " U5      nU(       a  [         R                  " U5      nU R!                  UUU	UU
UUUS
9nU(       a  [        R"                  " XmU5      nU R%                  [&        R(                  UUUUXCS.US9$ ! [         ab  nUUS-
  :  a+  [        R                  SUS-   U[        U5      5         SnAGMr  [        R                  S	U[        U5      5        Sn SnAGM  SnAff = f)a  
Upload a part.

:type bucket: string
:param bucket: None

:type key: string
:param key: None

:type upload_id: string
:param upload_id: None

:type part_number: int
:param part_number: None

:type part_size: int or long
:param part_size: None

:type part_fp: file pointer
:param part_fp: not None

:type part_md5: str
:param part_md5: None

:type config: dict
:param config: None

:return:
       **HttpResponse**
z9Invalid part_number %d. The valid range is from %d to %d.z+Single part length should be less than %d. Nr  r  r  r  r  r  )r  r  r  r  r  r  r  rs  s
   partNumber   uploadIdr   )r   r   r   MIN_PART_NUMBERMAX_PART_NUMBERr   r  rZ  r   r  r  r  r  r  r   r  r  r  rJ   r   r_   )r)   rN   r   r  r  r  r   part_md5
part_crc32part_sha256part_crc32cpart_crc32c_flagpart_crc64ecmar  rs  rE   r  r  rm   rX   s                       r*   upload_partBosClient.upload_part  s=   N %%c*,,,c>Q>Q0QXS00#2E2E\G G H H s000J"889 : : 
 2{7J + 38NK$[1*!&!8!8BFB\B\]cetBu"wJ	  2 ..x8H 11+>K00<J 11+>K%667GH#44^DN..$ &$& 0,' / 	 11'iXG!!#.G "  	G ! *"[1_4(`&1Ao{CFL &VXcehijekl%)
*s   <%G,,
I6-I*"II)r  r  r  r  r  r  r  r  c           	         [         R                  " U5      n[         R                  " U5      n[        R                  " U5        U R	                  U
UUS9n[
        R                  " S[         R                  " U5      U4-  S5      U[        R                  '   SXU-   S-
  4-  nX[        R                  '   U	b  X[        R                  '   U R                  [        R                  UUUXeS.US9$ )aC  
Copy part.

:type source_bucket_name: string
:param source_bucket_name: None

:type source_key: string
:param source_key: None

:type target_bucket_name: string
:param target_bucket_name: None

:type target_key: string
:param target_key: None

:type upload_id: string
:param upload_id: None

:return:
    **HttpResponse**
)r  rd  rs  r  FrT  r  r"  r   )r   r   r   r   r  r   r  r   r  BCE_COPY_SOURCE_RANGEr  rJ   r   r_   )r)   r  r  r  r  r  r  r  r  r  r  rd  rs  rE   rX   rZ  s                   r*   upload_part_copyBosClient.upload_part_copyy  s    L ,,Z8
,,Z8
''
3..&2'4'4 / 6 160F0F"f&=&=>P&Q#&% %&+1-,,- #fy.@1.D%EE6;223=AL99:!!#.G "  	r-   )rN   r   r  r  r  r  r  c                     [         R                  " U5      n[        US5      n UR                  U5        U R	                  XX4UUXXXXUS9UR                  5         $ ! UR                  5         f = f)z

:param bucket_name:
:param key:
:param upload_id:
:param part_number:
:param part_size:
:param file_name:
:param offset:
:param part_md5:
:param config:
:return:
r  )	r&  r'  r(  r)  r*  r+  r  rs  rE   )r   r   r  r  r,  r  )r)   rN   r   r  r  r  r  r  r&  r'  r(  r)  r*  r+  r  rs  rE   r  s                     r*   upload_part_from_fileBosClient.upload_part_from_file  sp    2 %%c*D!		FF6N##KiiYZ-50;5E6G+1 $ 3 GGIAGGIs   'A A.)rN   r   r  	part_listc           
      0   [         R                  " U5      nU R                  [        R                  UUUUU	U
S9nUb   U R                  [        R                  X5      nU R                  [        R                  UU[        R                  " SU05      USU0US9$ )a  
After finish all the task, complete multi_upload_file.

:type bucket: string
:param bucket: None

:type key: string
:param key: None

:type upload_id: string
:param upload_id: None

:type part_list: list
:param part_list: None

:return:
    **HttpResponse**
)r  rd  r  r  r  r  r  partsr#  r   )r   r   r  r   r[   rr  r   r  rJ   r]   r^   )r)   rN   r   r  r5  r  rd  r  r  r  r  ru  rE   rX   s                 r*   complete_multipart_upload#BosClient.complete_multipart_upload  s    @ %%c*..+00'%') 3/ / 1 &778I8I7dG!!Wi01+ "  	r-   )rN   r   r  c                 r    [         R                  " U5      nU R                  [        R                  XSU0US9$ )z
Abort upload a part which is being uploading.

:type bucket: string
:param bucket: None

:type key: string
:param key: None

:type upload_id: string
:param upload_id: None
:return:
    **HttpResponse**
r#  rP   r   )r)   rN   r   r  rE   s        r*   abort_multipart_upload BosClient.abort_multipart_upload  sA      %%c*!!,"5"5{*5y)A)/ " 1 	1r-   c                     [         R                  " U5      nSU0nUb  XGS'   Ub  XWS'   U R                  [        R                  XXvS9$ )aJ  
List all the parts that have been upload success.

:type bucket: string
:param bucket: None

:type key: string
:param key: None

:type upload_id: string
:param upload_id: None

:type max_parts: int
:param max_parts: None

:type part_number_marker: string
:param part_number_marker: None
:return:
    **_ListPartsResponse Class**
r#  s   maxPartss   partNumberMarkerrP   r   )r)   rN   r   r  	max_partspart_number_markerrE   rQ   s           r*   
list_partsBosClient.list_parts'  sY    0 %%c*y) "+;)*<&'!!,"2"2KV!ccr-   c              #      #    [         R                  " U5      nSn U R                  XUXTS9nUR                   H  nUv   M	     UR                  (       d  gUR
                  nMH  7f)zL

:param bucket_name:
:param key:
:param upload_id:
:param config:
:return:
N)r?  rE   )r   r   r@  r7  rM  next_part_number_marker)r)   rN   r   r  rE   r?  rS   rO  s           r*   list_all_partsBosClient.list_all_partsH  sk      %%c*!{9K ' \H 
 '((!)!A!A s   A"A$c                     SS0nUb  XWS'   Ub  X'S'   Ub  X7S'   Ub  XGS'   U R                  [        R                  XUS9$ )a  
List all Multipart upload task which haven't been ended.(Completed Init_MultiPartUpload
but not completed Complete_MultiPartUpload or Abort_MultiPartUpload)

:type bucket: string
:param bucket: None

:type delimiter: string
:param delimiter: None

:type max_uploads: int
:param max_uploads: <=1000

:type key_marker: string
:param key_marker: None

:type prefix: string
:param prefix: None

:type upload_id_marker: string
:param upload_id_marker:
:return:
    **_ListMultipartUploadResponse Class**
r  r-   rC  s
   maxUploadss	   keyMarkerrA  rP   rI   )r)   rN   max_uploads
key_markerrE  rG  rE   rQ   s           r*   list_multipart_uploads BosClient.list_multipart_uploads]  se    8 c" #,< "$/=!!#-<  &9!!,"2"2KW]!^^r-   c              #   (  #    Sn U R                  UUUUUS9nUR                   H  nUv   M	     UR                  (       d  gUR                  b  UR                  nO4[	        UR                  5      S:w  a  UR                  S   R
                  nOgM  7f)rK  N)rH  rE  rG  rE   r   )rI  uploadsrM  next_key_markerrX  r   )r)   rN   rE  rG  rE   rH  rS   rO  s           r*   list_all_multipart_uploads$BosClient.list_all_multipart_uploads  s      
22;>H:@=F:@	 3 BH
 !((
 )((''3%55
X%%&!+%--b155
 s   BBc                    U	R                  5       (       a%  [        R                  SR                  U5      5        g  U R	                  XUXEXgU
XUXS9nUR                  UUR                  R                  S.5        [        R                  SR                  U5      5        g ! [         a+  n[        R                  SR                  U5      5        UeS nAff = f)Nz(upload task canceled with partNumber={}!)r'  r)  r*  r+  r  rs  )
partNumbereTagz'upload task success with partNumber={}!z&upload task failed with partNumber={}!)	r6   r  debugr  r3  r`  rc  r  r  )r)   rN   
object_keyr  r  r  r  r  r5  uploadTaskHandler'  r)  r*  r+  r  rs  rS   rm   s                     r*   _upload_taskBosClient._upload_task  s     %%''MMDKKKXY	11+9	j'[i"3 2 RH ) ))..  MMCJJ;WX 	MMBII+VWG	s   A"B 
C)&CCc                     [         R                  R                  U5      nUS:  a  [        S5      eUc#  Sn[        R
                  " US-  5      nUU:  a  UnUS:  d  US::  a  [        S5      eUb  US	::  a  [        R                  " 5       nUS
-  S
-  nUU-  nUU-  S:w  a  US	-  nUc
  [        5       nU R                  XUUU	S9R                  n[        U5      n/ nSnS	n/ n/ n[        US5       nUS:  a  UnUU:  a  Un[        R                  " UUU5      nUR                  UU45        UR!                  U R"                  XUUUUUUUUSSSX5      n UR                  U 5        UU-  nUU-  nUS	-  nUS:  a  M  SSS5        [%        U[&        S9  UR)                  5       (       a&  [*        R-                  S5        U R/                  XUS9  g[1        U5      U:w  a&  [*        R-                  S5        U R/                  XUS9  gUR3                  S S9  U(       aN  US   S   n![5        S	[1        U5      5       H#  n"UU"   u  n#n$[        R6                  " U!U#U$5      n!M%     U!S-  n!U
c  U!n
U R9                  XUUU
XUUS9	  g! , (       d  f       GN= f)a  
Multipart Upload file to bos

param chunk_size: part size in MB, default will be auto-calculated based on file size.
                  Minimum is 5MB, maximum is 5120MB (5GB). Maximum 10000 parts allowed.
                  Maximum file size supported is 48.8TB.
l       PC z'File size must not be more than 48.8TB!N   l      b	 i   r   zGchunk size is invalid, it should be more than 0 and not more than 5120!r  i   )r  r   r  r  )return_whenz!putting super object is canceled!)r  Fzputting super object failed!c                     U S   $ )NrR  r>   )xs    r*   r  6BosClient.put_super_object_from_file.<locals>.<lambda>	  s    Q|_r-   )r   l    )r  r  r  r  ru  T)r  r!  getsizer   mathceilmultiprocessing	cpu_countr    r  r  r   r  r   r  r`  submitrW  r	   r
   r6   r  rT  r;  rX  sortrZ  crc32_combiner8  )%r)   rN   r   r  
chunk_size
thread_numrV  r  r   r  r  r  r  r  r  rs  ru  rE   	left_sizemin_chunk_size_mbr  
total_partr  executor	all_tasksr  r  r5  part_crc_listr  current_part_sizepart_crc	temp_taskfinal_crc32icrcr  s%                                        r*   put_super_object_from_file$BosClient.put_super_object_from_file  s   , GGOOI.	11 IJJ J $		)7J*K L :-.
  J!O ijjq'113:%,	)+
y A%!OJ#/122;)+) 3 + ,59 	
 &j1		)T"ba-$-!y((1% 222v?PQ$$h0A%BC$OOD,=,={QZ\g,=y&R[]m,4dD$HYj	   +..	++q  a- #" 	YM2%%''MM=>''I'N^z)MM89''I'N45 '*1-K1c-01+A.V#11+sFK 2 :%K$ +&&{I]j6D9J\k 	' 	m U #"s   1B
I>>
J)rN   r   ry   c           
          [         R                  " U5      nU R                  [        R                  UU[
        R                  " SU0[        R                  S9[        R                  [        R                  0SS0US9$ )z
Set Access Control Level of object

:type bucket: string
:param bucket: None

:type acl: list of grant
:param acl: None
:return:
    **HttpResponse Class**
r   r   rq   r-   r   r   )r)   rN   r   ry   rE   s        r*   set_object_aclBosClient.set_object_acl	  sw     %%c*!!,"2"2& $

,?+E3<3M3M!O$0$=$=?Q?V?V#W#)3-"( " * 	*r-   c           	         [         R                  " U5      nSnSnUb+  [        R                  [         R                  " U5      0nUS-  nUb+  [        R                  [         R                  " U5      0nUS-  nUb+  [        R
                  [         R                  " U5      0nUS-  nUS:X  a  [        S5      eUS:  a  [        S5      eU R                  [        R                  UUUSS0US	9$ )
aW  

:type bucket_name: string
:param bucket_name: None

:type key: string
:param key: None

:type canned_acl: string
:param canned_acl: for header 'x-bce-acl', it's value only is
canned_acl.PRIVATE or canned_acl.PRIVATE_READ

:type grant_read: string
:param grant_read: Object id of getting READ right permission.
for exapmle,grant_read = 'id="6c47...4c94",id="8c42...4c94"'

:type grant_full_control: string
:param grant_full_control: Object id of getting READ right permission.
for exapmle,grant_full_control = 'id="6c47...4c94",id="8c42...4c94"'

:param config:
:return:
    **HttpResponse Class**
Nr   r  z,donn't give any object canned acl arguments!rS  z5cann't get more than one object canned acl arguments!rq   r-   r   )
r   r   r   r   BOS_GRANT_READBOS_GRANT_FULL_CONTROLr   rJ   r   r_   )	r)   rN   r   r   
grant_readgrant_full_controlrE   rX   num_argss	            r*   set_object_canned_aclBosClient.set_object_canned_acl4	  s    < %%c*!$,,f.E.Ej.QRGMH!#22F4K4KJ4WXGMH)#::F<S<STf<ghGMHq=KLL]TUU!!,"2"2&#*#)3-"( " * 	*r-   c                 t    [         R                  " U5      nU R                  [        R                  UUSS0US9$ )z
Get Access Control Level of object

:type bucket: string
:param bucket: None

:type key: string
:param key: None

:return:
    **HttpResponse Class**
rq   r-   rP   r   r)   rN   r   rE   s       r*   get_object_aclBosClient.get_object_aclk	  sE     %%c*!!  } "  	r-   c                 t    [         R                  " U5      nU R                  [        R                  UUSS0US9$ )z
Get Access Control Level of  object

:type bucket: string
:param bucket: None

:type key: string
:param key: None

:return:
    **HttpResponse Class**
rq   r-   rP   r   r  s       r*   delete_object_aclBosClient.delete_object_acl	  sE     %%c*!!##} "  	r-   )rN   r   urlc           	         [         R                  " U5      n0 n[         R                  " U5      U[        R                  '   Ub  XG[        R                  '   Ub  XW[        R
                  '   U R                  [        R                  UUUSS0US9$ )ap  
fetch object with given url and save to Baidu object storage

:type bucket: string
:param bucket: None

:type key: string
:param key: object name to be saved

:type url:string
:param url: url of resource to be fetched

:type fetch_mode:string
:param fetch_mode: fetch mode for get resource, valid value only is
'sync' and 'async'

:return:
    **HttpResponse Class**
s   fetchr-   r   )	r   r   r   BOS_FETCH_SOURCEBOS_FETCH_MODEr  rJ   r   r  )r)   rN   r   r  
fetch_moder   rE   rX   s           r*   fetch_objectBosClient.fetch_object	  s    0 %%c*171H1H1M--.!3=L//0$6CL223!!!! # "  	r-   )rN   r  symlinkforbid_overwritec
           	         [         R                  " U5      n[         R                  " U5      nUc  [        R                  " U5      nU R	                  UUUS9n
X*[
        R                  '   Ub.  U(       a  SU
[
        R                  '   OSU
[
        R                  '   Ub'  [         R                  " U5      U
[
        R                  '   U R                  [        R                  UUU
SS0U	S9$ )z
put object symlink

:type bucket: string
:param bucket: None

:type key: string
:type key: object name

:type symlink: string
:type symlink_key: symlink name

:return:
    **HttpResponse Class**
)rd  r  r   s   trues   false   symlinkr-   r   )r   r   r   r  r  r   BOS_SYMLINK_TARGETBOS_FORBID_OVERWRITEBOS_SYMLINK_BUCKETrJ   r   r_   )r)   rN   r  r  r  rd  r   r  r  rE   rX   s              r*   put_object_symlinkBosClient.put_object_symlink	  s    $ ,,Z8
))'2$DDWM..])+ / - 4>//0'=D99:=E99:$7=7N7N}7]GL334!!,"2"2&"#*#-s"3"( " * 	*r-   )rN   r  c                 t    [         R                  " U5      nU R                  [        R                  UUSS0US9$ )z
Get symlink info

:type bucket: string
:param bucket: None

:type symlink: string
:param symlink: symlink

:return:
    **HttpResponse Class**
r  r-   rP   r   )r)   rN   r  rE   r   s        r*   get_object_symlinkBosClient.get_object_symlink	  sF     %%g.!!  "C( "  	r-   )rN   r   select_object_argsc                 F  ^ [         R                  " U5      nU=(       d    0 nSU;   a  SUS   ;   a  SnOSU;   a  SUS   ;   a  SnOSn[        5       mU R                  [        R
                  UU[        R                  " SU0[        R                  S9US	US
.UU4S jS9  T$ )z

:type bucket_name: string
:param bucket_name: bucket name

:type key: string
:param key: object name

:type select_object_args: dict
:param select_object_args: requesta parameters for select object api

:param config:
:return:
inputSerializationr]   s   jsoncsvs   csvs   parquetselectRequestr   r-   )s   selects   typec                 0   > [         R                  XT5      $ rC   )r@   r  r  s     r*   r  )BosClient.select_object.<locals>.<lambda>
  s    	8W8W9:r-   )rY   rX   rQ   rE   rp  )
r   r   SelectResponserJ   r   r  r]   r^   r@   r|   )r)   rN   r   r  rX   rE   select_typer  s          @r*   select_objectBosClient.select_object	  s      %%c*-R#55&DVWkDl:l!K!%77EEWXlEm<m K$K(*_.@A9KeKef"[9: 	 
	 r-   c                 D    U R                  [        R                  SS0US9$ )z)
get user quota

:param config:
:return:
	   userQuotar-   rP   rI   rD   s     r*   get_user_quotaBosClient.get_user_quota#
  s0     !!lC%8 " J 	Jr-   )max_bucket_countmax_capacity_mega_bytesc                 t    U R                  [        R                  [        R                  " UUS.5      SS0US9$ )z
put user quota

:type max_bucket_count: int
:param max_bucket_count: max bucket count

:type max_capacity_mega_bytes: long
:param max_capacity_mega_bytes: max capacity mega bytes

:param config:
:return:
)maxBucketCountmaxCapacityMegaBytesr  r-   r  r)  )r)   r  r  rE   s       r*   put_user_quotaBosClient.put_user_quota-
  sH     !!/?4KM N #&v	 " 7 	7r-   c                 D    U R                  [        R                  SS0US9$ )z,
delete user quota

:param config:
:return:
r  r-   rP   r   rD   s     r*   delete_user_quotaBosClient.delete_user_quotaA
  s0     !!s(;F " L 	Lr-   c                 F    U R                  [        R                  USS0US9$ )zf
get notification

:type bucket_name: string
:param bucket_name: bucket name

:param config:
:return:
   notificationr-   rN   rQ   rE   rI   rr   s      r*   get_notificationBosClient.get_notificationL
  s1     !!+#S)& " ; 	;r-   )rN   notificationsc                 t    U R                  [        R                  U[        R                  " SU05      SS0US9$ )z
put user quota

:type bucket_name: string
:param bucket_name: bucket

:type notifications: list of dict
:param notifications: notifacation param

:param config:
:return:
r  r  r-   rN   rY   rQ   rE   r)  )r)   rN   r  rE   s       r*   put_notificationBosClient.put_notification\
  sB     !!+_m<=#S)& " ; 	;r-   c                 F    U R                  [        R                  USS0US9$ )zi
delete notification

:type bucket_name: string
:param bucket_name: bucket name

:param config:
:return:
r  r-   r  r   rr   s      r*   delete_notificationBosClient.delete_notificationo
  s2     !![/SVAW "  	r-   )rN   mirror_argsc           	          U R                  [        R                  U[        R                  " SU0[
        R                  S9SS0US9$ )z{
put bucket mirroring

:type bucket_name: string
:param bucket_name: bucket name

:param mirror_args: mirror conf
:return:
bucketMirroringConfigurationr   	   mirroringr-   r  rJ   r   r_   r]   r^   r@   r|   )r)   rN   r  rE   s       r*   put_bucket_mirroringBosClient.put_bucket_mirroring~
  sN     !!#;[IS\SmSmn #& "  	r-   c                 F    U R                  [        R                  USS0US9$ )z[
get bucket mirroring

:type bucket_name: string
:param bucket_name: bucket name

:return:
r  r-   r  rI   rr   s      r*   get_bucket_mirroringBosClient.get_bucket_mirroring
  s3     !!# #&	 "  	r-   c                 F    U R                  [        R                  USS0US9$ )z^
delete bucket mirroring

:type bucket_name: string
:param bucket_name: bucket name

:return:
r  r-   r  r   rr   s      r*   delete_bucket_mirroring!BosClient.delete_bucket_mirroring
  s3     !!# #&	 "  	r-   )rN   r   obj_tag_argsc           
          U R                  [        R                  UU[        R                  " U[
        R                  S9SS0US9$ )
put object tagging

:type bucket_name: string
:param bucket_name: bucket name

:type key: string
:param key: object name

:type obj_tag_args: dict
:param obj_tag_args: object tagging args

:return:
r      taggingr-   )rN   r   rY   rQ   rE   r  )r)   rN   r   r  rE   s        r*   put_object_taggingBosClient.put_object_tagging
  sJ      !!#L)2L2LM$ "  	r-   c           	          0 n[         R                  " U5      U[        R                  '   U R	                  [
        R                  UUUSS0US9$ )r  r  r-   )rN   r   rX   rQ   rE   )r   r   r   BOS_TAGGINGrJ   r   r_   )r)   rN   r   
tag_headerrE   rX   s         r*   put_object_tagging_canned#BosClient.put_object_tagging_canned
  sY     ,2,C,CJ,O(()!!#$ "  	r-   c                 t    [         R                  " U5      nU R                  [        R                  UUSS0US9$ )z
delete object tagging

:type bucket_name: string
:param bucket_name: bucket name

:type key: string
:param key: object name

:return:
r  r-   rN   r   rQ   rE   r   r  s       r*   delete_object_taggingBosClient.delete_object_tagging
  sF     %%c*!!#$ "  	r-   c                 H    U R                  [        R                  UUSS0US9$ )z
put object tagging

:type bucket_name: string
:param bucket_name: bucket name

:type key: string
:param key: object name

:return:
r  r-   r  rI   r  s       r*   get_object_taggingBosClient.get_object_tagging
  s6     !!#$ "  	r-   )rN   statusc           	          U R                  [        R                  U[        R                  " SU0[
        R                  S9SS0[        R                  [        R                  0US9$ )z
put bucket versioning

:type bucket_name: string
:param bucket_name: bucket name

:type status: string
:param key: version status:disable/enabled/suspended

:return:
r  r   
   versioningr-   )rN   rY   rQ   rX   rE   r   )r)   rN   r  rE   s       r*   put_bucket_versioningBosClient.put_bucket_versioning  sa     !!#Xv.	8R8RS!3'!..0B0G0GH "  	r-   c                 F    U R                  [        R                  USS0US9$ )z\
get bucket versioning

:type bucket_name: string
:param bucket_name: bucket name

:return:
r  r-   r  rI   rr   s      r*   get_bucket_versioningBosClient.get_bucket_versioning!  s3     !!#!3'	 "  	r-   c                     SS0nUb  X(S'   Ub  X8S'   Ub  XHS'   Ub  XhS'   Ub  XXS'   U R                  [        R                  XUS9$ )	r?  s   versionsr-   r@  rA  rB  rC  s   versionIdMarkerrP   rI   )	r)   rN   rD  rE  rF  version_markerrG  rE   rQ   s	            r*   list_objects_versionsBosClient.list_objects_versions1  st    2 s#!): &9 &9 #,< %)7%&!!,"2"2KW]!^^r-   )rN   retention_daysc           	      t    U R                  [        R                  USS0[        R                  " SU05      US9$ )z
init bucket object lock
:type bucket: string
:param bucket: None

:type retention_days: int
:param retention_days: None

:return:**Http Response**

   objectlockr-   retentionDaysr(  rJ   r   r  r]   r^   )r)   rN   r  rE   s       r*   init_bucket_object_lock!BosClient.init_bucket_object_lockX  sC     !!,"3"3"-*7)='+zz?N2S'T)/	 " 1 	1r-   c                 F    U R                  [        R                  USS0US9$ )z]
get bucket object lock

:type bucket: string
:param bucket: None

:return:**Http Response**
r  r-   rP   rI   rr   s      r*   get_bucket_object_lock BosClient.get_bucket_object_lockm  s2     !!,"2"2"-*7)=)/ " 1 	1r-   c                 F    U R                  [        R                  USS0US9$ )z`
Delete Bucket Object Lock

:type bucket: string
:param bucket: None

:return:**Http Response**
r  r-   rP   r   rr   s      r*   delete_bucket_object_lock#BosClient.delete_bucket_object_lock|  s2     !!,"5"5"-*7)=)/ " 1 	1r-   c                 F    U R                  [        R                  USS0US9$ )z
complete bucket object lock
:type bucket: string
:param bucket: None

:type retention_days: int
:param retention_days: None

:return:**Http Response**
s   completeobjectlockr-   rP   )rJ   r   r  rr   s      r*   complete_bucket_object_lock%BosClient.complete_bucket_object_lock  s2     !!,"3"3"-*?)E)/ " 1 	1r-   )rN   extend_retent_daysc           	      t    U R                  [        R                  USS0[        R                  " SU05      US9$ )z
extend bucket object lock
:type bucket: string
:param bucket: None

:type extend_retent_days: int
:param extend_retent_days: None

:return:**Http Response**
s   extendobjectlockr-   extendRetentionDaysr(  r  )r)   rN   r  rE   s       r*   extend_bucket_object_lock#BosClient.extend_bucket_object_lock  sE     !!,"3"3"-*=s)C'+zz3HJ\2]'^)/	 " 1 	1r-   c                 F    U R                  [        R                  USS0US9$ zV
get bucket quota
:type bucket: string
:param bucket: None

:return:**Http Response**
   quotar-   rP   rI   rr   s      r*   get_bucket_quotaBosClient.get_bucket_quota  s1     !!,"2"2"-*2C)/ " 1 	1r-   )rN   
quota_confc           	          U R                  [        R                  U[        R                  " U[
        R                  S9SS0US9$ )z
put quota conf of bucket
:type bucket: string
:param bucket: None

:type retention_days: int
:param retention_days: None

:return:**Http Response**
r   r  r-   r  r  )r)   rN   r  rE   s       r*   put_bucket_quotaBosClient.put_bucket_quota  sE     !!,"2"2"-'+zz*iF`F`'a*2C)/	 " 1 	1r-   c                 F    U R                  [        R                  USS0US9$ r  r   rr   s      r*   delete_bucket_quotaBosClient.delete_bucket_quota  s1     !!,"5"5"-*2C)/ " 1 	1r-   c                 F    U R                  [        R                  USS0US9$ )zX
get bucket tagging
:type bucket: string
:param bucket: None

:return:**Http Response**
r  r-   rP   rI   rr   s      r*   get_bucket_taggingBosClient.get_bucket_tagging  s2     !!,"2"2"-*4c):)/ " 1 	1r-   )rN   tag_confc           	          U R                  [        R                  U[        R                  " U[
        R                  S9SS0US9$ )z
put tagging conf of bucket
:type bucket: string
:param bucket: None

:type retention_days: int
:param retention_days: None

:return:**Http Response**
r   r  r-   r  r  )r)   rN   r  rE   s       r*   put_bucket_taggingBosClient.put_bucket_tagging  sF     !!,"2"2"-'+zz(ID^D^'_*4c):)/	 " 1 	1r-   c                 F    U R                  [        R                  USS0US9$ )z[
delete bucket tagging
:type bucket: string
:param bucket: None

:return:**Http Response**
r  r-   rP   r   rr   s      r*   delete_bucket_taggingBosClient.delete_bucket_tagging  s2     !!,"5"5"-*4c):)/ " 1 	1r-   c                    0 nU b?  U (       a  U S:  a  [        S5      e[        R                  " U 5      U[        R                  '   Ub'  [
        R                  " U5      U[        R                  '   Ub(  [
        R                  " U5      U[        R                  '   O![        R                  U[        R                  '   Ub'  [
        R                  " U5      U[        R                  '   Ub'  [
        R                  " U5      U[        R                  '   Ub'  [
        R                  " U5      U[        R                  '   Ub'  [
        R                  " U5      U[        R                  '   Ub'  [
        R                  " U5      U[        R                  '   Ub*  S[
        R                  " U5      -  U[        R                   '   U	Gb  Sn[#        5       n[%        U	[&        5      (       d  [)        S5      e[+        U	5       H  u  nnUR-                  UR/                  5       5        [
        R                  " U5      n[
        R                  " U5      n[        R0                  U-   nUUU'   U[3        U5      -  nU[3        U5      -  nM     U[4        R6                  :  a  [        S[4        R6                  -  5      e[3        U5      [3        U	5      :w  a  [        S5      eU
b  U
U[        R8                  '   Ub'  [
        R                  " U5      U[        R:                  '   Ub'  [
        R                  " U5      U[        R<                  '   Ub'  [
        R                  " U5      U[        R>                  '   Ub   [@        RC                  UUS5      nUb  UU[        RF                  '   Ub'  [        R                  " U5      U[        RH                  '   U$ ! [D         a  nUeS nAff = f)Nr   z&content_length should not be negative.s   "%s"z%user_metadata should be of type dict.z,Metadata size should not be greater than %d.z%user_metadata has duplicate elements.F)%r   r   r   r   CONTENT_LENGTHr   r  CONTENT_MD5r\   r   r  BCE_CONTENT_SHA256BCE_CONTENT_CRC32BCE_CONTENT_CRC32CBCE_CONTENT_CRC32C_FLAGBCE_CONTENT_CRC64ECMAETAGr  rf   r  rW  r   addr  ra  rX  r   MAX_USER_METADATA_SIZEr  BOS_SERVER_SIDE_ENCRYPTION'BOS_SERVER_SIDE_ENCRYPTION_CUSTOMER_KEY+BOS_SERVER_SIDE_ENCRYPTION_CUSTOMER_KEY_MD5r@   r  r  rq  r  )r  r  r  r  r  r  r  r  r  rd  r   r  r  r  r  rs  r  rX   	meta_sizemeta_data_setrz   r{   normalized_keyrm   s                           r*   r  !BosClient._prepare_object_headers  sX   & %.1"4 !IJJ393J3J>3ZGL//0"050P0PQ\0]GL,,-#161Q1QR^1_GL--.1C1P1PGL--.%7<7W7WXf7gGL334$6;6V6VWd6eGL223%7<7W7WXf7gGL334*<A<\<\]p<qGL889(:?:Z:Z[l:mGL667)053S3STX3Y)YGL%%&$IEMmT22 GHH!-01!!!''),44Q744Q7!-!F!F!J*+'S00	SV#	 1 3555 BSE_E__a a=!S%77 !HII$6CGL223!?D?_?_`j?kGL;;<#00> LHHI '001AB LLLM ##44WlER $6CGL223%060G0G0WGL,,-  s   )O 
OOOc                    [         R                  nU [        R                  :X  d  U [        R                  :X  aV  UR                  [        [         R                  [         R                  [         R                  [         R                  /5      5      n[        U5       H6  u  pE[        R                  " U5      nXC;   a  XQU'   M&  [        U< SU < 35      e   U$ )z
get if condition headers
:type http_method: string
:param http_method: GET, HEAD, PUT, POST

:type cond_read_write: string
:param cond_read_write: put_object, complete_multipart_upload, get_object, get_object_meta_data

:return: headers
z is not valid in )r   BOS_COND_READ_WRITE_HEADERSr   rK   re   unionr  BOS_IF_MODIFIED_SINCEBOS_IF_UNMODIFIED_SINCEBOS_IF_MATCHBOS_IF_NONE_MATCHr   r   r  r   )http_methodrX   ru  cond_read_write_setrz   r{   s         r*   rr  &BosClient._get_cond_read_write_headers}  s     +FF,***k\=N=N.N"5";";C3355**//1=2 #3 o.DA003A'
 A{!KLL / r-   c           	         [        U[        5      (       d  [        S5      e[        R                  nU(       df  UR                  [        [        R                  [        R                  [        R                  [        R                  [        R                  /5      5      nOGUR                  [        [        R                  [        R                  [        R                  /5      5      n[        U5       HP  u  pV[         R"                  " U5      nU[        R$                  :w  a  [         R"                  " U5      nXT;   d  ML  X`U'   MR     U $ )Nz$user_headers should be of type dict.)rf   r  rW  r   BOS_BASE_ALLOW_HEADERSr,  r  CACHE_CONTROLCONTENT_ENCODINGCONTENT_DISPOSITIONEXPIRESBOS_PROCESSBCE_COPY_SOURCE_IF_NONE_MATCH#BCE_COPY_SOURCE_IF_UNMODIFIED_SINCE!BCE_COPY_SOURCE_IF_MODIFIED_SINCEr   r   r  BOS_OBJECT_EXPIRES)rX   r  is_copybos_headersuser_headers_setrz   r{   s          r*   r  BosClient._get_user_header  s   ,--BCC"99*00l6P6P$0$A$A$0$D$D$0$8$8$0$<$<	6> 2?  @  +00l6`6`$0$T$T$0$R$R6T 2U  V l+DA003AL33344Q7$
 , r-   c                 X    S nUb  [        X5      nUb  U$ [        U R                  U5      $ rC   )getattrrE   )r)   rE   attrr5   s       r*   r  BosClient._get_config_parameter  s3    V*FMt{{D))r-   c                    U R                   nU(       a  U R                  n[        R                  " X@R                  5      u  pVnU R
                  (       d6  [        R                  " U5      (       d  [        R                  " Xa5      (       a%  [        R                  " [        R                  U5      $ [        R                  " [        R                  X5      $ rC   )r
  backup_endpointr   r	  r  cname_enabledis_cname_like_hostis_custom_host
append_urir   
URL_PREFIX)rE   rN   r   use_backup_endpointhostr  	host_namer  s           r*   r  BosClient._get_path  s    ))D!!$8 	4m5#;#;I#F#F%J^J^_hJvJv##CNNC88AAr-   c                     [         R                   " U R                  5      nUb  UR                  U5        U R                  X25      nXCl        U$ rC   )copyrE   merge_non_none_values_change_user_endpointr
  )r)   rE   rN   
new_configr
  s        r*   r   BosClient._merge_config  sD    YYt{{+
,,V4--jF&r-   c                 :   [         R                  " UR                  UR                  5      u  p4n[        R
                  " U5      R                  S5      nUR                  n[         R                  " U5      =(       a    [        U5      S:H  n[         R                  " U5      (       a  UR                  $ UR                  (       a  UR                  $ UR                  (       d  [         R                  " U5      (       a  U(       a  [        S5      eUR                  $ Ub  U(       a  UR                  [        5      (       aj  UR                  S5      n	[        U	5      S:  a  UR                  $ U	S   S-   [        R
                  " U5      -   S-   U	S   -   n
[        R
                  " U
5      $ [        R
                  " U5      S-   [        R
                  " U5      -   $ [        U5      S:X  a+  Ub(  US   [        R
                  " U5      :w  a  [        S	5      eUR                  $ )
N   .r  z<endpoint is not cname domain, please set cname_enabled=Falses   //rS  r   r     z@your endpoint's bucket_name is not equal your query bucket_name!)r   r	  r
  r  r   r   splitis_bos_suffixed_hostrX  
check_ipv4path_style_enablerI  rJ  r   rx   HTTP_PROTOCOL_HEAD)r)   rE   rN   r  user_host_namer  user_endpoint_splituser_endpointis_bos_path_style_hosthttp_head_splitbucket_endpoints              r*   rU  BosClient._change_user_endpoint  s   !!&//6??C 	9=$55nEKKDQ!&!;!;N!K!mPSTgPhlmPmN++??"$$??" 5#;#;N#K#K% RT T & "% ++,>??&3&9&9%&@O?+a/%.&5a&85&@6CZCZ[fCg&g'.q1'2O!22?CC!22;?D//>? ? "#q([-D#A&&*A*A+*NN !deer-   c                     [        U[        5      (       d  gUR                  [        R                  R
                  :X  a  [        R                  S5        gg)NFz*BOS retry condition matched: 403 ForbiddenT)rf   r   rh   ri   rj   rk   r  rT  )rE   r  s     r*   _need_retry_for_bosBosClient._need_retry_for_bos  sA     %00  5 55MMFGr-   c                    [        U [        5      (       a  g[        U [        5      (       a  U R                  [        R
                  R                  :X  a  gU R                  [        R
                  R                  :X  a  gU R                  [        R                  :X  a  gU R                  [        R
                  R                  :X  a  gg)NTF)rf   IOErrorr   rh   ri   rj   INTERNAL_SERVER_ERRORSERVICE_UNAVAILABLEcodeREQUEST_EXPIREDrk   )r  s    r*   _need_retry_backup_endpoint%BosClient._need_retry_backup_endpoint  s     eW%% e^,,  DKK$E$EE  DKK$C$CCzz^;;;  DKK$9$99r-   c	                    [         R                  " U5        Ub  [         R                  " U5        U R                  Xr5      n[        R                  XrU5      n	Uc  [        R                  nUR                  b(  U=(       d    0 nUR                  U[        R                  '   UR                  SL a,  U=(       d    0 n[        R                  U[        R                  '   S n
S nS n[        US5      (       a!  [        US5      (       a  UR!                  5       n ["        R$                  " U[&        R(                  [        R*                  U/XXEU5      $ ! [,         a  nUn
Un S nAOS nAff = fU	nUb  UR.                  b  [        R1                  UR2                  5      (       a   Ub  UR5                  U5        [6        R9                  SUR:                  5        [        R                  XrUS5      n	["        R$                  " U[&        R(                  [        R*                  U/XXEUS5	      $ ! [,         a  nUn
Un S nAOS nAff = fUb  [        R=                  X{R2                  5      (       a   Ub  UR5                  U5        [6        R9                  SUR:                  5        ["        R$                  " U[&        R(                  [        R*                  U/XXEU5      $ ! [,         a  nUn
Un S nAOS nAff = fU
c  e U
e)NTr  r  s)   Retry for backup endpoint error code: %s.s   Retry for BOS error code: %s.)r   r   r   r   r@   r  r   
parse_jsonr  r   r  r  r   r  r  hasattrr  r   send_requestr   r  parse_errorr   rH  rp  rg   r  r  rT  rh   rh  )r)   r1  rN   r   rY   rX   rQ   rE   rp  r!  last_exceptionrm   body_initial_offsetexoriginal_paths                  r*   rJ   BosClient._send_request   s    	((5?++C0##F8""6<!,,K  ,mG7=7L7LGL3344'mG6<6T6TGL223
 #4  WT6%:%:"&))+	"//**W-@-@+,N4&: : " 	NA	 =V33?&BB1<<PP
&2II12JAMMZ **6TJ&33M..1D1Dk0RtfdD D & !#
 =Y::6<<PP	&2II12>N&33M..1D1Dk0RvG G & !# !sJ   8E 
E$EE$BH# #
H;-H66H;&A,K 
K+K&&K+r>   rC   )NFN)NNN)NN)  NNNN)NNNNN)Nr{  N)i @  N)NNNN)NNNNNN)NNNNNNNNNNNNNNN)NNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNN)
NNNNNNNNNN)	NNNNNNNNN)NNNNNNNN)r|  NNNNN)NNNNNNNNNNNNNNNNN)F)NNF)NNNNNNN)r8   r9   r:   r;   r<   r+   rL   r   r   r   rT   rb   rn   rs   staticmethodr|   rU  r  r   r   r   r   r   r   r   r   ENCRYPTION_ALGORITHMr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rK   r"  r*  r-  r0  r6  r9  r<  rH  rP  r[  ri  rx  r  r  r  r  r  r  objectr   integer_typesr  r  r  r  r  r  r  r  r  r  r  r  r  r,  r0  r3  r8  r;  r@  rD  rI  rO  rW  ru  rx  r  r  r  r  boolr  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   rU  rh  rp  rJ   r=   r>   r-   r*   r@   r@   [   sa   -	C 5#,', (,  5#,'
 (
: 5#,' (( 5#,' (   5#,T4L9* :*( 5#,E9=* >* 5#,uclC* D*" 5#,'
* (
* 5#,'	S (	S 5#,'* (*: 5#,'* (*  5#,'* (*  5#,'FZcg * (*. 5#,'* (*  5#,'* (*" 5#,$:* ;** 5#,'* (*  5#,'* (*  5#,TH=* >*0 5#,'* (*, 5#,'* (*, 5#,'* (*, 5#,'* (* 5#,4(;* <*, 5#,5#,G* H* 5#,5#,G* H* 5#,'* (* 5#,'* (*. 5#,'* (*  5#,'* (* 5#,UCL9 +,6:(,'+04)-'++7+;+;WQ :WQr 5#,tTl; %)1 <1* 5#,'1 (1 5#,'1 (1 5#,D8D  $1 E1( 5#,'1 (1 5#,'1 (1 5#,'HL "_ ("_H 5#,' (( C C    D 5#,UCL9VZ04'5 :'5T 5#,UCL95 :5:      5#,UCL9 :  5#,UCLUCLQQUim26 R26j 5#,UCL9W :W2 5#,#,:$2257 "& "&#'$(#'$()-'+#'"&'+#'$( !^	7^@ 5#, %s|!&. /3)-/3041504156:4804/34804)-2.2h 5#,#,:$2257  $ $"&!%"&'+%)!%!% $" $$(%)!%"&#''f	7fP eS\s|5#,G+/,0.2-1.23715-1-1,0*.,00415-1.2/3&*%D HDL eS\s|s|L,0)-*.,0+/,015/3+/+/*.(,*..2/3+/,0-1$('I MIV %"'' !%"&"&!%-1"&#'&*C@	'C@J 5#,UCL90 :0( 5#,$:1 ;1& UCL"CL"CL* )-!%	1*14 5#,'1 (1 5#,'1 (1 5#,UCL9 0404/3)-( :(T 5#,#,'--0j" bfZ^\`\"\| %"''--0**-/ #&*'+'+ $3/3j 5#,#,'--0**-/ SWMQDHQU	/> 5#,#," 040404156:4826)-0	"0d 5#,UCLUCLQ1 R1( 5#,UCLUCLQ6:d Rd@ 5#,UCLUCLQB RB( 5#,'OS6:&*%_ (%_N 5#,' (: RV.2* 5#,UCLUCLQQU! $"" d RdL 5#,UCLtTlK* L*, 5#,UCL9#	4* :4*l 5#,UCL9 :* 5#,UCL9 :* 5#,UCLuclK$ L$L 5#,E3<%QTimhpqTXbf%* r%*P 5#,= >* 5#,UCLdT# U#JJ sgF7 G7&L 5#,'; (; 5#,th?; @;$ 5#,' ( 5#,TH= >$ 5#,' ( 5#,' (  5#,UCLxP Q.2 5#,UCL9 :( 5#,UCL9 :& 5#,s|< =( 5#,' ( 5#,'MQ,0$_ ($_L 5#,w?  $1 @1( 5#,'1 (1 5#,'1 (1 5#,'  $1 (1$ 5#,C7C  $1 D1( 5#,'  $1 (1 5#,D8<  $1 =1( 5#,'  $1 (1 5#,'  $1 (1 5#,$:  $1 ;1( 5#,'  $1 (1  $"!#\ \~  :  2* 	B 	B*X 
 
  $ 6:,0%)Er-   r@   c                   0    \ rS rSrSrS rS rS rS rSr	g)	SelectMessageig  z)
returned message from select object api
c                 6    SU l         Xl        X l        X0l        g)z
Initialize for record message
RecordsN)typerX   payloadrt  )r)   rX   r  rt  s       r*   set_record_message SelectMessage.set_record_messagek  s     	r-   c                 B    SU l         Xl        X l        X0l        X@l        g)z!
Initialize for continue message
ContN)r  rX   bytes_scannedbytes_returnedrt  )r)   rX   r  r  rt  s        r*   set_cont_messageSelectMessage.set_cont_messaget  s!     	*,r-   c                 *    SU l         Xl        X l        g)z
Initialize for end message
EndN)r  rX   rt  )r)   rX   rt  s      r*   set_end_messageSelectMessage.set_end_message~  s     	r-   c                 &   U R                   S:X  a&  SR                  U R                  U R                  5      $ U R                   S:X  a1  SR                  U R                  U R                  U R
                  5      $ SR                  U R                  5      $ )Nr  z{}
{}r  z%{}
bytes_scanned/bytes_returned={}/{}z{})r  r  rX   r  r  r  r(   s    r*   __str__SelectMessage.__str__  su    99	!??4<<>>YY& ;BB4<<QUQcQc?C?R?RT T ;;t||,,r-   )r  r  rt  rX   r  r  N)
r8   r9   r:   r;   r<   r  r  r  r  r=   r>   r-   r*   r  r  g  s    -r-   r  c                   :    \ rS rSrSrS rS rS r\S 5       r	Sr
g)	r  i  z(
deal with message of select object api
c                     SU l         g r#   )finishr(   s    r*   r+   SelectResponse.__init__  s	    r-   c                     Xl         X l        g)z"
get HttpResponse and BceResponse
N)rf  rS   )r)   rf  rS   s      r*   r  &SelectResponse.init_from_http_response  s     + r-   c              #   &  #    U R                   n U R                  (       Gd4  UR                  S5      nU(       d  [        e[        R
                  " SUSS 5      S   n[        R
                  " SUSS 5      S   nUR                  U5      nU R                  U5      n[        5       nUS   S:X  an  X4-
  S-
  nUR                  U5      n	[        R
                  " SUR                  S5      5      S   n
UR                  U[        R                  " U	5      U
5        Uv   GO%US   S:X  a  UR                  S5      nUR                  S5      n[        R
                  " SUR                  S5      5      S   n
[        R
                  " S	U5      S   n[        R
                  " S	U5      S   nUR                  XkX5        Uv   OUS   S
:X  a}  [        R
                  " SUR                  S5      5      S   n
US   S:w  a/  [        US   US   U R                  R                  R                  S9eUR!                  Xj5        SU l        Uv   U R                  (       d  GM4   U R                   R#                  5         g! U R                   R#                  5         f = f7f)z
generator for SelectMessage
   z>Ir   rZ  zmessage-typer     r  z>Qr  z
error-codesuccesszerror-message)rn  
request_idTN)rf  r  r  StopIterationstructunpack_parse_select_headersr  r  r   r   r  r   rS   rc  bce_request_idr  r  )r)   r  prelude	total_lenheaders_lenrX   headers_mapmsgpayload_lenr  rt  r  r  s                r*   r5   SelectResponse.result  s4     "	'kkk&&)''"MM$!=a@	$mmD'!A,?B&&-"88A#o~.);"+"9B">Kff[1G --affQi8;C**;8P8PQX8Y[^_I 0F:$%FF1IM%&VVAYN --affQi8;C$*MM$$Fq$IM%+]]4%H%KN((^YI 0E9 --affQi8;C"<0I=,[-IP[\hPi+/==+A+A+P+PR R''9"&DKI= kkk> $$&D$$&s   JII2 J2JJc                 `   0 nSnU[        U 5      :  a  [        R                  " SXUS-    5      S   nUS-  nXX#-    nX#-  n[        R                  " SXUS-    5      S   nUS-  nXX%-    nX%-  n[        R                  " U5      U[        R                  " U5      '   U[        U 5      :  a  M  U$ )z<
parse SELECT headers
:param headers: <str>
:return: <dict>
r   Br  z>HrS  )rX  r  r  r   r   )rX   hmr   key_lenr   	value_lenvalues          r*   r  $SelectResponse._parse_select_headers  s     c'l"mmC	)BCAFGQJE1CEdG519,EFqIIQJE5#45EE060H0H0OBv'',- c'l" 	r-   )r  rf  rS   N)r8   r9   r:   r;   r<   r+   r  r5   r}  r  r=   r>   r-   r*   r  r    s+    !''R  r-   r  )Cr<   r  rS  http.clientri   r`  r  r]   loggingr  r  builtinsr   r   future.utilsr   r   r   concurrent.futuresr   r	   r
   r   r%   	functoolsrb  r  r   r   baidubce.authr   baidubce.bce_base_clientr   baidubce.exceptionr   r   r   baidubce.httpr   r   r   r   r   baidubce.servicesr   baidubce.services.bosr   r   r   baidubce.utilsr   r   baidubce.protocolr  r  	getLoggerr8   r  FETCH_MODE_SYNCFETCH_MODE_ASYNCr~  r_  r    r@   r  r  r  r>   r-   r*   <module>r     s    
    	       8 8 W W     -  ' 2 - - 1 ) ! , & & ! - ( / #  $


H
%    4J4 J4Xh&-F &-PNV Nr-   