3
ûâde€  ã               @   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j 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)ÚDownloadProgressProvider)ÚNetworkConnectionError)ÚPyPI)ÚLink)Úis_from_cache)Ú
PipSession)ÚHEADERSÚraise_for_statusÚresponse_chunks)Úformat_sizeÚredact_auth_from_urlÚsplitext)ÚrespÚreturnc             C   s.   yt | jd ƒS  tttfk
r(   d S X d S )Nzcontent-length)ÚintÚheadersÚ
ValueErrorÚKeyErrorÚ	TypeError)r   © r   ú=/tmp/pip-build-red6nood/pip/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j|t|ƒƒ}t	| ƒrTt
jd|ƒ nt
jd|ƒ t
jƒ 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 %sFTé(   iè  )Úmaxi@œ  )r   Únetlocr	   Zfile_storage_domainÚshow_urlÚurl_without_fragmentr   Úformatr   r   ÚloggerÚinfoÚgetEffectiveLevelÚloggingÚINFOr   r   r   )r   r   r   Útotal_lengthÚurlZ
logged_urlÚshow_progressÚchunksr   r   r   Ú_prepare_download   s.    
r.   )Úfilenamer   c             C   s   t jj| ƒS )zJ
    Sanitize the "filename" value from a Content-Disposition header.
    )ÚosÚpathÚbasename)r/   r   r   r   Úsanitize_content_filenameG   s    r3   )Úcontent_dispositionÚdefault_filenamer   c             C   s,   t j| ƒ\}}|j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.
    r/   )ÚcgiÚparse_headerÚgetr3   )r4   r5   Ú_typeÚparamsr/   r   r   r   Úparse_content_dispositionN   s
    
r;   )r   r   r   c             C   s„   |j }| jjdƒ}|r t||ƒ}t|ƒd }|sPtj| jjddƒƒ}|rP||7 }| r€|j| jkr€tj	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Ú )
r/   r   r8   r;   r   Ú	mimetypesÚguess_extensionr+   r0   r1   )r   r   r/   r4   Úextr   r   r   Ú_get_http_response_filename\   s    
rA   )Úsessionr   r   c             C   s.   |j jddƒd }| j|tdd�}t|ƒ |S )Nú#r<   r   T)r   Ústream)r+   Úsplitr8   r   r   )rB   r   Ú
target_urlr   r   r   r   Ú_http_get_downloadq   s    rG   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)rB   r   r   c             C   s   || _ || _d S )N)Ú_sessionÚ_progress_bar)ÚselfrB   r   r   r   r   Ú__init__y   s    zDownloader.__init__)r   Úlocationr   c             C   sÀ   yt | j|ƒ}W nD tk
rT } z(|jdk	s0t‚tjd|jj|ƒ ‚ W Y dd}~X nX t||ƒ}t	j
j||ƒ}t||| jƒ}t|dƒ�}x|D ]}	|j|	ƒ qŽW W dQ R X |jjddƒ}
||
fS )z.Download the file given by link into location.NzHTTP error %s while getting %sÚwbzContent-Typer=   )rG   rI   r   ÚresponseÚAssertionErrorr%   ÚcriticalÚstatus_coderA   r0   r1   Újoinr.   rJ   ÚopenÚwriter   r8   )rK   r   rM   r   Úer/   Úfilepathr-   Úcontent_fileÚchunkÚcontent_typer   r   r   Ú__call__�   s    

zDownloader.__call__)	Ú__name__Ú
__module__Ú__qualname__r   ÚstrrL   r
   r   r[   r   r   r   r   rH   x   s   rH   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 )ÚBatchDownloaderN)rB   r   r   c             C   s   || _ || _d S )N)rI   rJ   )rK   rB   r   r   r   r   rL   ˜   s    zBatchDownloader.__init__)ÚlinksrM   r   c             c   sØ   xÒ|D ]Ê}yt | j|ƒ}W nD tk
r^ } z(|jdk	s:t‚tjd|jj|ƒ ‚ W Y dd}~X nX t||ƒ}t	j
j||ƒ}t||| jƒ}t|dƒ�}	x|D ]}
|	j|
ƒ q˜W W dQ R X |jjddƒ}|||ffV  qW dS )z0Download the files given by links into location.NzHTTP error %s while getting %srN   zContent-Typer=   )rG   rI   r   rO   rP   r%   rQ   rR   rA   r0   r1   rS   r.   rJ   rT   rU   r   r8   )rK   ra   rM   r   r   rV   r/   rW   r-   rX   rY   rZ   r   r   r   r[       s$    


zBatchDownloader.__call__)
r\   r]   r^   r   r_   rL   r   r
   r   r[   r   r   r   r   r`   —   s
   r`   ).Ú__doc__r6   r(   r>   r0   Útypingr   r   r   Zpip._vendor.requests.modelsr   r   Zpip._internal.cli.progress_barsr   Zpip._internal.exceptionsr   Zpip._internal.models.indexr	   Zpip._internal.models.linkr
   Zpip._internal.network.cacher   Zpip._internal.network.sessionr   Zpip._internal.network.utilsr   r   r   Zpip._internal.utils.miscr   r   r   Ú	getLoggerr\   r%   r   r   r_   Úbytesr.   r3   r;   rA   rG   rH   r`   r   r   r   r   Ú<module>   s4   
%