o
    پi=                  
   @   s  U 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Zd dl	Z
d dlmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlZd dlZd dlmZ dZdZdZ dZ!dZ"d	Z#d
Z$dZ%d Z&dZ'dZ(dZ)dZ*ddgZ+e, Z-e$e%dfde.de.de.dee. fddZ/G dd dZ0G dd dZ1de2de2de2de2fdd Z3G d!d" d"e4Z5de6deee2 ee2 f fd#d$Z7d%d&deee2 ee2 ee2 f fd'd(Z8G d)d* d*e5Z9G d+d, d,e9Z:G d-d. d.e9Z;G d/d0 d0e9Z<G d1d2 d2e9Z=G d3d4 d4eZ>G d5d6 d6eZ?G d7d8 d8Z@e@ee d9ZAG d:d; d;ZBG d<d= d=ZCi ZDee2ee.eEf f eFd>< d?e2deEfd@dAZGG dBdC dCe4ZHdDedEejdFeEdGe.de6f
dHdIZIdJeBdKeg e0f dd&fdLdMZJG dNdO dOejKZLdPedefdQdRZMG dSdT dTZNG dUdV dVejOZPG dWdX dXejQZRdYede6fdZd[ZSdod\eeE d]eeE de2fd^d_ZTd`e2de2fdadbZUdce2dde2de2fdedfZVdJeBdge2deEfdhdiZWeG djdk dkeZXee2eXdlf ZYd`eYde2fdmdnZZdS )p    N)AnyCallableDictIteratorListMapping
NamedTupleOptionalProtocolSequenceTupleUnionruntime_checkable)_xmli       
   i   i,  iX  g?g      N@      zhttps://storage.googleapis.com)i    i  i    i  z*[SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MAC]z('Connection aborted.',initialmaximum
multiplierreturnc                 c   s2    dV  | }	 |t   V  ||9 }||kr|}qNr   )rngrandom)r   r   r   base r   D/home/ubuntu/.local/lib/python3.10/site-packages/blobfile/_common.pyexponential_sleep_generator=   s   r    c                   @   sz   e Zd ZdZdddddefdededeeeef  deeeef  d	ed
e	de
e de
e ddfddZdefddZdS )Requestz/
    A struct representing an HTTP request
    NT)   methodurlparamsheadersdatapreload_contentsuccess_codesretry_codesr   c	           	      C   s4   || _ || _|| _|| _|| _|| _|| _|| _d S N)r#   r$   r%   r&   r'   r(   r)   r*   )	selfr#   r$   r%   r&   r'   r(   r)   r*   r   r   r   __init__P   s   
zRequest.__init__c                 C      d| j  d| j d| j dS )Nz<Request method=z url=z params=>)r#   r$   r%   r,   r   r   r   __repr__e      zRequest.__repr__)__name__
__module____qualname____doc__DEFAULT_RETRY_CODESstrr	   r   r   boolr   intr-   r1   r   r   r   r   r!   K   s8    

r!   c                   @   s2   e Zd ZdZdedededdfddZd	d
 ZdS )FileBodyzq
    A struct for referencing a section of a file on disk to be used as the `data` property
    on a Request
    pathstartendr   Nc                 C   s   || _ || _|| _d S r+   r<   r=   r>   )r,   r<   r=   r>   r   r   r   r-   o   s   
zFileBody.__init__c                 C   r.   )Nz<FileBody path=z start=z end=r/   r?   r0   r   r   r   r1   t   r2   zFileBody.__repr__)r3   r4   r5   r6   r8   r:   r-   r1   r   r   r   r   r;   i   s    r;   base_urltemplater'   c                 K   s>   i }|  D ]\}}tjj|dd||< q| |jdi | S )N )safer   )itemsurllibparsequoteformat)r@   rA   r'   escaped_datakvr   r   r   	build_urlx   s   rL   c                       s*   e Zd ZdZdedef fddZ  ZS )Errorz#Base class for blobfile exceptions.messageargsc                    s   || _ t j|g|R   d S r+   )rN   superr-   )r,   rN   rO   	__class__r   r   r-      s   zError.__init__)r3   r4   r5   r6   r8   r   r-   __classcell__r   r   rQ   r   rM      s    rM   c                 C   s   |  dr#zt| }|d d |d dfW S  ty"   Y dS w |  drDzt| }t|d |dfW S  tyC   Y dS w dS )	Ns   ﻿<?xmlrM   CodeMessage   {errorerror_descriptionNN)
startswithxmlrF   get	Exceptionjsonloadsr8   )r'   resultr   r   r   _extract_error   s"   



