U
    @vgt                     @   s"  d 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
 ddlmZ ddlmZ ddlmZmZmZ dd	lmZ dd
lmZ erddlmZmZ ddlmZ ddlmZ ddlmZ ee Z!dd Z"dd Z#dd Z$dd Z%dd Z&dd Z'G dd de(Z)G dd de(Z*dS )z)Download files with progress indicators.
    N)requests)CONTENT_CHUNK_SIZE)PyPI)is_from_cache)response_chunks)format_sizeredact_auth_from_urlsplitext)MYPY_CHECK_RUNNING)DownloadProgressProvider)IterableOptional)Response)Link)
PipSessionc              
   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)resp r   B/tmp/pip-unpacked-wheel-gw11q0wt/pip/_internal/network/download.py_get_http_response_size!   s    r   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	| rd}n|sd}n|dkrd}nd}t| t}|s|S t||d|S )Nz{} ({})zUsing cached %szDownloading %sFTi@  )max)r   netlocr   file_storage_domainshow_urlurl_without_fragmentr   formatr   r   loggerinfogetEffectiveLevelloggingINFOr   r   r   )r   linkprogress_bartotal_lengthurl
logged_urlshow_progresschunksr   r   r   _prepare_download)   s8    
 r,   c                 C   s   t j| S )zJ
    Sanitize the "filename" value from a Content-Disposition header.
    )ospathbasename)filenamer   r   r   sanitize_content_filenameU   s    r1   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.
    r0   )cgiparse_headergetr1   )content_dispositiondefault_filename_typeparamsr0   r   r   r   parse_content_disposition]   s
    
r9   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 )
r0   r   r4   r9   r	   	mimetypesguess_extensionr(   r-   r.   )r   r%   r0   r5   extr   r   r   _get_http_response_filenamel   s     
r?   c                 C   s2   |j ddd }| j|ddidd}|  |S )N#r:   r   zAccept-EncodingidentityT)r   stream)r(   splitr4   raise_for_status)sessionr%   
target_urlr   r   r   r   _http_get_download   s    rG   c                   @   s   e Zd Zdd ZdS )Downloadc                 C   s   || _ || _|| _d S N)responser0   r+   )selfrJ   r0   r+   r   r   r   __init__   s    zDownload.__init__N)__name__
__module____qualname__rL   r   r   r   r   rH      s   rH   c                   @   s   e Zd Zdd Zdd ZdS )
Downloaderc                 C   s   || _ || _d S rI   )_session_progress_bar)rK   rE   r&   r   r   r   rL      s    zDownloader.__init__c              
   C   sf   zt | j|}W n8 tjk
rH } ztd|jj|  W 5 d }~X Y nX t|t	||t
||| jS )NzHTTP error %s while getting %s)rG   rQ   r   	HTTPErrorr    criticalrJ   status_coderH   r?   r,   rR   )rK   r%   r   er   r   r   __call__   s      zDownloader.__call__N)rM   rN   rO   rL   rW   r   r   r   r   rP      s   	rP   )+__doc__r2   r#   r<   r-   pip._vendorr   pip._vendor.requests.modelsr   pip._internal.models.indexr   pip._internal.network.cacher   pip._internal.network.utilsr   pip._internal.utils.miscr   r   r	   pip._internal.utils.typingr
   pip._internal.utils.uir   typingr   r   r   pip._internal.models.linkr   pip._internal.network.sessionr   	getLoggerrM   r    r   r,   r1   r9   r?   rG   objectrH   rP   r   r   r   r   <module>   s4   
,