
    !jo                    d   d Z ddlmZmZmZmZ ddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlmZ ddlmZ ddlmZmZ ddlmZmZmZmZmZmZ ddlmZ dd	lmZ d
dl m!Z!m"Z" d
dl#m$Z$m%Z% d
dl&m'Z' d ej(                     d ej)                     de! de" Z*dZ+dZ,dZ-dZ.dZ/ ej0        d          Z1 ej0        dej2                  Z3 ej0        d          Z4 ej0        dej2                  Z5 ej0        dej2                  Z6 ej0        e/dz   ej2                  Z7 ej0        dej2                  Z8 ej0        e/ej2                  Z9 ej0        dej2                  Z:ee;ee;ee;         ee;         f         f         Z<	 	 	 dudvd&Z=	 	 	 dwdxd)Z>	 dydzd/Z?d{d3Z@d{d4ZAd|d6ZB G d7 d8e          ZC	 	 d}d~dAZDddCZE	 	 dddGZFddJZGddLZHddOZIddQZJddTZKddUZL	 	 	 	 	 ddd[ZMdd_ZNddaZOddeZPddjZQddlZR G dm dn          ZS G do dp          ZT G dq dre          ZU G ds dt          ZVdS )zHelper functions.    )absolute_importannotationsdivisionunicode_literalsN)datetime)Queue)BoundedSemaphoreThread)BinaryIODictListMappingTupleUnion)Protocol)HTTPHeaderDict   )	__title____version__)SseSseCustomerKey)to_iso8601utczMinIO (z; z) /i'  l        l        i  P z^(((bucket\.|accesspoint\.)vpce(-(?!_)[a-z_\d]+(?<!-)(?<!_))+\.s3\.)|((?!s3)(?!-)(?!_)[a-z_\d-]{1,63}(?<!-)(?<!_)\.)s3-control(-(?!_)[a-z_\d]+(?<!-)(?<!_))*\.|(s3(-(?!_)[a-z_\d]+(?<!-)(?<!_))*\.))z$^[a-z0-9][a-z0-9\.\-]{1,61}[a-z0-9]$z'^[a-z0-9][a-z0-9_\.\-\:]{1,61}[a-z0-9]$zm^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$zS^((?!-)(?!_)[a-z_\d-]{1,63}(?<!-)(?<!_)\.)*((?!_)(?!-)[a-z_\d-]{1,63}(?<!-)(?<!_))$z.*\.amazonaws\.com(|\.cn)$zF((?!s3)(?!-)(?!_)[a-z_\d-]{1,63}(?<!-)(?<!_)\.)*amazonaws\.com(|\.cn)$zc^(?!-)(?!_)[a-z_\d-]{1,63}(?<!-)(?<!_)\.(?!-)(?!_)[a-z_\d-]{1,63}(?<!-)(?<!_)\.elb\.amazonaws\.com$z)^((?!_)(?!-)[a-z_\d-]{1,63}(?<!-)(?<!_))$resourcestrsafeencoding
str | Noneerrorsreturnc                p    t           j                            | |||                              dd          S )z^
    Wrapper to urllib.parse.quote() replacing back to '~' for older python
    versions.
    )r   r   r   z%7E~)urllibparsequotereplace)r   r   r   r   s       W/lsinfo/ai/hellotax_ai/base_platform/venv/lib/python3.11/site-packages/minio/helpers.pyr%   r%   U   s@     <	   
 geS     queryc                &    t          | |||          S )zEncode query parameter value.)r%   )r*   r   r   r   s       r'   queryencoder,   g   s     h///r(   Fheaders*Mapping[str, str | list[str] | tuple[str]]
titled_keyboolc                l   g }|                                  D ]\  }}|r|                                n|}t          |t          t          f          r|n|gD ]J}|r*t          j        ddt          j        dd|                    n|}|                    | d|            Kd                    |          S )z*Convert HTTP headers to multi-line string.zCredential=([^/]+)zCredential=*REDACTED*zSignature=([0-9a-f]+)zSignature=*REDACTED*z: 
)	itemstitle
isinstancelisttupleresubappendjoin)r-   r/   valueskeyvalueitems         r'   headers_to_stringsr@   q   s    
 Fmmoo , ,