ra   responseurllib3.BaseHTTPResponsec                 C   sN   d }d }d }| j d urt| j \}}| jr"ddd | j D }|||fS )N, c                 s   s"    | ]\}}| d | V  qdS )z: Nr   ).0headervaluer   r   r   	<genexpr>   s     z/_extract_error_from_response.<locals>.<genexpr>)r'   ra   r&   joinrD   )rb   errerr_descerr_headersr   r   r   _extract_error_from_response   s   

rm   c                       sv   e Zd ZdZ	ddedededee dee dee f fd	d
ZdefddZe	dede
dddefddZ  ZS )RequestFailurezA
    A request failed, possibly after some number of retries
    NrN   request_stringresponse_statusrW   rX   error_headersc                    sB   || _ || _|| _|| _|| _t || j | j| j| j| j d S r+   )ro   rp   rW   rX   rq   rP   r-   )r,   rN   ro   rp   rW   rX   rq   rQ   r   r   r-      s   	zRequestFailure.__init__r   c                 C   s4   d| j  d| j d| j d| j d| j d| j S )Nzmessage=z
, request=z	, status=z, error=z, error_description=z, error_headers=rN   ro   rp   rW   rX   rq   r0   r   r   r   __str__   s   zRequestFailure.__str__requestrb   rc   c                 C   s(   t |\}}}| |t||j|||dS )Nrr   )rm   r8   status)clsrN   rt   rb   rj   rk   rl   r   r   r   create_from_request_response   s   z+RequestFailure.create_from_request_responser+   )r3   r4   r5   r6   r8   r:   r	   r-   rs   classmethodr!   r   rw   rS   r   r   rQ   r   rn      s6    rn   c                   @      e Zd ZdZdS ) RestartableStreamingWriteFailurezo
    A streaming write failed in a permanent way that requires restarting from the beginning of the stream
    Nr3   r4   r5   r6   r   r   r   r   rz          rz   c                   @   ry   )ConcurrentWriteFailurez9
    A write failed due to another concurrent writer
    Nr{   r   r   r   r   r}      r|   r}   c                   @   ry   )DeadlineExceededz7
    A read failed after the deadline was exceeded
    Nr{   r   r   r   r   r~      r|   r~   c                   @   ry   )VersionMismatchza
    A write failed due to a version mismatch, using ETag for azure or generation for gcloud
    Nr{   r   r   r   r   r      r|   r   c                   @   s>   e Zd ZU eed< eed< eed< ee ed< ee ed< dS )Statsizemtimectimemd5versionN)r3   r4   r5   r:   __annotations__floatr	   r8   r   r   r   r   r      s   
 r   c                   @   s:   e Zd ZU eed< eed< eed< eed< ee ed< dS )DirEntryr<   nameis_diris_filestatN)r3   r4   r5   r8   r   r9   r	   r   r   r   r   r   r     s   
 r   c                   @   sZ   e Zd ZdededdfddZdejfddZdee	e
f fd	d
Zde
ddfddZdS )PoolDirectorconnection_pool_max_sizemax_connection_pool_countr   Nc                 C   s&   || _ || _d | _d | _t | _d S r+   )r   r   pool_managercreation_pid	threadingLocklock)r,   r   r   r   r   r   r-     
   zPoolDirector.__init__c                 C   sf   | j & | jd u s| jt krt | _tj| j| jd| _| jW  d    S 1 s,w   Y  d S )N)maxsize	num_pools)	r   r   r   osgetpidurllib3PoolManagerr   r   r0   r   r   r   get_http_pool  s   
