a
    hbòf®  ã                   @   sT  d 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 ddl	m
Z
mZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZ ddlmZmZmZ e  e!¡Z"eee# dœdd„Z$eee%ee& dœdd„Z'e%e%dœdd„Z(e%e%e%dœdd„Z)eee%dœdd„Z*eeedœdd„Z+G dd „ d ƒZ,G d!d"„ d"ƒZ-dS )#z)Download files with progress indicators.
é    N)ÚIterableÚOptionalÚTuple)ÚCONTENT_CHUNK_SIZEÚResponse)Úget_download_progress_renderer)ÚNetworkConnectionError)ÚPyPI)ÚLink)Úis_from_cache)Ú
PipSession)ÚHEADERSÚraise_for_statusÚresponse_chunks)Úformat_sizeÚredact_auth_from_urlÚsplitext)ÚrespÚreturnc              
   C   s0   zt | jd ƒW S  tttfy*   Y d S 0 d S )Nzcontent-length)ÚintÚheadersÚ
ValueErrorÚKeyErrorÚ	TypeError)r   © r   ú[/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/pip/_internal/network/download.pyÚ_get_http_response_size   s    r   )r   ÚlinkÚprogress_barr   c           	      C   sÄ   t | ƒ}|jtjkr|j}n|j}t|ƒ}|r>d |t|ƒ¡}t	| ƒrTt
 d|¡ nt
 d|¡ t
 ¡ tjkrtd}n*t	| ƒr‚d}n|sŒd}n|dkršd}nd}t| tƒ}|s°|S t||d�}||ƒS )Nz{} ({})zUsing cached %szDownloading %sFTi@œ  )Úbar_typeÚsize)r   Únetlocr	   Úfile_storage_domainÚshow_urlÚurl_without_fragmentr   Úformatr   r   ÚloggerÚinfoÚgetEffectiveLevelÚloggingÚINFOr   r   r   )	r   r   r   Útotal_lengthÚurlÚ
logged_urlÚshow_progressÚchunksÚrendererr   r   r   Ú_prepare_download   s0    
r1   )Úfilenamer   c                 C   s   t j | ¡S )zJ
    Sanitize the "filename" value from a Content-Disposition header.
    )ÚosÚpathÚbasename)r2   r   r   r   Úsanitize_content_filenameH   s    r6   )Úcontent_dispositionÚdefault_filenamer   c                 C   s,   t  | ¡\}}| d¡}|r$t|ƒ}|p*|S )zƒ
    Parse the "filename" value from a Content-Disposition header, and
    return the default filename if the result is empty.
    r2   )ÚcgiÚparse_headerÚgetr6   )r7   r8   Ú_typeÚparamsr2   r   r   r   Úparse_content_dispositionO   s
    
r>   )r   r   r   c                 C   s‚   |j }| j d¡}|r t||ƒ}t|ƒd }|sPt | j dd¡¡}|rP||7 }|s~|j| jkr~tj	 | j¡d }|r~||7 }|S )zoGet an ideal filename from the given HTTP response, falling back to
    the link filename if not provided.
    zcontent-dispositioné   zcontent-typeÚ )
r2   r   r;   r>   r   Ú	mimetypesÚguess_extensionr,   r3   r4   )r   r   r2   r7   Úextr   r   r   Ú_get_http_response_filename]   s    
rD   )Úsessionr   r   c                 C   s.   |j  dd¡d }| j|tdd�}t|ƒ |S )Nú#r?   r   T)r   Ústream)r,   Úsplitr;   r   r   )rE   r   Ú
target_urlr   r   r   r   Ú_http_get_downloadr   s    rJ   c                   @   s8   e Zd Zeeddœdd„Zeeeeef dœdd„ZdS )Ú
DownloaderN©rE   r   r   c                 C   s   || _ || _d S ©N©Ú_sessionÚ_progress_bar©ÚselfrE   r   r   r   r   Ú__init__z   s    zDownloader.__init__)r   Úlocationr   c              
   C   sÒ   zt | j|ƒ}W nF tyV } z.|jdus.J ‚t d|jj|¡ ‚ W Y d}~n
d}~0 0 t||ƒ}tj	 
||¡}t||| jƒ}t|dƒ�$}|D ]}	| |	¡ qŽW d  ƒ n1 s²0    Y  |j dd¡}
||
fS )z.Download the file given by link into location.NúHTTP error %s while getting %sÚwbúContent-Typer@   ©rJ   rO   r   Úresponser&   ÚcriticalÚstatus_coderD   r3   r4   Újoinr1   rP   ÚopenÚwriter   r;   )rR   r   rT   r   Úer2   Úfilepathr/   Úcontent_fileÚchunkÚcontent_typer   r   r   Ú__call__‚   s     
ÿ
*zDownloader.__call__)	Ú__name__Ú
__module__Ú__qualname__r   ÚstrrS   r
   r   rd   r   r   r   r   rK   y   s
   ürK   c                   @   sH   e Zd Zeeddœdd„Zee eeeeeeef f  dœdd„Z	dS )ÚBatchDownloaderNrL   c                 C   s   || _ || _d S rM   rN   rQ   r   r   r   rS   ™   s    zBatchDownloader.__init__)ÚlinksrT   r   c                 c   sæ   |D ]Ü}zt | j|ƒ}W nF ty^ } z.|jdus6J ‚t d|jj|¡ ‚ W Y d}~n
d}~0 0 t||ƒ}tj	 
||¡}t||| jƒ}t|dƒ�$}	|D ]}
|	 |
¡ q–W d  ƒ n1 sº0    Y  |j dd¡}|||ffV  qdS )z0Download the files given by links into location.NrU   rV   rW   r@   rX   )rR   rj   rT   r   r   r_   r2   r`   r/   ra   rb   rc   r   r   r   rd   ¡   s&    ý
*zBatchDownloader.__call__)
re   rf   rg   r   rh   rS   r   r
   r   rd   r   r   r   r   ri   ˜   s   ü	þri   ).Ú__doc__r9   r)   rA   r3   Útypingr   r   r   Zpip._vendor.requests.modelsr   r   Úpip._internal.cli.progress_barsr   Úpip._internal.exceptionsr   Úpip._internal.models.indexr	   Úpip._internal.models.linkr
   Úpip._internal.network.cacher   Úpip._internal.network.sessionr   Úpip._internal.network.utilsr   r   r   Úpip._internal.utils.miscr   r   r   Ú	getLoggerre   r&   r   r   rh   Úbytesr1   r6   r>   rD   rJ   rK   ri   r   r   r   r   Ú<module>   s6   
ü*