U'0ciikkkS'e}==JEEE7 	, 	,D
 	&26%'/1GNN   "&	 
 MMS**D**++++	, 99Vr(   object_sizeint	part_sizec                    |dk    r<|t           k     rt          d| d          |t          k    rt          d| d          | dk    r | t          k    rt          d|  d          dS |dk    rt          d          dS )	zValidate object and part size.r   z
part size z' is not supported; minimum allowed 5MiBz' is not supported; maximum allowed 5GiBobject size z' is not supported; maximum allowed 5TiBz<valid part size must be provided when object size is unknownN)MIN_PART_SIZE
ValueErrorMAX_PART_SIZEMAX_MULTIPART_OBJECT_SIZErA   rC   s     r'   _validate_sizesrK      s    1}}}$$OYOOO   }$$OYOOO   a222({ ( ( (   32
 
aJ
 
 	
 
r(   c                R   t          | |           | dk     r|dfS |dk    r-t          ||           }||rt          j        | |z            ndfS t          j        t          j        | t          z            t
          z            t
          z  }||rt          j        | |z            ndfS )2Compute part information for object and part size.r   r   )rK   minmathceilMAX_MULTIPART_COUNTrF   rJ   s     r'   _get_part_inforS      s    K+++Q"}1}}	;//		P$)K)$;<<<qPP		+ 3344}D I ILdii 78881LLr(   tuple[int, int]c           	         t          | |          \  }}|t          k    rt          d|  d| dt           d          ||fS )rM   rE   z and part size z make more than z parts for upload)rS   rR   rG   )rA   rC   
part_counts      r'   get_part_inforW      sx    *;	BBIz'''E; E Ey E E1E E E
 
 	
 j  r(   c                  "    e Zd ZdZd
dZddZd	S )ProgressTypez(typing stub for Put/Get object progress.object_namer   total_lengthrB   c                    dS )zSet process meta information.N )selfrZ   r[   s      r'   set_metazProgressType.set_meta         r(   lengthc                    dS )zSet current progress length.Nr]   )r^   ra   s     r'   updatezProgressType.update   r`   r(   N)rZ   r   r[   rB   )ra   rB   )__name__
__module____qualname____doc__r_   rc   r]   r(   r'   rY   rY      sB        22, , , ,+ + + + + +r(   rY   r(   streamr   size	part_databytesprogressProgressType | Nonec                    |t          |          z  }|ry|                     |          }|snat          |t                    st	          d          ||z  }|t          |          z  }|r"|                    t          |                     |y|S )z)Read part data of given size from stream.z!read() must return 'bytes' object)lenreadr5   rk   rG   rc   )rh   ri   rj   rl   datas        r'   read_part_datarr      s     	C	NND
 	'{{4   	$&& 	B@AAAT	D		 	'OOCII&&&  	' r(   pathc                    	 | rt          j        |            dS dS # t          $ rT}|j        t          j        k    r t           j                            |           st          d|  d          |Y d}~dS d}~ww xY w)z.Wrapper of os.makedirs() ignores errno.EEXIST.zpath z is not a directoryN)osmakedirsOSErrorerrnoEEXISTrs   isdirrG   )rs   excs     r'   rv   rv      s    I 	K	 	 I I I9$$w}}T"" 	I>T>>>??SH	I 	I 	I 	I 	I 	I	Is    
A:A	A55A:bucket_namestricts3_checkc                $    |r-t                                          st          d            n,t                                         st          d            t                                         rt          d  d          g d}t           fd|D                       rt          d  d          |r                     d          s*                     d          s                     d	          rt          d  d
          dS )zECheck whether bucket name is valid optional with strict check or not.zinvalid bucket name zbucket name z' must not be formatted as an IP address)z..z.-z-.c              3      K   | ]}|v V  	d S Nr]   ).0xr|   s     r'   	<genexpr>z$check_bucket_name.<locals>.<genexpr>   s(      
@
@1
@
@
@
@
@
@r(   z' contains invalid successive characterszxn--z-s3aliasz--ol-s3zJ must not start with 'xn--' and must not end with '--s3alias' or '--ol-s3'N)_BUCKET_NAME_REGEXmatchrG   _OLD_BUCKET_NAME_REGEX_IPV4_REGEXany
startswithendswith)r|   r}   r~   unallowed_successive_charss   `   r'   check_bucket_namer      s     C!''44 	CAKAABBB	C &++K88 	CAKAABBB%% - , , , , - - 	- "4!3!3

@
@
@
@%?
@
@
@@@ 2 1 1 1 1 2 2 	2 &""6**&   ,,&   ++	&  % % % % & & 	&& &r(   stringstr | bytesc                    	 |                                  st                      dS # t          $ r}t                      |d}~ww xY w)z(Check whether given string is not empty.N)striprG   AttributeError	TypeError)r   r{   s     r'   check_non_empty_stringr     sV    #||~~ 	,,	 	 # # #kks"#s   "& 
A?Apolicyc                z    t          | t          t          f          st          d          t	          |            dS )z
    Validate if policy is type str

    :param policy: S3 style Bucket policy.
    :return: True if policy parameter is of a valid type, 'string'.
    Raise :exc:`TypeError` otherwise.
    z policy must be str or bytes typeT)r5   r   rk   r   r   )r   s    r'   is_valid_policy_typer     s<     fsEl++ <:;;;6"""4r(   sseSseCustomerKey | Nonec                V    | r$t          | t                    st          d          dS dS )z(Check sse is SseCustomerKey type or not.zSseCustomerKey type is requiredN)r5   r   rG   r   s    r'   