$zPoolDirector.get_http_poolc                 C   s   dd | j  D S )Nc                 S   s   i | ]\}}|d vr||qS ))r   r   r   )re   rJ   rK   r   r   r   
<dictcomp>$  s    z-PoolDirector.__getstate__.<locals>.<dictcomp>)__dict__rD   r0   r   r   r   __getstate__#  s   zPoolDirector.__getstate__statec                 C   s&   | j |d |d d | j| d S )Nr   r   r   r   )r-   r   update)r,   r   r   r   r   __setstate__&  s
   zPoolDirector.__setstate__)r3   r4   r5   r:   r-   r   r   r   r   r8   r   r   r   r   r   r   r   r     s
    r   r   c                &   @   s   e Zd Zdeegdf dedededededed	ee d
ee dee dededeeg ej	f  dededeeg ee
 f  dededdf&ddZdej	fddZdS )Configlog_callbackNr   r   azure_write_chunk_sizegoogle_write_chunk_sizeretry_log_thresholdretry_common_log_thresholdretry_limitconnect_timeoutread_timeoutoutput_az_paths&use_azure_storage_account_key_fallbackr   use_streaming_readdefault_buffer_sizeget_deadlinesave_access_token_to_diskmultiprocessing_start_methodr   c                 C   s   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
|| _|| _|| _|| _|| _|| _|d u rC|tks?|tkrC|d || _d S )Nzwarning: max_connection_pool_count and connection_pool_max_size are no longer supported, set get_http_pool instead if you want to control http pooling)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   !DEFAULT_MAX_CONNECTION_POOL_COUNT DEFAULT_CONNECTION_POOL_MAX_SIZE_get_http_pool)r,   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r-   8  s0   
zConfig.__init__c                 C   s   | j d u r	t S |   S r+   )r   global_pool_directorr   r0   r   r   r   r   i  s   
zConfig.get_http_pool)r3   r4   r5   r   r8   r:   r	   r9   r   r   r   r-   r   r   r   r   r   r   7  sR    	

1r   c                   @   sl   e Zd ZdZdedededdfddZdefd	d
Zej	fdededdfddZ
ddee defddZdS )WindowedFilez<
    A file object that reads from a window into a file
    fr=   r>   r   Nc                 C   s&   || _ || _|| _d| _| d d S )Nr   )_f_start_end_posseek)r,   r   r=   r>   r   r   r   r-   u  r   zWindowedFile.__init__c                 C   s   | j | j S r+   )r   r   r0   r   r   r   tell|  s   zWindowedFile.telloffsetwhencec                 C   sL   | j | }|tjkr| j |  kr| jk sJ  J | j|| || _d S r+   )r   ioSEEK_SETr   r   r   r   )r,   r   r   new_posr   r   r   r     s   
*
zWindowedFile.seeknc                 C   s   | j | jksJ |d u r| j| j  }t|| j| j  }| j|}|  j t|7  _ |dkr8t|dkr8td| j | jks@J |S )Nr   z0failed to read expected amount of data from file)r   r   minr   readlenrM   )r,   r   bufr   r   r   r     s   zWindowedFile.readr+   )r3   r4   r5   r6   r   r:   r-   r   r   r   r   r	   r   r   r   r   r   r   p  s    r   _hostname_check_cachehostnamec                 C   sZ   dt dtfdd}t }| tv rt|  d |krt|  d S || }|d |ft| < |S )Nr   r   c                 S   s   zt j| d t jd W tS  t jyM } z4|jt jkr#tW  Y d }~S zt jdd t jd W n t jy@   t Y W  Y d }~S w tW  Y d }~S d }~ww )N)familyzwww.bing.com)	socketgetaddrinfoAF_INETgaierrorerrno
EAI_NONAMEHOSTNAME_STATUS_UNKNOWNHOSTNAME_DOES_NOT_EXISTHOSTNAME_EXISTS)r   er   r   r   inner  s   z_check_hostname.<locals>.innerr   r   r   )r8   r:   timer   )r   r   nowretr   r   r   _check_hostname  s   r   c                   @   s   e Zd ZdS )TimeoutN)r3   r4   r5   r   r   r   r   r     s    r   fpsocknbytes_to_readdeadlinec           
      C   s   |t    }|dkrtd|| z|  }W n tjy%   tdw t|}t|}||d t|< t|}||k rq|t    }|dkrLtd|| z|	||d  }	W n tjyh   tdw ||	7 }||k s>t
