
0c@_                 @   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 m Z m Z d d
 l m Z e rd d l m Z m Z d d l m Z d d l m Z d d l m  Z  e j! e"  Z# d d   Z$ d d   Z% d d   Z& d d   Z' d d   Z( d d   Z) Gd d   d e*  Z+ Gd d   d e*  Z, d S)z)Download files with progress indicators.
    N)CONTENT_CHUNK_SIZE)DownloadProgressProvider)NetworkConnectionError)PyPI)is_from_cache)HEADERSraise_for_statusresponse_chunks)format_sizeredact_auth_from_urlsplitext)MYPY_CHECK_RUNNING)IterableOptional)Response)Link)
PipSessionc             C   s;   y t  |  j d  SWn t t t f k
 r6 d  SYn Xd  S)Nzcontent-length)intheaders
ValueErrorKeyError	TypeError)resp r   =/tmp/pip-build-jynh7p1z/pip/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 j | t |   } t	 |   r| t
 j d |  n t
 j d |  t
 j   t j k r d } n? t	 |   r d } n* | s d } n | d	 k r d } n d } t |  t  } | s| St | 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   linkprogress_bartotal_lengthurlZ
logged_urlshow_progresschunksr   r   r   _prepare_download-   s2    					r-   c             C   s   t  j j |   S)zJ
    Sanitize the "filename" value from a Content-Disposition header.
    )ospathbasename)filenamer   r   r   sanitize_content_filenameY   s    r2   c             C   s@   t  j |   \ } } | j d  } | r6 t |  } | p? | S)z
    Parse the "filename" value from a Content-Disposition header, and
    return the default filename if the result is empty.
    r1   )cgiparse_headergetr2   )content_dispositionZdefault_filename_typeparamsr1   r   r   r   parse_content_dispositiona   s
    r9   c             C   s   | j  } |  j j d  } | r0 t | |  } t |  d } | st t j |  j j d d   } | rt | | 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 )
r1   r   r5   r9   r   	mimetypesguess_extensionr*   r.   r/   )r   r'   r1   r6   extr   r   r   _get_http_response_filenamep   s    	

r?   c             C   sB   | j  j d d  d } |  j | d t d d } t |  | S)N#r:   r   r   streamT)r*   splitr5   r   r   )sessionr'   
target_urlr   r   r   r   _http_get_download   s    
rE   c               @   s   e  Z d  Z d d   Z d S)Downloadc             C   s   | |  _  | |  _ | |  _ d  S)N)responser1   r,   )selfrG   r1   r,   r   r   r   __init__   s    		zDownload.__init__N)__name__
__module____qualname__rI   r   r   r   r   rF      s   rF   c               @   s(   e  Z d  Z d d   Z d d   Z d S)
Downloaderc             C   s   | |  _  | |  _ d  S)N)_session_progress_bar)rH   rC   r(   r   r   r   rI      s    	zDownloader.__init__c             C   s   y t  |  j |  } WnV t k
 rn } z6 | j d  k	 s@ t  t j d | j j |    WYd  d  } ~ Xn Xt | t	 | |  t
 | | |  j   S)NzHTTP error %s while getting %s)rE   rN   r   rG   AssertionErrorr"   criticalstatus_coderF   r?   r-   rO   )rH   r'   r   er   r   r   __call__   s    zDownloader.__call__N)rJ   rK   rL   rI   rT   r   r   r   r   rM      s   	rM   )-__doc__r3   r%   r<   r.   Zpip._vendor.requests.modelsr   Zpip._internal.cli.progress_barsr   Zpip._internal.exceptionsr   Zpip._internal.models.indexr   Zpip._internal.network.cacher   Zpip._internal.network.utilsr   r   r	   Zpip._internal.utils.miscr
   r   r   Zpip._internal.utils.typingr   Ztypingr   r   r   Zpip._internal.models.linkr   Zpip._internal.network.sessionr   	getLoggerrJ   r"   r   r-   r2   r9   r?   rE   objectrF   rM   r   r   r   r   <module>   s4   ,