check_ssecr     s>    
 <:c>22 <:;;;< < < <r(   
Sse | Nonec                V    | r$t          | t                    st          d          dS dS )zCheck sse is Sse type or not.zSse type is requiredN)r5   r   rG   r   s    r'   	check_sser   $  s>    
 1:c3'' 1/0001 1 1 1r(   rq   str | bytes | Nonec                T   | dS t          j        dd          }|                    t          | t                    r|                                 n|            t          j        |                                          }t          |t                    r|
                                n|S )z<Compute MD5 of data and return hash as Base64 encoded value.Nmd5F)usedforsecurity)hashlibnewrc   r5   r   encodebase64	b64encodedigestrk   decode)rq   hashermd5sums      r'   md5sum_hashr   *  s    |t [  F MM:dC#8#8B$++---dCCCfmmoo..F(77C6==???VCr(   c                *   | pd} t          j                    }|                    t          | t                    r|                                 n|            |                                }t          |t                    r|                                S |S )z=Compute SHA-256 of data and return hash as hex encoded value.r(   )	r   sha256rc   r5   r   r   	hexdigestrk   r   )rq   r   	sha256sums      r'   sha256_hashr   :  s    ;3D^F
MM:dC#8#8B$++---dCCC  ""I)U## "!!!r(   urlurllib.parse.SplitResultschemenetlocfragmentc                    t           j                            ||n| j        ||n| j        ||n| j        ||n| j        ||n| j                  S )z5Return new URL with replaced properties in given URL.)r#   r$   SplitResultr   r   rs   r*   r   )r   r   r   rs   r*   r   s         r'   url_replacer   E  sd     <##$#*$#* ch"	(cl  r(   metadataDictTypedict[str, list[str]]c                j    dddddfd	fd
| pi                                  D             S )z!Convert user metadata to headers.r=   r   r    c                ^    |                                                      d          sd| z   } | S )Nzx-amz-meta-zX-Amz-Meta-lowerr   r=   s    r'   normalize_keyz+_metadata_to_headers.<locals>.normalize_keyY  s/    yy{{%%m44 	&#%C
r(   c                    t          |           } 	 |                     d           n&# t          $ r}t          d|  d          |d }~ww xY w| S )Nzus-asciizunsupported metadata value z0; only US-ASCII encoded characters are supported)r   r   UnicodeEncodeErrorrG   )r>   r{   s     r'   	to_stringz'_metadata_to_headers.<locals>.to_string^  s~    E

	LL$$$$! 	 	 	Be B B B  	
 s   ' 