|S )Nr   z1Did not read enough bytes before deadline expiredzTimed out waiting for read)r   r   
settimeoutpeekr   timeout	bytearray
memoryviewr   	recv_intobytes)
r   r   r   r   r   initial_datar   mvnbytes_readr   r   r   r   _read_with_deadline  s4   


r   conf	build_reqc                 C   sr  t t D ].\}}| }|j}|jd ur't|jdkr'|dtj|j 7 }d }t|j	t
rBt|j	jd}t||j	j|j	jd}n|j	}|j}d }	d }
| jd ur|jdkr|  }	|	d ur|sdJ dd}t }||	krtjd|tjjdtd	d
d|	| }
d }zrz|  j|j||j|tj| j| j |
d|ddd}|	d ur|j!ddkr|j	 nB|j"j#}|j$j%}zt&||t'|jd |	d}|(  tjj|j)|j|d}W n ty } z|*  tjd| ||dd }~ww |j)|j+v r|W W |d ur	|*    S   S d|j) }t,}|-t.r;|j)dv r%|d7 }n)|j)dkr0|d7 }n|j)dkr:|d7 }n|j)dkrN|j!ddkrNt/}d}|j|||d}|j)|j0vr_|W n tj1j2tj1j3tj1j4tj1j5t6j5fy } zrt|tj1j7rtj8|j}|j9d usJ |j9:drt;|j9t<krtjjt=td	d
}|j)|j+v r|W  Y d }~W |d ur|*    S   S t,jd ||d!|t,jd| |tjjdtd	d
d}W Y d }~nd }~ww W |d ur|*  n|d ur|*  w w | j>d ur|| j>kr||t?| t@|kr/| Ad"| d#| d$| d%|d&d'	 tB| qJ d())Nr   ?rbr=   r>   HEADz9preload_content must be set to True when using a deadlineFz(refusing to send request due to deadline    )ru   body)rN   rt   rb   )connectr   total)r#   r$   r&   r   r   r(   retriesredirectzTransfer-EncodingchunkedzContent-Length)r   r   r   r   )ru   r&   r   zrequest failed with exception zunexpected status )r   r   z: if you are writing a blob this error may be due to multiple concurrent writers - make sure you are not writing to the same blob from multiple processes simultaneouslyi  z: no valid credentials were found, please login with 'gcloud auth application-default login' or else set the 'GOOGLE_APPLICATION_CREDENTIALS' environment variable to the path of a JSON format service account keyi  z: credentials were found but do not grant access to this resource, please make sure the account you are using (either via 'gcloud auth application-default login' or the 'GOOGLE_APPLICATION_CREDENTIALS' environment variable) has accessi  zx-ms-error-codeConditionNotMetzetag mismatchz.blob.core.windows.netzhost does not exist)rt   rb   error z when executing http request 	 attempt , sleeping for .1f seconds before retryingunreachable)C	enumerater    r$   r%   r   rE   rF   	urlencode
isinstancer'   r;   openr<   r   r=   r>   r(   r   r#   r   r~   rw   r   rb   HTTPResponser   BytesIOr   rt   r&   r   r   r   r\   _fpr   raw_sockr   r:   release_connru   closer)   rn   rZ   GCP_BASE_URLr   r*   
exceptionsConnectTimeoutErrorReadTimeoutErrorProtocolErrorSSLErrorsslNewConnectionErrorurlparser   endswithr   r   INVALID_HOSTNAME_STATUSr   get_log_threshold_for_errorr8   r   sleep)r   r   attemptbackoffreqr$   r   r   r(   r   total_timeoutr   rj   respr   r   r   rN   error_class	fake_respr   r   r   execute_request  s  




B




-

r   c                       s&   e Zd Zdedef fddZ  ZS )TupleEncoderor   c                    s&   dt dt f fdd t  |S )Nitemr   c                    sT   t | tr
d| dS t | tr fdd| D S t | tr( fdd|  D S | S )NT)	__tuple__rD   c                    s   g | ]} |qS r   r   )re   r   hint_tuplesr   r   
<listcomp>  s    z<TupleEncoder.encode.<locals>.hint_tuples.<locals>.<listcomp>c                    s   i | ]	\}}| |qS r   r   )re   keyrg   r%  r   r   r     s    z<TupleEncoder.encode.<locals>.hint_tuples.<locals>.<dictcomp>)r  tuplelistdictrD   )r#  r%  r   r   r&    s   



