
    9il                       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
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KJ1r1  \Rd                  " \35      r4Sr5Sr6Sr7Sr8 " S S5      r9 " S S\5      r: " S  S!\;5      r< " S" S#\;5      r=g)$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)storage_class)required)compats   syncs   asyncAES256s   httpc                   *    \ rS rSrSrS rS rS rSrg)UploadTaskHandle>   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/land-doc-ocr/venv/lib/python3.13/site-packages/baidubce/services/bos/bos_client.py__init__UploadTaskHandle.__init__B   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.cancelF   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_cancelN   s8     	  "!!  "r,   )r#   r&   N)	__name__
__module____qualname____firstlineno____doc__r*   r1   r5   __static_attributes__ r,   r)   r   r   >   s    ,#r,   r   c                   P   \ 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\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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\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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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S/ j5       r/\" \\	4\\4S09 SS1 j5       r0\" \\	4S9SS2 j5       r1\" \\	4S9SS3 j5       r2\" \\	4\S49 SS5 j5       r3\" \\	4S9SS6 j5       r4\" \\	4S9SS7 j5       r5\" \\	4S9  SS8 j5       r6\" \\	4S9SS9 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SS@ j5       r>\" \\	4\\	4\\	4SA9  SSB j5       r?\" \\	4\\	4S,9SSC j5       r@\" \\	4\\	4\A\BR                  \\	4SD9          SSE j5       rD\" \\	4\\	4\\	4SF9          SSG j5       rE\" \\	4\\	4\A\BR                  \\	4SD9            SSH j5       rF\" \\	4\\	4\\	4SI9             SSJ j5       rG\" \\	4\\	4\\	4SK9              SSL j5       rH\" \\	4\\	4\\	4\\	4SM9          SSN j5       rI\" \\	4\\	4S,9SSO j5       rJ\" \\	4\SP9SSQ j5       rK\" \\	4\\	4\\	4SR9  SSS j5       rL\" \\	4S9SST j5       rM\" \\	4S9SSU j5       rN\" \\	4\\	4S,9    SSV j5       rO\" \\	4\\	4\\	4\P\BR                  \ASW9  SSX j5       rQ\" \\	4\\	4\\	4\\	4\\	4\P\BR                  \BR                  SY9     SSZ j5       rR\" \\	4\\	4\\	4\P\BR                  \\	4\BR                  S[9  SS\ j5       rS\" \\	4\\	4\\	4\S]9   SS^ j5       rT\" \\	4\\	4\\	4S_9SS` j5       rU\" \\	4\\	4\\	4S_9  SSa j5       rV\" \\	4\\	4\\	4S_9SSb j5       rW\" \\	4S9   SSc j5       rX\" \\	4S9SSd j5       rY SSe jrZ\" \\	4\\	4\\	4SA9         SSf j5       r[\" \\	4\\	4\\4Sg9SSh j5       r\\" \\	4\\	4S,9    SSi j5       r]\" \\	4\\	4S,9SSj j5       r^\" \\	4\\	4S,9SSk j5       r_\" \\	4\\	4\\	4Sl9   SSm j5       r`\" \\	4\\	4\\	4\aSn9  SSo j5       rb\" \\	4\\	4Sp9SSq j5       rc\" \\	4\\	4\4Sr9SSs j5       rdSSt jre\" \P\PSu9SSv j5       rfSSw jrg\" \\	4S9SSx j5       rh\" \\	4\4Sy9SSz 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       rmSS jrnSS jroSS jrpSS jrqSS jrr\" \\	4S9  SS j5       rs\" \\	4\S49 SS j5       rt\" \\	4S9SS j5       ru\" \\	4S9SS j5       rv\" \\	4\S49 SS j5       rw\" \\	4\S49 SS j5       rx\" \\	4\S49 SS j5       ry\" \\	4\S49 SS j5       rz\" \\	4\S49 SS j5       r{\" \\	4\S49 SS j5       r|\" \\	4\S49 SS j5       r}\" \\	4\S49 SS j5       r~\             SS j5       r\SS j5       rS r\SS j5       rS rS r\S 5       r    SS jrSrg)	BosClientX   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
rD   _send_requestr   GETrC   s     r)   list_bucketsBosClient.list_buckets_   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,   paramsrD   )rI   r   rJ   location_constraint)r(   rM   rD   rP   responses        r)   get_bucket_locationBosClient.get_bucket_locationj   s8     s#%%l&6&6[a%b+++r,   c                 >    U R                  [        R                  X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
rG   )rI   r   PUTr(   rM   rD   s      r)   create_bucketBosClient.create_bucket{   s      !!,"2"2K!OOr,   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
rG   TNF)rI   r   HEADr   
isinstance
last_errorr   status_codehttpclient	FORBIDDEN	NOT_FOUND)r(   rM   rD   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,   rO   rH   rW   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)aclr4   kvs       r)   _dump_acl_objectBosClient._dump_acl_object   s9    cll+DA<<$$q	 , r,   )rM   rn   c           	          U R                  [        R                  U[        R                  " SU0[
        R                  S9[        R                  [        R                  0SS0US9  g)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defaultrg   r,   bodyheadersrP   rD   NrI   r   rV   jsondumpsr?   rq   r   CONTENT_TYPEr   JSON)r(   rM   rn   rD   s       r)   set_bucket_aclBosClient.set_bucket_acl   s_     	<++& $

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

:param bucket_name:
:param canned_acl:
:param config:
:return:
rg   r,   ry   rP   rD   N)rI   r   rV   r   BCE_ACL)r(   rM   r   rD   s       r)   set_bucket_canned_aclBosClient.set_bucket_canned_acl   s:     	<++&$0$8$8*#E#)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$ ).