A
AA
r<   str | list[str] | tuple[str]	list[str]c                ^    t          | t          t          f          s| g} fd| D             S )Nc                &    g | ]} |          S r]   r]   )r   r>   r   s     r'   
<listcomp>zA_metadata_to_headers.<locals>.normalize_value.<locals>.<listcomp>l  s#    555U		%  555r(   )r5   r6   r7   )r<   r   s    r'   normalize_valuez-_metadata_to_headers.<locals>.normalize_valuei  s:    &4-00 	XF5555f5555r(   c                @    i | ]\  }} |           |          S r]   r]   )r   r=   r>   r   r   s      r'   
<dictcomp>z(_metadata_to_headers.<locals>.<dictcomp>n  sC       C 	cOOE22  r(   )r=   r   r    r   r    r   )r<   r   r    r   )r3   )r   r   r   r   s    @@@r'   _metadata_to_headersr   W  s       
	 	 	 	6 6 6 6 6 6
    #>r0022   r(   DictType | Nonec                     d  pi                                  D              d	dfd                                  D             } fd|D             }                     t          |                      S )
z?Normalize headers by prefixing 'X-Amz-Meta-' for user metadata.c                4    i | ]\  }}t          |          |S r]   )r   r   r=   r>   s      r'   r   z%normalize_headers.<locals>.<dictcomp>v  s$    III:3s3xxIIIr(   r=   r   r    r0   c                ^    |                                  } |                     d          p| dv  S )Nzx-amz-)zcache-controlzcontent-encodingzcontent-typezcontent-dispositionzcontent-languager   r   s    r'   guess_user_metadataz.normalize_headers.<locals>.guess_user_metadatax  s:    iikkNN8$$   	
 		
