U
    ÐvagÆ  ã                   @   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   s2   zt | jd ƒW S  tttfk
r,   Y d S X d S )Nzcontent-length)ÚintÚheadersÚ
ValueErrorÚKeyErrorÚ	TypeError)r   © r   úR/var/www/html/myvenv/lib/python3.8/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|ƒ}|rB|› dt|ƒ› d�}t| ƒrXt	 
d|¡ nt	 
d|¡ t	 ¡ tjkrxd}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@œ  )Zbar_typeÚsize)r   Únetlocr	   Úfile_storage_domainÚshow_urlÚurl_without_fragmentr   r   r   ÚloggerÚinfoÚgetEffectiveLevelÚloggingÚINFOr   r   r   )	r   r   r   Útotal_lengthÚurlZ
logged_urlZshow_progressÚchunksZrendererr   r   r   Ú_prepare_download   s0    
r-   )Úfilenamer   c                 C   s   t j | ¡S )zJ
    Sanitize the "filename" value from a Content-Disposition header.
    )ÚosÚpathÚbasename)r.   r   r   r   Úsanitize_content_filenameH   s    r2   )Úcontent_dispositionÚdefault_filenamer   c                 C   s4   t j ¡ }| |d< | d¡}|r,tt|ƒƒ}|p2|S )zƒ
    Parse the "filename" value from a Content-Disposition header, and
    return the default filename if the result is empty.
    úcontent-typer.   )ÚemailÚmessageÚMessageÚ	get_paramr2   Ústr)r3   r4   Úmr.   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é   r5   Ú )
r.   r   Úgetr<   r   Ú	mimetypesÚguess_extensionr+   r/   r0   )r   r   r.   r3   Úextr   r   r   Ú_get_http_response_filename^   s    
rC   )Ú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   )rD   r   Z
target_urlr   r   r   r   Ú_http_get_downloads   s    rH   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©rD   r   r   c                 C   s   || _ || _d S ©N©Ú_sessionÚ_progress_bar©ÚselfrD   r   r   r   r   Ú__init__{   s    zDownloader.__init__)r   Úlocationr   c              
   C   s¼   zt | j|ƒ}W nD tk
rT } z&|jdk	s0t‚t d|jj|¡ ‚ W 5 d}~X Y nX t||ƒ}t	j
 ||¡}t||| jƒ}t|dƒ�}|D ]}	| |	¡ qŒW 5 Q R X |j dd¡}
||
fS )z.Download the file given by link into location.NúHTTP error %s while getting %sÚwbúContent-Typer>   ©rH   rM   r   ÚresponseÚAssertionErrorr%   ÚcriticalÚstatus_coderC   r/   r0   Újoinr-   rN   ÚopenÚwriter   r?   )rP   r   rR   r   Úer.   Úfilepathr,   Úcontent_fileÚchunkÚcontent_typer   r   r   Ú__call__ƒ   s$      ÿ
zDownloader.__call__)	Ú__name__Ú
__module__Ú__qualname__r   r:   rQ   r
   r   rc   r   r   r   r   rI   z   s
   ürI   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 )ÚBatchDownloaderNrJ   c                 C   s   || _ || _d S rK   rL   rO   r   r   r   rQ   š   s    zBatchDownloader.__init__)ÚlinksrR   r   c                 c   sÐ   |D ]Æ}zt | j|ƒ}W nD tk
r\ } z&|jdk	s8t‚t d|jj|¡ ‚ W 5 d}~X Y nX t||ƒ}t	j
 ||¡}t||| jƒ}t|dƒ�}	|D ]}
|	 |
¡ q”W 5 Q R X |j dd¡}|||ffV  qdS )z0Download the files given by links into location.NrS   rT   rU   r>   rV   )rP   rh   rR   r   r   r^   r.   r_   r,   r`   ra   rb   r   r   r   rc   ¢   s&    ý
zBatchDownloader.__call__)
rd   re   rf   r   r:   rQ   r   r
   r   rc   r   r   r   r   rg   ™   s   ü	 þrg   )/Ú__doc__Úemail.messager6   r(   r@   r/   Útypingr   r   r   Zpip._vendor.requests.modelsr   r   Z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   Ú	getLoggerrd   r%   r   r   r:   Úbytesr-   r2   r<   rC   rH   rI   rg   r   r   r   r   Ú<module>   s6   
ü*