:param bucket_name:
:param config:
:return:
storageClassru      storageClassr,   rw   r   convert_to_stringrI   r   rV   r{   r|   r?   rq   r   r}   r   r~   )r(   rM   r   rD   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,   rO   rH   rW   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**
rG   rI   r   DELETErW   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notFoundru      websiter,   rw   rz   )r(   rM   r   	not_foundrD   rx   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,   rO   rH   rW   s      r)   get_bucket_static_website#BosClient.get_bucket_static_website$  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,   rO   r   rW   s      r)   delete_bucket_static_website&BosClient.delete_bucket_static_website5  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**
encryptionAlgorithmru   
   encryptionr,   rw   r   )r(   rM   encryption_algorithmrD   s       r)   put_bucket_encryptionBosClient.put_bucket_encryptionF  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,   rO   rH   rW   s      r)   get_bucket_encryptionBosClient.get_bucket_encryption^  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,   rO   r   rW   s      r)   delete_bucket_encryption"BosClient.delete_bucket_encryptiono  s2     !!,"5"5&#0#"6"( " * 	*r,   )rM   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   ru      copyrightProtectionr,   rw   rz   )r(   rM   r   rD   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,   rO   rH   rW   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,   rO   r   rW   s      r)   "delete_bucket_copyright_protection,BosClient.delete_bucket_copyright_protection  s2     !!,"5"5&#93"?"( " * 	*r,   )rM   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   idru   rw   r   convert_to_bytesrI   r   rV   r{   r|   r?   rq   r   r}   r   r~   )r(   rM   r   rD   rP   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   rO   r   r   rI   r   rJ   r(   rM   r   rD   rP   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   rO   r   r   rI   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   rO   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   listrO   rH   rW   s      r)   list_bucket_replication!BosClient.list_bucket_replication  s2     !!,"2"2&36"E"( " * 	*r,   )rM   	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   ru   r,   	   inventoryr   rw   r   )r(   rM   r   rD   conf_ids        r)   put_bucket_inventoryBosClient.put_bucket_inventory'  ss     )))D/:!!,"2"2& $

93<3M3M!O$0$=$=?Q?V?V#W14W"E"( " * 	*r,   )rM   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   rO   )rI   r   rJ   r   r   r(   rM   r   rD   s       r)   get_bucket_inventoryBosClient.get_bucket_inventory>  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   rO   )rI   r   r   r   r   r   s       r)   delete_bucket_inventory!BosClient.delete_bucket_inventoryN  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,   rO   rH   rW   s      r)   list_bucket_inventoryBosClient.list_bucket_inventory^  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**
trashDirru      trashr,   rw   r   )r(   rM   	trash_dirrD   s       r)   put_bucket_trashBosClient.put_bucket_trashn  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,   rO   rH   rW   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,   rO   r   rW   s      r)   delete_bucket_trashBosClient.delete_bucket_trash  s1     !!,"5"5&#+S/"( " * 	*r,   )rM   keyr   i  c           
         [         R                  " U5      n[        U5      S:X  d  US:X  a  [        S5      eU R	                  X5      n	U=(       d    0 nU=(       d    0 nUb  Xl        [        R                  " U	R                  U	R
                  5      u  pnUnXR                  :w  a  US[         R                  " U5      -   -  nX[        R                  '   U R                  XU5      nU
[        R                  :w  a   U
[        R                  :w  a  [!        S/5      nU	R"                  b+  U	R"                  U[        R$                  R'                  5       '   [(        R*                  " U	R,                  U
UUUUUU5      U[        R.                  R'                  5       '   S[         R                  " UR0                  5      UU[        R2                  " 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**
r   s   v1z!generate url the key param error!   :s   hosts   %s://%s%s?%sF)r   r   len
ValueError_merge_configprotocolr   parse_host_portendpointdefault_portr   HOST	_get_pathr   rJ   r[   setsecurity_tokenSTS_SECURITY_TOKENlowerr   signcredentialsAUTHORIZATIONnameget_canonical_querystring)r(   rM   r   	timestampexpiration_in_secondsry   rP   headers_to_signr   rD   
httpmethodendpoint_protocolendpoint_hostendpoint_port	full_hostpaths                   r)   generate_pre_signed_url!BosClient.generate_pre_signed_url  s   < %%c*s8q=C5L@AA##F8-R2 &O!!&//6??C 	8- "	::: 7 7 FFFI%.!!"~~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,   )rM   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rP   rx   rD   rI   r   rV   r{   r|   )r(   rM   r  rD   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,   rO   rH   rW   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,   rO   r   rW   s      r)   delete_bucket_lifecycle!BosClient.delete_bucket_lifecycle  s2     !!,"5"5"-*6)<)/ " 1 	1r,   )rM   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(   rM   r  rD   s       r)   put_bucket_corsBosClient.put_bucket_cors#  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**
r!  r,   rO   rH   rW   s      r)   get_bucket_corsBosClient.get_bucket_cors8  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**
r!  r,   rO   r   rW   s      r)   delete_bucket_corsBosClient.delete_bucket_corsG  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	   delimiterrO   rH   )r(   rM   max_keysprefixmarker	delimiterrD   rP   s           r)   list_objectsBosClient.list_objectsV  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)r3  r2  r4  rD   )r5  contentsis_truncatednext_marker)r(   rM   r2  r4  rD   r3  rR   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)r\   listtuple	TypeErrorr   r   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_PREFIXrm   r   convert_to_unicodemetadatauser_metadatadata)http_responserR   rP  headers_list
temp_headsro   rp   r2  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XH[        R                  '   U R                  [        R                  UUUUU[
        R                  S9$ )H

:param bucket_name:
:param key:
:param range:
:param config:
:return:
	   versionIdr      /(Key can not be empty or start with '/' .ry   rP   rD   body_parser)r   r   r   rm   r   r?   rG  r   BOS_TRAFFIC_LIMITrI   r   rJ   rU  )	r(   rM   r   rF  traffic_limit
version_idrD   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!! !33 " 5 	5r,   c           
      x   [         R                  " U5      n0 nUb  X6[        R                  '   [         R                  " U5      S;  a  [        SR                  U5      5      e[         R                  " U5      U[        R                  '   U R                  [        R                  UUUSS0U[        R                  S9$ )z:

:param bucket_name:
:param key:
:param config:
:return:
)Standard	ExpeditedLowCostz\invalid tier:{} for restore_object.The valid value is "Standard" or "Expedited" or "LowCost"s   restorer,   r\  )r   r   r   BOS_RESTORE_DAYSr   r   formatBOS_RESTORE_TIERrI   r   POSTr?   rU  )r(   rM   r   daystierrD   ry   s          r)   restore_objectBosClient.restore_object  s     %%c*59L112##D)1UU ""(&,1 1171H1H1N--.!!$!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intrO  content_lengthr   make_progress_adaptershutilcopyfileobjclose)rR  rR   	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rR  rR   select_responses      r)   _parse_select_messageBosClient._parse_select_message  s    //Hr,   c                     [         R                  " U5      nU R                  XX4US9nUR                  R	                  5       nUR                  R                  5         U$ )rX  )rF  r`  rD   )r   r   rc  rQ  readry  )r(   rM   r   rF  r`  rD   rR   ss           r)   get_object_as_stringBosClient.get_object_as_string  sP     %%c*??;5bh?iMM r,   )rM   r   rz  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
Xz[        R                  '   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**
rY  r   rZ  r[  c           	      R   > [         R                  U UTTR                  TS5      TS9$ )Nrecv_buf_size)r|  )r?   r  _get_config_parameter)rR  rR   rD   rz  r|  r(   s     r)   <lambda>.BosClient.get_object_to_file.<locals>.<lambda>F  s2    	8T8T**6?C"3 9U 95r,   r\  )r   r   r   rm   r   r?   rG  r   r^  rI   r   rJ   )r(   rM   r   rz  rF  rD   r|  r_  r`  ra  rb  s   `  ` ``    r)   get_object_to_fileBosClient.get_object_to_file  s    ( !00<J&
3L%%c*s8q=CNN400 !KLL++I6	 77>$#!;H778!! 5 " 6 	6r,   c                     0 nUb  [         R                  " U5      nSU0n[         R                  " U5      nU R                  [        R                  XXTS9$ )z
Get head of object

:type bucket: string
:param bucket: None

:type key: string
:param key: None
:return:
    **_GetObjectMetaDataResponse Class**
rY  rO   )r   r   rI   r   r[   r(   rM   r   r`  rD   ra  s         r)   get_object_meta_dataBosClient.get_object_meta_dataN  s^     !00<J&
3L%%c*!!,"3"3[ " , 	,r,   )rM   r   rQ  ru  content_md5c                    [         R                  " U5      n[         R                  " U5      nU R                  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                  " X<5      nU R                  [        R                  UUUUUUS9$ )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**
	ru  r  content_typecontent_sha256rP  r   user_headersr_  object_taggingDObject length should be less than %d. Use multi-part upload instead.s   appendr,   s   offsetrw   )r   r   _prepare_object_headersr   MAX_APPEND_OBJECT_LENGTHr   r   rv  rI   r   rl  )r(   rM   r   rQ  r  ru  offsetr  rP  r  r   r  r|  r_  r  rD   ry   rP   s                     r)   append_objectBosClient.append_objectc  s    @ %%c*--k:..)#%)''%') / 	+ C888 >@C@\@\] ^ ^ S! &F9..tGD!! "  	r,   )rM   r   rQ  c                    [         R                  " U5      n[        U[        5      (       a  UR	                  [
        R                  5      nSn [        R                  " U5      nUc$  [        R                  " XR                  US5      S9nU R                  UUUU[        U5      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{  )rM   r   rQ  r  ru  r  r  rP  r  r   r  r|  r_  rD   )r   r   r\   r   encodebaidubceDEFAULT_ENCODINGioBytesIOr   get_md5_from_fpr  r  r   ry  )r(   rM   r   rQ  r  r  r  rP  r  r   r  r|  r_  rD   fps                  r)   append_object_from_string#BosClient.append_object_from_string  s    $ %%c*dC  ;;x889D	D!B"#33!;!;FO!TV %%+*-+-2=58Y-33?4A5C4A3?8I4A-3 & 5 ~
 r~
 s   A!C Cc                    [         R                  " U5      n[         R                  " U5      nU R                  UUUUUU	U
UUS9	nU R                  US5      nU[        R
                  :  a  [        S[        R
                  -  5      eU(       a  [        R                  " X>5      nU R                  [        R                  UUUUUS9$ )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**
r  r  r  )rx   ry   rD   )r   r   r  r  r   MAX_PUT_OBJECT_LENGTHr   r   rv  rI   r   rV   )r(   rM   r   rQ  ru  r  r  r  rP  r   r  
encryptioncustomer_keycustomer_key_md5r|  r_  r  rD   ry   r{  s                       r)   
put_objectBosClient.put_object  s    L %%c*--k:..)#%)''%') / 	, --foFC555 >@C@Y@YZ [ [ 224K!! "  	r,   )bucketr   rQ  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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  ru  r  r  r  rP  r   r  r  r  r  r|  r_  r  rD   )r   r   r\   r   r  r  r  r  r  r   r  r  r  r   ry  )r(   r  r   rQ  r  r  r  rP  r   r  r  r  r  r|  r_  r  rD   r  s                     r)   put_object_from_string BosClient.put_object_from_string  s    @ %%c*dC  ;;x889D	D!B"#33!;!;FO!TV??625d)/:0<2@1>1>0<.80<4D7H1>2@*0 # 2  ~
 r~
 s   A$C C)r  r   rz  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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  )lengthr{  r  )r   r   rs  seekosSEEK_ENDtellr  r   r  guess_content_type_by_file_namer  ry  )r(   r  r   rz  ru  r  r  r  rP  r   r  r  r  r  r|  r_  r  rD   r  r  s                       r)   put_object_from_fileBosClient.put_object_from_fileT  s    F %%c*)T"	%2;;'!#
" $ : :6? S#33B~=JL#$DDYO??62@/:0<2@1>1>0<.80<4D5F1>2@*0 # 2  HHJBHHJs   B%C C,)source_bucket_name
source_keytarget_bucket_name
target_keyc           	         [         R                  " U5      n[         R                  " U5      n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  rP  r   r  r_  r     /%s/%sFNs   ?versionId=%ss   replaces   copyT)ry   rD   r]  )r   r   r  r   normalize_stringr   BCE_COPY_SOURCEBCE_COPY_SOURCE_IF_MATCHBCE_COPY_METADATA_DIRECTIVEr?   _get_user_header	ExceptionrI   r   rV   r   parse_copy_object_response)r(   r  r  r  r  etagr  rP  r   r  copy_object_user_headersr_  r  source_version_idrD   ry   merge_source_keyrc   s                     r)   copy_objectBosClient.copy_object  sd   D ,,Z8
,,Z8
..%''%') / + !11''(:; "$ (/2BVE\E\]nEo2oo0@,,-=AL99:$(@@JGL<<=@GGL<<=#/#44WX\] !!#>> " @ 	@  s   )D/ /
E 9D;;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**
rY  rO   r   r  s         r)   delete_objectBosClient.delete_object  s^     !00<J&
3L%%c*!!,"5"5{ " 0 	0r,   )rM   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,   rx   rP   rD   )r   r   rI   r   rl  r{   r|   )r(   rM   r  rD   ro   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           
      v    U R                  [        R                  USS0[        R                  " UUS.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**
   loggingr,   )targetBuckettargetPrefixr  r  )r(   r  r  r  rD   s        r)   put_bucket_loggingBosClient.put_bucket_logging  sJ    & !!,"2"2"/*4c):'+zz=BO3Q (R)/ " 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,   rO   rH   rW   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,   rO   r   rW   s      r)   delete_bucket_loggingBosClient.delete_bucket_logging0  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  rI   r   rl  )	r(   rM   r   r  r   r  rD   ry   rc   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	)rM   r   	upload_idpart_number	part_sizepart_fpc           
      r   [         R                  " U5      nU[        R                  :  d  U[        R                  :  a-  [        SU[        R                  [        R                  4-  5      eU[        R                  :  a  [        S[        R                  -  5      e[        R                  U[        R                  [        R                  0nUb  X{[        R                  '   U(       a  [        R                  " XhU5      nU	b  X[        R                  '   U R!                  ["        R$                  UUUUXCS.U
S9$ )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. s
   partNumber   uploadIdrw   )r   r   r   MIN_PART_NUMBERMAX_PART_NUMBERr   r  r   CONTENT_LENGTHr}   r   r  CONTENT_MD5r   rv  r^  rI   r   rV   )r(   rM   r   r  r  r  r  part_md5r|  r_  rD   ry   s               r)   upload_partBosClient.upload_partj  s*   N %%c*,,,c>Q>Q0QXS00#2E2E\G G H H s000J"889 : :  ..	,,.@.M.MO08L,,-11'iXG$6CL223!!#.G "  	r,   )r  r  r  r  r  r  r  r  c           	         [         R                  " U5      n[         R                  " U5      n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  rP  r_  r  FrA     r  r   )r   r   r  r   r  r   r  BCE_COPY_SOURCE_RANGEr  rI   r   rV   )r(   r  r  r  r  r  r  r  r  r  r  rP  r_  rD   ry   rF  s                   r)   upload_part_copyBosClient.upload_part_copy  s    L ,,Z8
,,Z8
..&2'4'4 / 6 160F0F"f&=&=>P&Q#&% %&+1-,,- #fy.@1.D%EE6;223=AL99:!!#.G "  	r,   )rM   r   r  r  r  rz  r  c                     [         R                  " U5      n[        US5      n UR                  U5        U R	                  XX4X\XXS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_  rD   )r   r   rs  r  r  ry  )r(   rM   r   r  r  r  rz  r  r  r|  r_  rD   r}  s                r)   upload_part_from_fileBosClient.upload_part_from_file  se    . %%c*D!	FF6N##Kii-52? $ P GGIAGGIs   #A A*)rM   r   r  	part_listc           	          [         R                  " U5      nU R                  [        R                  UUS9nU R                  [        R                  UU[        R                  " SU05      USU0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  rP  r  partsr   )rx   ry   rP   )
r   r   r  r   r~   rI   r   rl  r{   r|   )	r(   rM   r   r  r  rP  r  rD   ry   s	            r)   complete_multipart_upload#BosClient.complete_multipart_upload
  s}    6 %%c*..+00'% / '
 !!Wi01+ " - 	-r,   )rM   r   r  c                 p    [         R                  " U5      nU R                  [        R                  XSU0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(   rM   r   r  rD   s        r)   abort_multipart_upload BosClient.abort_multipart_upload3  s@      %%c*!!,"5"5{*5y)A " C 	Cr,   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   partNumberMarkerrO   r   )r(   rM   r   r  	max_partspart_number_markerrD   rP   s           r)   
list_partsBosClient.list_partsG  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  rD   )r   r   r  r  r:  next_part_number_marker)r(   rM   r   r  rD   r  rR   r<  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,   r0  s
   maxUploadss	   keyMarkerr.  rO   rH   )r(   rM   max_uploads
key_markerr2  r4  rD   rP   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)r8  N)r#  r2  r4  rD   r   )r$  uploadsr:  next_key_markerr   r   )r(   rM   r2  r4  rD   r#  rR   r<  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
US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_  )
partNumbereTagz'upload task success with partNumber={}!z&upload task failed with partNumber={}!)	r5   _loggerdebugrj  r  rL  rO  r  r  )r(   rM   
object_keyr  r  r  rz  r  r  uploadTaskHandler|  r_  rR   rc   s                 r)   _upload_taskBosClient._upload_task  s     %%''MMDKKKXY	11+9	M^ - 2 /H ) ))..  MMCJJ;WX 	MMBII+VWG	s   A B 
C'&CCc                 j   US:  d  US::  a  [        S5      e[        R                  R                  U5      nUS:  a  [        S5      eUb  US::  a  [        R
                  " 5       nUS-  S-  nX-  nX-  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US:  aR  X:  a  UnUR                  U R                  XUUUUUUXjU5      nUR                  U5        X-  nUU-  nUS-  nUS:  a  MR  [        U[        S	9  UR                  5       (       a&  [         R#                  S
5        U R%                  XUS9  g['        U5      U:w  a&  [         R#                  S5        U R%                  XUS9  gUR)                  S S9  U R+                  XUU5        g)zV
Multipart Upload file to bos

param chunk_size: part size , default part size is 5MB
i   r   zEchunk size is valid, it should be more than 0 and not nore than 5120!l       PC z'File size must not be more than 48.8TB!r	  i   )r  r   r  )return_whenz!putting super object is canceled!)r  Fzputting super object failed!c                     U S   $ )Nr-  r=   )xs    r)   r  6BosClient.put_super_obejct_from_file.<locals>.<lambda>  s    Q|_r,   )r   T)r   r  r  getsizemultiprocessing	cpu_countr   r  r  r   submitr3  rL  r	   r
   r5   r/  r0  r  r   sortr  )r(   rM   r   rz  
chunk_size
thread_numr2  r  r   r  r|  r_  rD   	left_sizer  
total_partr  executor	all_tasksr  r  r  	temp_tasks                          r)   put_super_obejct_from_file$BosClient.put_super_obejct_from_file  s      J!O ghhGGOOI.	11 IJJq'113:%,	+
 A%!OJ#/122;)+) 3 + ,59 	
 &j1		!m$%	t'8'8+IWbdm69.>S`bIY'"IiF1K !m 	YM2%%''MM=>''i'P^z)MM89''i'P45&&{INr,   )rM   r   rn   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  g)z
Set Access Control Level of object

:type bucket: string
:param bucket: None

:type acl: list of grant
:param acl: None
:return:
    **HttpResponse Class**
rt   ru   rg   r,   rw   Nr   )r(   rM   r   rn   rD   s        r)   set_object_aclBosClient.set_object_acl  sr     %%c*<++& $

,?+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  g)
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!r@  z5cann't get more than one object canned acl arguments!rg   r,   r   )
r   r   r   r   BOS_GRANT_READBOS_GRANT_FULL_CONTROLr   rI   r   rV   )	r(   rM   r   r   
grant_readgrant_full_controlrD   ry   num_argss	            r)   set_object_canned_aclBosClient.set_object_canned_acl/  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<++&#*#)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**
rg   r,   rO   r   r(   rM   r   rD   s       r)   get_object_aclBosClient.get_object_aclf  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**
rg   r,   rO   r   rT  s       r)   delete_object_aclBosClient.delete_object_acl|  sE     %%c*!!##} "  	r,   )rM   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  rI   r   rl  )r(   rM   r   rZ  
fetch_moder   rD   ry   s           r)   fetch_objectBosClient.fetch_object  s    0 %%c*171H1H1M--.!3=L//0$6CL223!!!! # "  	r,   )rM   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**
)rP  r  r   s   trues   false   symlinkr,   r   )r   r   r   r  r  r   BOS_SYMLINK_TARGETBOS_FORBID_OVERWRITEBOS_SYMLINK_BUCKETrI   r   rV   )r(   rM   r  ra  rb  rP  r   r  r  rD   ry   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,   )rM   ra  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**
rd  r,   rO   r   )r(   rM   ra  rD   r   s        r)   get_object_symlinkBosClient.get_object_symlink  sF     %%g.!!  "C( "  	r,   )rM   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selectRequestru   r,   )s   selects   typec                 0   > [         R                  XT5      $ rB   )r?   r  r  s     r)   r  )BosClient.select_object.<locals>.<lambda>	  s    	8W8W9:r,   )rx   ry   rP   rD   r]  )
r   r   SelectResponserI   r   rl  r{   r|   r?   rq   )r(   rM   r   rm  ry   rD   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,   rO   rH   rC   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maxCapacityMegaBytesry  r,   r  r  )r(   r|  r}  rD   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:
ry  r,   rO   r   rC   s     r)   delete_user_quotaBosClient.delete_user_quota<	  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,   rM   rP   rD   rH   rW   s      r)   get_notificationBosClient.get_notificationG	  s1     !!+#S)& " ; 	;r,   )rM   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,   rM   rx   rP   rD   r  )r(   rM   r  rD   s       r)   put_notificationBosClient.put_notificationW	  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   rW   s      r)   delete_notificationBosClient.delete_notificationi	  s2     !![/SVAW "  	r,   )rM   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:
bucketMirroringConfigurationru   	   mirroringr,   r  rI   r   rV   r{   r|   r?   rq   )r(   rM   r  rD   s       r)   put_bucket_mirroringBosClient.put_bucket_mirroringx	  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  rH   rW   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   rW   s      r)   delete_bucket_mirroring!BosClient.delete_bucket_mirroring	  s3     !!# #&	 "  	r,   c           
          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:
ru      taggingr,   )rM   r   rx   rP   rD   r  )r(   rM   r   obj_tag_argsrD   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,   )rM   r   ry   rP   rD   )r   r   r   BOS_TAGGINGrI   r   rV   )r(   rM   r   
tag_headerrD   ry   s         r)   put_object_tagging_canned#BosClient.put_object_tagging_canned	  sY     ,2,C,CJ,O(()!!#$ "  	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,   )rM   r   rP   rD   rH   rT  s       r)   get_object_taggingBosClient.get_object_tagging	  s6     !!#$ "  	r,   c           	          U R                  [        R                  U[        R                  " SU0[
        R                  S9SS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:
statusru   
   versioningr,   r  r  )r(   rM   r  rD   s       r)   put_bucket_versioningBosClient.put_bucket_versioning	  sL     !!#Xv.	8R8RS!3' "  	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  rH   rW   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-  r.  r/  r0  s   versionIdMarkerrO   rH   )	r(   rM   r1  r2  r3  version_markerr4  rD   rP   s	            r)   list_objects_versionsBosClient.list_objects_versions
  st    2 s#!): &9 &9 #,< %)7%&!!,"2"2KW]!^^r,   c           	      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  rI   r   rl  r{   r|   )r(   rM   retention_daysrD   s       r)   init_bucket_object_lock!BosClient.init_bucket_object_lock8
  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,   rO   rH   rW   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,   rO   r   rW   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,   rO   )rI   r   rl  rW   s      r)   complete_bucket_object_lock%BosClient.complete_bucket_object_lockk
  s2     !!,"3"3"-*?)E)/ " 1 	1r,   c           	      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(   rM   extend_retent_daysrD   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,   rO   rH   rW   s      r)   get_bucket_quotaBosClient.get_bucket_quota
  s1     !!,"2"2"-*2C)/ " 1 	1r,   c           	          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**