r(   c                2    i | ]\  }} |          ||S r]   r]   )r   r=   r>   r   s      r'   r   z%normalize_headers.<locals>.<dictcomp>  s@       !sEs##U  r(   c                :    g | ]}                     |          S r]   )pop)r   r=   r-   s     r'   r   z%normalize_headers.<locals>.<listcomp>  s%    333cS		333r(   )r=   r   r    r0   )r3   rc   r   )r-   user_metadata_r   s   `  @r'   normalize_headersr   t  s    II'-R1F1F1H1HIIIG
 
 
 
   %,]]__  M 	4333]333ANN'66777Nr(   tagsdict[str, str] | None
legal_holdc                T   t          |           } |                     |r|                                ni            d                    d |pi                                 D                       }|r|| d<   |r*|j        r#|j        | d<   t          |j                  pd| d<   |rd| d<   | S )	z&Generate headers for given parameters.&c                X    g | ]'\  }}t          |          d z   t          |          z   (S =r,   r   s      r'   r   zgenheaders.<locals>.<listcomp>  sF     	
 	
 	
U s"[%7%77	
 	
 	
r(   zx-amz-taggingzx-amz-object-lock-moder)   z#x-amz-object-lock-retain-until-dateONzx-amz-object-lock-legal-hold)r   rc   r-   r;   r3   moder   retain_until_date)r-   r   r   	retentionr   taggings         r'   
genheadersr     s      ((GNNC/3;;===R000hh	
 	
#zr0022	
 	
 	
 G  +#*  
Y^ 
,5N())566<" 	56  726./Nr(   hosthttpsregiontuple[dict | None, str | None]c                   t                               |           sdS t                              |           r;|                     dd          d                             d          d         }d|p|fS t                              |           sdS |                     d          rdS t                              |           st          d	|            t                              |           }|r|	                                nd}| d|         }d
|v r|st          d|            | |d                             d          }|d         dk    }|r
|dd         }d}|d         dvr|d         }|dd         }d
                    |          }	| dv rd}| dv rd}|	                    d          r+|                    d          s|s|st          d|            ||	|p||ddfS )z Extract AWS domain information. NNz.elb.amazonaws.comr   r   .rN   Nzec2-zinvalid Amazon AWS host zs3-accesspointzuse HTTPS scheme for host 	dualstackr)   )vpce	amazonawss3-external-1.amazonaws.comz	us-east-1)s3-us-gov-west-1.amazonaws.com#s3-fips-us-gov-west-1.amazonaws.comzus-gov-west-1.cns3-accelerate.z+region missing in Amazon S3 China endpoint )	s3_prefixdomain_suffixr   r   )_HOSTNAME_REGEXr   _AWS_ELB_ENDPOINT_REGEXsplit_AWS_ENDPOINT_REGEXr   _AWS_S3_ENDPOINT_REGEXrG   _AWS_S3_PREFIX_REGEXendr;   r   )
r   r   r   region_in_hostmatcherr  aws_s3_prefixtokensr   aws_domain_suffixs
             r'   _get_aws_infor	    s\      && |$$T** 0$8!<<Q?EEcJJ2Nf.//$$T** |v |!''-- <:D::;;;"((..G"
)'++---C#JM=(((<d<<===#$$Zc""Fq	[(I Nay---((,,,$ 7 7 7(""5)) 
""#344

 
 @$@@
 
 	
 (//#% % '+, ,r(   endpointc                   t           j                            |           }|j        }|j                                        dvrt          d          t          ||j                                                  }|j        r|j        dk    rt          d          t          |d          }|j	        rt          d          |j
        rt          d	          	 |j         n"# t          $ r}t          d
          |d}~ww xY w|j        rt          d          |j        rt          d          |j        dk    r|j        dk    s|j        dk    r|j        dk    rt          ||          }|S )zParse url string.)httpr   z(scheme in endpoint must be http or https)r   r   zpath in endpoint is not allowedr)   rs   z query in endpoint is not allowedz#fragment in endpoint is not allowedzinvalid portNz#username in endpoint is not allowedz#password in endpoint is not allowedr  P   r   i  r   )r#   r$   urlsplithostnamer   r   rG   r   rs   r*   r   portusernamepassword)r
  r   r   r{   s       r'   
_parse_urlr    s    ,


)
)C<D
z!222CDDD
c#*"2"2"4"4
5
5
5C
x <CHOO:;;;
c
#
#
#C
y =;<<<
| @>???2 2 2 2((c12 | @>???
| @>??? Z6!!ch"nnZ7""sx3#d+++Js   C   
C?*C::C?c                     e Zd ZU dZded<   ded<   ded<   ded	<   ded
<   d+dZed,d            Zed-d            Zed.d            Z	ed-d            Z
ed,d            Zej        d/d            Zed-d            Zej        d0d            Zed-d            Zej        d0d            Zed-d            Zej        d0d            Zed1d#            Zd2d$Z	 	 	 d3d4d*Zd%S )5BaseURLzBase URL of S3 endpoint.zdict | None	_aws_infor0   _virtual_style_flagr   _urlr   _region_accelerate_host_flagr
  r   r   c                   t          |          }|r,t                              |          st          d|           |j        pd}t          ||j        dk    |          \  | _        }| j        d up|                    d          | _	        || _
        |p|| _        d| _        | j        r9| j        d         | _        | j        d                             d          | _        d S d S )	Nzinvalid region r)   r   zaliyuncs.comFr   r   r   )r  _REGION_REGEXr   rG   r  r	  r   r  r   r  r  r  r  )r^   r
  r   r   r  r  s         r'   __init__zBaseURL.__init__  s    "" 	9---f55 	97v77888<%2)6cjG+V*5 *5& N$&K(*;*;N*K*K 	  	/%*"> 	>(3DL{+445EFF &&&	 	r(   r    c                    | j         S )zGet region.)r  r^   s    r'   r   zBaseURL.region1  s     |r(   c                "    | j         j        dk    S )zCheck if scheme is HTTPS.r   )r  r   r!  s    r'   is_httpszBaseURL.is_https6  s     y7**r(   c                    | j         j        S )zGet hostname.)r  r   r!  s    r'   r   zBaseURL.host;  s     yr(   c                    | j         duS )z Check if URL points to AWS host.Nr  r!  s    r'   is_aws_hostzBaseURL.is_aws_host@  s     ~T))r(   c                .    | j         r| j         d         ndS )zGet AWS S3 domain prefix.r   Nr&  r!  s    r'   r  zBaseURL.aws_s3_prefixE  s     /3nFt~k**$Fr(   r   c                    t                               |          st          d|           | j        r|| j        d<   dS dS )zSet AWS s3 domain prefix.zinvalid AWS S3 domain prefix r   N)r  r   rG   r  )r^   r   s     r'   r  zBaseURL.aws_s3_prefixJ  sX     $)))44 	JHYHHIII> 	4*3DN;'''	4 	4r(   c                    | j         S )zGet AWS accelerate host flag.r  r!  s    r'   accelerate_host_flagzBaseURL.accelerate_host_flagR  s     ))r(   flagc                    || _         dS )zSet AWS accelerate host flag.Nr+  r^   r-  s     r'   r,  zBaseURL.accelerate_host_flagW  s     &*"""r(   c                .    | j         r| j         d         ndS )z*Check if URL points to AWS dualstack host.r   Fr&  r!  s    r'   dualstack_host_flagzBaseURL.dualstack_host_flag\  s     /3nGt~k**%Gr(   c                ,    | j         r|| j         d<   dS dS )zSet AWS dualstack host.r   Nr&  r/  s     r'   r1  zBaseURL.dualstack_host_flaga  s*     > 	/*.DN;'''	/ 	/r(   c                    | j         S )"Check to use virtual style or not.r  r!  s    r'   virtual_style_flagzBaseURL.virtual_style_flagg  s     ''r(   c                    || _         dS )r4  Nr5  r/  s     r'   r6  zBaseURL.virtual_style_flagl  s     $(   r(   aws_infodictr   r|   enforce_path_stylec                &   |d         }|d         }| | }|dv rt          ||          S |}	d|v r2d|pdv rt          d| d	          |r|	                    d
dd          }	|d         r|	dz  }	d|vr|	|dz   z  }	|	|z  }	t          ||	          S ) Build URL for given information.r   r   r   r   r   r  zs3-accelerater   r)   zbucket name 'z1' with '.' is not allowed for accelerate endpointz-accelerater   r   z
dualstack.)r   rG   r&   )
clsr8  r   r|   r:  r   r   r   r   r   s
             r'   _build_aws_urlzBaseURL._build_aws_urlq  s    [)	 1,],, ; ; ; s40000i''{(b)) /K / / /   " >r1==K  	#l"F)++fsl"F-3v....r(   c                B   | j         s|S | j         d         }| j         d         }| | }|dv rt          ||          S |                    d          s|                    d          r d}|                    d          rdnd}d	| }t          || | d
|           S )zBuild URL for ListBuckets API.r   r   r=  r  zs3.zs3-r   r)   zamazonaws.comr   )r  r   r   r   )r^   r   r   r   r   r   	cn_suffixs          r'   _build_list_buckets_urlzBaseURL._build_list_buckets_url  s     ~ 	JN;/	7,],, ; ; ; s40000&& 	8)*>*>u*E*E 	8I!.!7!7!>!>FBI7I77M3)'MV'M'Mm'M'MNNNNr(   NmethodrZ   query_paramsr   c                   |s|rt          d|           t          | j        d          }g }t          |pi                                           D ]D\  }t          |t          t          f          r|n|g}|fdt          |          D             z  }Et          |d                    |                    }|s| 	                    ||          S |dk    r| r| p|od|v pd	|v o| j        j
        d
k    }	| j        r#t                              | j        |||	|          }|j        }
d}|	s| j        sd| }n| d	|
 }
|r,||                    d          rdndt#          |          z   z  }t          ||
|          S )r<  z"empty bucket name for object name r   r  c                R    g | ]#}t                     d t          |           $S r   r   )r   r>   r=   s     r'   r   z!BaseURL.build.<locals>.<listcomp>  sG        s##::k%&8&8::  r(   r   )r*   PUTlocationr   r   r)   )r   rs   )rG   r   r  sortedr3   r5   r6   r7   r;   rB  r   r  r  r?  r   r  r   r%   )r^   rC  r   r|   rZ   rD  r   r*   r<   r:  r   rs   r=   s               @r'   buildzBaseURL.build  s     	{ 	B[BB   $)#...!<#52"<"<">">?? 	 	KC)&4-@@NVVvhF    #F^^   EE #SXXe__555 	=//V<<< u_E[E5E A 8jL8A K?DI$4$? 	 > 	N(([2DfN NC  	/T%= 	/${$$DD#..f..F 	M4==--6RR3%:L:LLLD3vD9999r(   )r
  r   r   r   r    r   )r    r0   r   )r   r   )r-  r0   )r8  r9  r   r   r|   r   r:  r0   r   r   r    r   )r   r   r   r   r    r   )NNN)rC  r   r   r   r|   r   rZ   r   rD  r   r    r   )rd   re   rf   rg   __annotations__r  propertyr   r#  r   r'  r  setterr,  r1  r6  classmethodr?  rB  rJ  r]   r(   r'   r  r    sa        """"""   *    X + + + X+       X  * * * X* G G G XG 4 4 4 4 * * * X*  * * * ! * H H H XH / / /  /
 ( ( ( X( ( ( ( ( "/ "/ "/ ["/HO O O O8 '+&*,06: 6: 6: 6: 6: 6: 6:r(   r  c                      e Zd ZdZ	 	 dddZedd            Zedd            Zedd            Zedd            Z	edd            Z
edd            Zedd            ZdS )ObjectWriteResultz/Result class of any APIs doing object creation.Nr|   r   rZ   
version_idr   etaghttp_headersr   last_modifieddatetime | NonerH  c                h    || _         || _        || _        || _        || _        || _        || _        d S r   )_bucket_name_object_name_version_id_etag_http_headers_last_modified	_location)r^   r|   rZ   rR  rS  rT  rU  rH  s           r'   r  zObjectWriteResult.__init__  s>     ('%
)+!r(   r    c                    | j         S )zGet bucket name.)rX  r!  s    r'   r|   zObjectWriteResult.bucket_name         r(   c                    | j         S )zGet object name.)rY  r!  s    r'   rZ   zObjectWriteResult.object_name  r`  r(   c                    | j         S )zGet version ID.)rZ  r!  s    r'   rR  zObjectWriteResult.version_id  s     r(   c                    | j         S )z	Get etag.)r[  r!  s    r'   rS  zObjectWriteResult.etag  s     zr(   c                    | j         S )zGet HTTP headers.)r\  r!  s    r'   rT  zObjectWriteResult.http_headers  s     !!r(   c                    | j         S )zGet last-modified time.)r]  r!  s    r'   rU  zObjectWriteResult.last_modified  s     ""r(   c                    | j         S )zGet location.)r^  r!  s    r'   rH  zObjectWriteResult.location  s     ~r(   r   )r|   r   rZ   r   rR  r   rS  r   rT  r   rU  rV  rH  r   r   rK  )r    r   )r    rV  )rd   re   rf   rg   r  rM  r|   rZ   rR  rS  rT  rU  rH  r]   r(   r'   rQ  rQ    s       99 .2#'" " " " "$ ! ! ! X! ! ! ! X!       X     X " " " X" # # # X#    X  r(   rQ  c                       e Zd ZdZd	dZd ZdS )
Workerz1 Thread executing tasks from a given tasks queue tasks_queuer   results_queueexceptions_queuec                    t          j        | d           || _        || _        || _        |                                  d S )NT)daemon)r
   r  _tasks_queue_results_queue_exceptions_queuestart)r^   ri  rj  rk  s       r'   r  zWorker.__init__#  sB     	T****'+!1