z(TupleEncoder.encode.<locals>.hint_tuples)r   rP   encode)r,   r"  rQ   r%  r   r,    s   
zTupleEncoder.encode)r3   r4   r5   r   r,  rS   r   r   rQ   r   r!    s    r!  objc                 C   s   d| v r
t | d S | S )Nr$  rD   )r)  )r-  r   r   r   hinted_tuple_hook  s   r.  c                   @   sp   e Zd ZdZdeeegeeef f de	ddfddZ
dd	 Zd
ee	gdf fddZdededefddZdS )TokenManagerz7
    Automatically refresh tokens when they expire
    get_token_fnr   r   Nc                 C   sL   || _ i | _i | _t | _tjd| d| _	tjd| d| _
d S )Nz~/.blobfile/z_tokens.lockz_tokens.json)_get_token_fn_tokens_expirationsr   r   _lockr   r<   
expanduser_access_lock_file_access_token_file)r,   r0  r   r   r   r   r-     s   
zTokenManager.__init__c                 C   s   t j| jrLt| j6}tj|td}t|d |d D ]	\}}|| j	|< qt|d |d D ]	\}}|| j
|< q0W d    d S 1 sEw   Y  d S d S )N)object_hook
token_keystoken_valuesexpiration_keysexpiration_values)r   r<   existsr7  r  r^   loadr.  zipr2  r3  )r,   r   tokensr(  rg   r   r   r   _load_token_file  s   "zTokenManager._load_token_filer   c                 C   s  t jt j| jdd zltj| jddY t jt j| jdd | jd }t|d*}|	t
 t| j t| j t| j t| j d W d    n1 sYw   Y  t || j W d    W d S 1 sqw   Y  W d S  tjy   |d Y d S w )	NT)exist_okr   )r   z.tmpw)r9  r:  r;  r<  z>Another instance of this application currently holds the lock.)r   makedirsr<   dirnamer6  filelockFileLockr7  r  writer!  r,  r*  r2  keysvaluesr3  replacer   )r,   r   tmp_pathr   r   r   r   _save_token_file  s*   
&zTokenManager._save_token_filer   r(  c                 C   s   | j k t }| j|}|d u s|t |kr[|jrD|   | j|}|d u s/|t |krC| ||\| j|< | j|< | 	|j
 n| ||\| j|< | j|< | j| d us[J || jv sbJ | j| W  d    S 1 sqw   Y  d S r+   )r4  r   r3  r\   EARLY_EXPIRATION_SECONDSr   rA  r1  r2  rM  r   )r,   r   r(  r   
expirationr   r   r   	get_token  s    $zTokenManager.get_token)r3   r4   r5   r6   r   r   r   r   r   r8   r-   rA  rM  rP  r   r   r   r   r/    s    *	r/  c                       s   e Zd ZdededdfddZdededdfd	d
Zd"dededefddZ	d# fddZ
defddZdefddZdedefddZdedefddZdejfddZd$dedefddZdedefd d!Z  ZS )%BaseStreamingWriteFiler   
chunk_sizer   Nc                 C   s   d| _ t | _|| _|| _d S r   )_offsetr   _buf_chunk_size_conf)r,   r   rR  r   r   r   r-     s   
zBaseStreamingWriteFile.__init__chunkfinalizec                 C      t r+   NotImplementedError)r,   rW  rX  r   r   r   _upload_chunk     z$BaseStreamingWriteFile._upload_chunkFr   c                 C   sj   |rt |}nt || j | j }|dksJ z|d | }| || |  jt |7  _W ~~|S ~~w r   )r   rU  r\  rS  )r,   r   rX  r   rW  r   r   r   _upload_buf  s   
z"BaseStreamingWriteFile._upload_bufc                    sF   | j rd S | jt| jdd}|t| jksJ t | _t   d S )NT)rX  )closedr^  r   rT  r   r   rP   r  r,   r   rQ   r   r   r    s   zBaseStreamingWriteFile.closec                 C   s   | j t| j S r+   )rS  r   rT  r0   r   r   r   r     s   zBaseStreamingWriteFile.tellc                 C      dS NTr   r0   r   r   r   writable  r]  zBaseStreamingWriteFile.writablebc                 C   s   t | jdkr!t || jkr!t|}| |}t||d  | _n(|  j|7  _t | j| jkrIzt| j}| |}t||d  | _W ~n~w t | j| jk sSJ t |S r   )r   rT  rU  r   r^  r   )r,   rd  r   r   r   r   r   rH    s   