ru   r  r,   r  r  )r(   rM   
quota_confrD   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   rW   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,   rO   rH   rW   s      r)   get_bucket_taggingBosClient.get_bucket_tagging
  s2     !!,"2"2"-*4c):)/ " 1 	1r,   c           	          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**
ru   r  r,   r  r  )r(   rM   tag_confrD   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,   rO   r   rW   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  X=[        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[        R(                  U-   nUUU'   U[+        U5      -  nU[+        U5      -  nM     U[,        R.                  :  a  [        S[,        R.                  -  5      e[+        U5      [+        U5      :w  a  [        S5      eUb  Xm[        R0                  '   Ub'  [
        R                  " U5      U[        R2                  '   U	b'  [
        R                  " U	5      U[        R4                  '   U
b'  [
        R                  " U
5      U[        R6                  '   Ub   [8        R;                  XS5      nUb  X[        R>                  '   Ub'  [        R                  " U5      U[        R@                  '   U$ ! [<         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   r  r   r  r  r}   r   r  BCE_CONTENT_SHA256ETAGr   r\   dictrD  r   addr   rM  r   r   MAX_USER_METADATA_SIZEr  BOS_SERVER_SIDE_ENCRYPTION'BOS_SERVER_SIDE_ENCRYPTION_CUSTOMER_KEY+BOS_SERVER_SIDE_ENCRYPTION_CUSTOMER_KEY_MD5r?   r  r  r^  r  )ru  r  r  r  r  rP  r   r  r  r  r  r_  r  ry   	meta_sizemeta_data_setro   rp   normalized_keyrc   s                       r)   r  !BosClient._prepare_object_headers
  s    %.1"4 !IJJ393J3J>3ZGL//0"050P0PQ\0]GL,,-#161Q1QR^1_GL--.1C1P1PGL--.%7EL334)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$6CL223!?D?_?_`j?kGL;;<#00> LHHI '001AB LLLM ##44WER $6CL223%060G0G0WGL,,-  s   +L 
LLL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.)r\   r  rD  r   BOS_BASE_ALLOW_HEADERSunionr   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)ry   r  is_copybos_headersuser_headers_setro   rp   s          r)   r  BosClient._get_user_headerP  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      $ rB   )getattrrD   )r(   rD   attrr4   s       r)   r  BosClient._get_config_parameterj  s3    V*FMt{{D))r,   c                    U R                   nU(       a  U R                  n[        R                  " U R                   U R                  5      u  pVnU R
                  (       d6  [        R                  " U5      (       d  [        R                  " Xa5      (       a%  [        R                  " [        R                  U5      $ [        R                  " [        R                  X5      $ rB   )r   backup_endpointr   r   r   cname_enabledis_cname_like_hostis_custom_host
append_urir   
URL_PREFIX)rD   rM   r   use_backup_endpointhostr
  	host_namer  s           r)   r   BosClient._get_paths  s    ))D!!&//6??C 	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$ rB   )copyrD   merge_non_none_values_change_user_endpointr   )r(   rD   rM   
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   .   z<endpoint is not cname domain, please set cname_enabled=Falses   //r@  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_hostr   
check_ipv4path_style_enabler  r	  r   rm   HTTP_PROTOCOL_HEAD)r(   rD   rM   r
  user_host_namer  user_endpoint_splituser_endpointis_bos_path_style_hosthttp_head_splitbucket_endpoints              r)   r  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      (       a  g[        U [        5      (       aq  U R                  [        R
                  R                  :X  a  gU R                  [        R
                  R                  :X  a  gU R                  [        R                  :X  a  gg)NTF)
r\   IOErrorr   r^   r_   r`   INTERNAL_SERVER_ERRORSERVICE_UNAVAILABLEcodeREQUEST_EXPIRED)errors    r)   _need_retry_backup_endpoint%BosClient._need_retry_backup_endpoint  sq     eW%% e^,,  DKK$E$EE  DKK$C$CCzz^;;;r,   c	                    U R                  Xr5      n[        R                  XrU5      n	Uc  [        R                  nUR
                  b(  U=(       d    0 nUR
                  U[        R                  '    [        R                  " U[        R                  [        R                  U/XXEU5      $ ! [         a  n
UR                  c  U
e[        R                  U
R                   5      (       ak  ["        R%                  S5        [        R                  XrUS5      n	[        R&                  " U[        R                  [        R                  U/XXEUS5	      s S n
A
$ U
eS n
A
ff = f)Ns   Retry for backup endpoint.T)r   r?   r   r   
parse_jsonr   r   r   r   send_requestr   r  parse_errorr   r  r.  r]   r/  r0  send_request_no_underlined)r(   http_methodrM   r   rx   ry   rP   rD   r]  r  rc   s              r)   rI   BosClient._send_request  s/   
 ##F8""6<!,,K  ,mG7=7L7LGL334	"//**W-@-@+,N4&: : " 	%%-44Q\\BB;< **6TJ&AAM..1D1Dk0RtfdD D 	s%   18B* *
E4BEEEEr=   rB   )NNN)NN)  NNNN)NNNN)Nrf  N)i @  N)NNNNN)
NNNNNNNNNN)NNNNNNNNNNNN)NNNNNNNNNNNNN)NNNNNNNNNNNNNN)	   NNNNNNNN)NNNNNN)r7  NNNNN)F)NNF)NNNNNNN)r7   r8   r9   r:   r;   r*   rK   r   r   r   rS   rX   rd   rh   staticmethodrq   rB  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   rJ   r  r  r  r  r#  r&  r)  r5  r=  rG  rU  rc  ro  r  r  r  r  r  objectr   integer_typesr  r  r  r  r  r  r  r  r  r  r  r  rt  r  r  r  r  r  r  r  r$  r*  r3  rF  rI  rQ  rU  rX  r_  boolrh  rk  rv  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r  r.  rI   r<   r=   r,   r)   r?   r?   X   s   -	C 5#,', (,  5#,'P (P 5#,' (( 5#,' (   5#,T4L9* :*( 5#,59* :* 5#,'* (*" 5#,'
* (
* 5#,'	S (	S 5#,'* (*: 5#,'* (*  5#,'* (*  5#,'FZcg * (*. 5#,'* (*  5#,'* (*" 5#,$8* 9** 5#,'* (*  5#,'* (*  5#,T;* <*0 5#,'* (*, 5#,'* (*, 5#,'* (*, 5#,'* (* 5#,49* :*, 5#,5#,G* H* 5#,5#,G* H* 5#,'* (* 5#,'* (*. 5#,'* (*  5#,'* (* 5#,UCL9 +,6:(,'+04)-'++7+;+;EQ :EQN 5#,tTl; %)1 <1* 5#,'1 (1 5#,'1 (1 5#,4@  $1 A1( 5#,'1 (1 5#,'1 (1 5#,'HL "_ ("_H 5#,' (( C C    D 5#,UCL95 :5< 5#,UCL95 :52      5#,UCL9 : 5#,UCLUCLQQUSW-6 R-6` 5#,UCL9, :,( 5#,#,#11 #,	( !"&#'$(#'"&'+#'$( :(
:x 5#, %s|!&. /3)-/3041504/34804)-*.*X 5#,#,#11 #,	( !%"&!%!% $" $$(%)!%"&=(
=~ eS\s|5#,G+/,0.2-1-1,0*.,00415-1.2&*: H:x eS\s|s|L,0)-*.,0+/+/*.(,*..2/3+/,0$(? M?B %"'' !%"&"&!%-1"&#'&*B@	'B@H 5#,UCL90 :0( 5#,61 71& UCL"CL"CL* )-!%	1*1. 5#,'1 (1 5#,'1 (1 5#,UCL9 0404/3)-( :(T 5#,#,,, ?CGK;;z %"',,))+ #&*'+'+ $2+2h 5#,#,,,))+ SWQU+4 5#,#, 15/3)-	#-	#-J 5#,UCLUCLQC RC& 5#,UCLUCLQ6:d Rd@ 5#,UCLUCLQB RB( 5#,'OS6:&*%_ (%_N 5#,' (: /3( 5#,UCLUCLQQR!"@ R@D 5#,UCLtTlK* L*, 5#,UCL9#	4* :4*l 5#,UCL9 :* 5#,UCL9 :* 5#,UCLuclK$ L$L 5#,E3<%QTimoTXbf%* p%*P 5#,= >* 5#,UCLdXV# W#JJ sD7 E7&L 5#,'; (; 5#,th?; @;" 5#,' ( 5#,TH= >$ 5#,' ( 5#,' ( .2&& 5#,'MQ,0$_ ($_L 5#,4@  $1 A1( 5#,'1 (1 5#,'1 (1 5#,4@  $1 A1$ 5#,4@  $1 A1( 5#,4@  $1 A1 5#,4@  $1 A1( 5#,4@  $1 A1 5#,4@  $1 A1 5#,4@  $1 A1( 5#,4@  $1 A1 !O Od  2* 	B 	B*X    6:,0	r,   r?   c                   0    \ rS rSrSrS rS rS rS rSr	g)	SelectMessagei  z)
returned message from select object api
c                 6    SU l         Xl        X l        X0l        g)z
Initialize for record message
RecordsN)typery   payloadcrc)r(   ry   rC  rD  s       r)   set_record_message SelectMessage.set_record_message  s     	r,   c                 B    SU l         Xl        X l        X0l        X@l        g)z!
Initialize for continue message
ContN)rB  ry   bytes_scannedbytes_returnedrD  )r(   ry   rI  rJ  rD  s        r)   set_cont_messageSelectMessage.set_cont_message  s!     	*,r,   c                 *    SU l         Xl        X l        g)z
Initialize for end message
EndN)rB  ry   rD  )r(   ry   rD  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      $ )NrA  z{}
{}rH  z%{}
bytes_scanned/bytes_returned={}/{}z{})rB  rj  ry   rC  rI  rJ  r'   s    r)   __str__SelectMessage.__str__  su    99	!??4<<>>YY& ;BB4<<QUQcQc?C?R?RT T ;;t||,,r,   )rJ  rI  rD  ry   rC  rB  N)
r7   r8   r9   r:   r;   rE  rK  rO  rR  r<   r=   r,   r)   r?  r?    s    -r,   r?  c                   :    \ rS rSrSrS rS rS r\S 5       r	Sr
g)	rt  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)rR  rR   )r(   rR  rR   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  [        e! U R                   R	                  5         f = f7f)z
generator for SelectMessage
   z>Ir   r  zmessage-typerA     rH  z>QrN  z
error-codesuccesszerror-message)r+  
request_idT)rR  rV  r  StopIterationry  structunpack_parse_select_headersr?  rE  r   r   rK  r   rR   rO  bce_request_idrO  )r(   r}  prelude	total_lenheaders_lenry   headers_mapmsgpayload_lenrC  rD  rI  rJ  s                r)   r4   SelectResponse.result  s*     $	'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IA kkkB  $$&s   I;II I I88I;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>Hr@  )r   r`  ra  r   r   )ry   hmr   key_lenr   	value_lenvalues          r)   rb  $SelectResponse._parse_select_headersH  s     c'l"mmC	)BCAFGQJE1CEdG519,EFqIIQJE5#45EE060H0H0OBv'',- c'l" 	r,   )rV  rR  rR   N)r7   r8   r9   r:   r;   r*   r  r4   r9  rb  r<   r=   r,   r)   rt  rt    s+    !)'V  r,   rt  )>r;   r  r  http.clientr_   r  r{   loggingrw  r`  builtinsr   r   future.utilsr   r   r   concurrent.futuresr   r	   r
   r   r$   	functoolsr;  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   baidubce.utilsr   r   	getLoggerr7   r/  FETCH_MODE_SYNCFETCH_MODE_ASYNCr:  r  r   r?   r;  r?  rt  r=   r,   r)   <module>r     s    
   	       8 8 W W     -  ' 2 - - 1 ) ! , & & ! - / # 


H
%    4L. L.^\&-F &-PPV Pr,   