r(   c                   	 | j                                         }|s| j                                          dS | j                                        rv|\  }}}}	  ||i |}| j                            |           n1# t          $ r$}| j                            |           Y d}~nd}~ww xY w |             n#  |             w xY w| j                                          )z- Continuously receive tasks and execute them TN)rn  get	task_donerp  emptyro  put	Exception)r^   taskfuncargskargscleanup_funcresultexs           r'   runz
Worker.run/  s   	*$((**D !++--- %++-- 	#26/dE<#!T41511F'++F3333  3 3 3*..r222222223 !LNNNNLLNNNN'')))%	*s0   "A< ;B8 <
B*B% B8 %B**B8 8CN)ri  r   rj  r   rk  r   )rd   re   rf   rg   r  r  r]   r(   r'   rh  rh     s=        ;;
 
 
 
* * * * *r(   rh  c                  b    e Zd ZU dZded<   ded<   ded<   ded<   ded	<   ddZd Zd ZddZdS )
ThreadPoolz. Pool of threads consuming tasks from a queue r   ro  rp  rn  r	   _semrB   _num_threadsnum_threadsc                    t                      | _        t                      | _        t                      | _        t	          |          | _        || _        d S r   )r   ro  rp  rn  r	   r  r  )r^   r  s     r'   r  zThreadPool.__init__N  sC    #gg!&!GG$[11	'r(   c                    | j                                          | j         j        }| j                            ||||f           dS )a  
        Add a task to the queue. Calling this function can block
        until workers have a room for processing new tasks. Blocking
        the caller also prevents the latter from allocating a lot of
        memory while workers are still busy running their assigned tasks.
        N)r  acquirereleasern  rv  )r^   ry  rz  r{  r|  s        r'   add_taskzThreadPool.add_taskU  sH     		y(tT5,?@@@@@r(   c                t    t          | j                  D ]"}t          | j        | j        | j                   #dS )z Prepare threads to run tasksN)ranger  rh  rn  ro  rp  r^   r   s     r'   start_parallelzThreadPool.start_parallel`  sM    t()) 	 	A!4#68N   	 	r(   r    c                   t          | j                  D ]}| j                            d           | j                                         | j                                        s| j                                        | j        S )z8 Stop threads and return the result of all called tasks N)	r  r  rn  rv  r;   rp  ru  rs  ro  r  s     r'   r}  zThreadPool.resultg  s     t()) 	( 	(A!!$''''    %++-- 	/(,,...""r(   N)r  rB   )r    r   )	rd   re   rf   rg   rL  r  r  r  r}  r]   r(   r'   r  r  F  s         88( ( ( (	A 	A 	A  # # # # # #r(   r  )r   NN)
r   r   r   r   r   r   r   r   r    r   )r)   NN)
r*   r   r   r   r   r   r   r   r    r   )F)r-   r.   r/   r0   r    r   )rA   rB   rC   rB   )rA   rB   rC   rB   r    rT   )r(   N)
rh   r   ri   rB   rj   rk   rl   rm   r    rk   )rs   r   )FF)r|   r   r}   r0   r~   r0   )r   r   )r   r   )r   r   )r   r   )rq   r   r    r   )rq   r   r    r   )NNNNN)r   r   r   r   r   r   rs   r   r*   r   r   r   r    r   )r   r   r    r   )r-   r   r    r   )
r-   r   r   r   r   r   r   r0   r    r   )r   r   r   r0   r   r   r    r   )r
  r   r    r   )Wrg   
__future__r   r   r   r   r   rx   r   rP   ru   platformr8   urllib.parser#   r   queuer   	threadingr	   r
   typingr   r   r   r   r   r   typing_extensionsr   urllib3._collectionsr   r)   r   r   r   r   r   timer   systemmachine_DEFAULT_USER_AGENTrR   rI   rH   rF   _AWS_S3_PREFIXcompiler   
IGNORECASEr   r   r   r   r  r   r  r  r   r   r%   r,   r@   rK   rS   rW   rY   rr   rv   r   r   r   r   r   r   r   r   r   r   r   r	  r  r  rQ  rh  r  r]   r(   r'   <module>r     s  "   O O O O O O O O O O O O     				  				                 . . . . . . . . > > > > > > > > > > > > > > > > & & & & & & / / / / / / $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $      !oho ! !#38#3#5#5 ! !! !! ! 
  9 &;  RZ GHH #$N$&M3 3 bj;< < "*0M  !bj!>NN # M	  
 %"* M	  
 "rz."-@@ 
G=* * U3S	5:5667
 #!	    ( #!	0 0 0 0 0 !    $
 
 
 
0M M M M"! ! ! !+ + + + +8 + + + (,	    *
I 
I 
I 
I & & & & &D# # # #    < < < <1 1 1 1D D D D     "! #    $   :   :   8:, :, :, :,z' ' ' 'TP: P: P: P: P: P: P: P:f6 6 6 6 6 6 6 6r#* #* #* #* #*V #* #* #*L,# ,# ,# ,# ,# ,# ,# ,# ,# ,#r(   