zBaseStreamingWriteFile.writec                 C   
   t dNznot readabler   UnsupportedOperationr,   rd  r   r   r   readinto     
zBaseStreamingWriteFile.readintoc                 C   re  )Nzno underlying raw streamrg  r0   r   r   r   detach  rk  zBaseStreamingWriteFile.detachr   r   c                 C   re  rf  rg  r`  r   r   r   read1  rk  zBaseStreamingWriteFile.read1c                 C   re  rf  rg  ri  r   r   r   	readinto1   rk  z BaseStreamingWriteFile.readinto1)Fr   N)r   )r3   r4   r5   r   r:   r-   r   r9   r\  r^  r  r   rc  r   rH  r   rj  r   	RawIOBaserl  rm  rn  rS   r   r   rQ   r   rQ    s    
rQ  c                	       s   e Zd Zdedededdf fddZ	dded	ed
ee ddfddZ	de
fddZdedee fddZejfdededefddZdefddZd  fddZdefddZdefddZ  ZS )!BaseStreamingReadFiler   r<   r   r   Nc                    s>   t    || _|| _|| _d| _d | _d| _d| _d| _	d S r   )
rP   r-   rV  _size_pathrS  r   requestsfailures
bytes_read)r,   r   r<   r   rQ   r   r   r-   %  s   

zBaseStreamingReadFile.__init__	streamingr=   r>   rc   c                 C   rY  r+   rZ  )r,   rw  r=   r>   r   r   r   _request_chunk1  s   z$BaseStreamingReadFile._request_chunkc                 C   sj   g }	 | j | j }|dksJ d| tt|}|d us!J d|}t|dkr*n|| qd|S )NTr   zread more bytes than expectedfile is in non-blocking moder   )rr  rS  r   r   
CHUNK_SIZEr   appendri   )r,   piecesbytes_remaining	opt_piecepiecer   r   r   readall6  s   


zBaseStreamingReadFile.readallrd  c           
      C   sD  | j | j }|dkst|dkrdS t|tst|}t||kr'|d | }d}| jjrtt D ]\}}| j	d u rU| j
d| jd}|jdkrK dS || _	|  jd7  _d }z"| j	|}|d usfJ d|}|dkrutd| j }nW  nqW n( tjjtjjtjjtjfy }	 ztd|	 d	| j }W Y d }	~	nd }	~	ww | j	  d | _	|  jd7  _| jjd ur|| jjkr||t| jt|kr| jd
| dt| d| j d| d|dd t| q2n(| j
d| j| jt| d}|jdkrdS |  jd7  _t|j}|j|d |< |  j|7  _|  j|7  _|S )Nr   T)rw  r=   i  r   ry  z5failed to read from connection while reading file at z
exception z while reading file at r   z when executing readinto(z) at offset r   r   r   r   F)rw  r=   r>   ) rr  rS  r   r  r   rV  r   r  r    r   rx  ru   rt  rj  rM   rs  r   r  r  r  r  r  r  ru  r   r  r8   r   r   r  r'   rv  )
r,   rd  r}  r   r  r  r  rj   opt_nr   r   r   r   rj  J  st   



"

*

zBaseStreamingReadFile.readintor   r   c              
   C   s   |t jkr|}n*|t jkr| j| }n|t jkr| j| }ntd| dt j dt j dt j d	|| jkrG|| _| jd urD| j  d | _| jS )NzInvalid whence (z, should be rd   z, or ))	r   r   SEEK_CURrS  SEEK_ENDrr  
ValueErrorr   r  )r,   r   r   
new_offsetr   r   r   r     s   


"


zBaseStreamingReadFile.seekc                 C   s   | j S r+   )rS  r0   r   r   r   r     s   zBaseStreamingReadFile.tellc                    s<   | j rd S t| dr| jd ur| j  d | _t   d S )Nr   )r_  hasattrr   r  rP   r0   rQ   r   r   r    s   
zBaseStreamingReadFile.closec                 C   ra  rb  r   r0   r   r   r   readable  r]  zBaseStreamingReadFile.readablec                 C   ra  rb  r   r0   r   r   r   seekable  r]  zBaseStreamingReadFile.seekabler+   ro  )r3   r4   r5   r   r8   r:   r-   r9   r	   rx  r   r  r   rj  r   r   r   r   r  r  r  rS   r   r   rQ   r   rq  $  s&    
Nrq  r   c                 C   s2   t  }	 | t}|dkr	 | S || q)NTr   )hashlibr   r   rz  r   digest)r   mblockr   r   r   	block_md5  s   

r  r=   r>   c                 C   sn   | d ur|d urd|  d|d  S | d urd|  dS |d ur3|dkr+d|d  S dt |  S td)Nzbytes=-r   r   zbytes=0-zbytes=-zInvalid range)r:   rM   r   r   r   r   
calc_range  s   r  r<   c                 C   s$   |  dr| d d } |  ds| S )N/r   )r  r<   r   r   r   strip_slashes  s   

r  ard  c                 C   s   d| vrd|vs
J | dkr|S |dkr| S |d d dkr$| d}n$|  d}|d dkr2|d= || d }dd |dd D |dd< g }|D ]}|dkr]t|d	kr\|  qL|d
krbqL|| qL|d dv rs|d d|S )Nz://rB   r   r  r   c                 S   s   g | ]}|d kr|qS )rB   r   )re   sr   r   r   r'    s    zpath_join.<locals>.<listcomp>..r   .)r  r  )splitr   popr{  ri   )r  rd  segments
base_partsresolved_pathsegr   r   r   	path_join  s0   


r  rj   c                    s"   t  fddtD r| jS | jS )Nc                 3   s    | ]}| v V  qd S r+   r   )re   substrrj   r   r   rh     s    z.get_log_threshold_for_error.<locals>.<genexpr>)anyCOMMON_ERROR_SUBSTRINGSr   r   )r   rj   r   r  r   r    s   r  c                   @   s   e Zd ZdZdefddZdS )BlobPathLikez>Similar to the __fspath__ protocol, but for remote blob paths.r   c                 C   s   d S r+   r   r0   r   r   r   __blobpath__  r]  zBlobPathLike.__blobpath__N)r3   r4   r5   r6   r8   r  r   r   r   r   r    s    r  zos.PathLike[str]c                 C   s*   t | tr	|  S t | tjr|  S | S r+   )r  r  r  r   PathLike
__fspath__r  r   r   r   path_to_str  s
   
r  rY   )[r  r   r^   r   r   r   r  r   r   urllib.parserE   typingr   r   r   r   r   r   r   r	   r
   r   r   r   r   rF  r   blobfiler   r[   rz  r   r   PARALLEL_COPY_MINIMUM_PART_SIZErN  r  BACKOFF_INITIALBACKOFF_MAXr   r   r   r  r7   r  SystemRandomr   r   r    r!   r;   r8   rL   r]   rM   r   ra   rm   rn   rz   r}   r~   r   r   r   r   r   r   r   r   r:   r   r   r   r   r   JSONEncoderr!  r.  r/  BufferedIOBaserQ  rp  rq  r  r  r  r  r  r  RemoteOrLocalPathr  r   r   r   r   <module>   s   
 <
"
6&9"&
 #EJ   
$