ó
'—^c           @   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 rd d l m Z m Z d d l m Z d d l m Z d d l m Z n  e j e  ƒ Z! d „  Z" d „  Z# d „  Z$ d „  Z% d „  Z& d „  Z' d e( f d „  ƒ  YZ) d e( f d „  ƒ  YZ* d S(   s)   Download files with progress indicators.
iÿÿÿÿN(   t   requests(   t   CONTENT_CHUNK_SIZE(   t   PyPI(   t   is_from_cache(   t   response_chunks(   t   format_sizet   redact_auth_from_urlt   splitext(   t   MYPY_CHECK_RUNNING(   t   DownloadProgressProvider(   t   Iterablet   Optional(   t   Response(   t   Link(   t
   PipSessionc         C   s7   y t  |  j d ƒ SWn t t t f k
 r2 d  SXd  S(   Ns   content-length(   t   intt   headerst
   ValueErrort   KeyErrort	   TypeErrort   None(   t   resp(    (    s;   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/download.pyt   _get_http_response_size!   s    c         C   s  t  |  ƒ } | j t j k r* | j } n	 | j } t | ƒ } | r` d j | t | ƒ ƒ } n  t	 |  ƒ r t
 j d | ƒ n t
 j d | ƒ t
 j ƒ  t j k r­ t } n? t	 |  ƒ rÂ t } n* | sÑ t } n | d k ræ t } n t } t |  t ƒ } | s| St | d | ƒ| ƒ S(   Ns   {} ({})s   Using cached %ss   Downloading %si(   iè  t   maxi@œ  (   R   t   netlocR   t   file_storage_domaint   show_urlt   url_without_fragmentR   t   formatR   R   t   loggert   infot   getEffectiveLevelt   loggingt   INFOt   Falset   TrueR   R   R	   (   R   t   linkt   progress_bart   total_lengtht   urlt
   logged_urlt   show_progresst   chunks(    (    s;   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/download.pyt   _prepare_download)   s2    					c         C   s   t  j j |  ƒ S(   sJ   
    Sanitize the "filename" value from a Content-Disposition header.
    (   t   ost   patht   basename(   t   filename(    (    s;   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/download.pyt   sanitize_content_filenameU   s    c         C   sC   t  j |  ƒ \ } } | j d ƒ } | r9 t | ƒ } n  | pB | S(   sƒ   
    Parse the "filename" value from a Content-Disposition header, and
    return the default filename if the result is empty.
    R/   (   t   cgit   parse_headert   getR0   (   t   content_dispositiont   default_filenamet   _typet   paramsR/   (    (    s;   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/download.pyt   parse_content_disposition]   s
    c         C   sÉ   | j  } |  j j d ƒ } | r3 t | | ƒ } n  t | ƒ d } | s} t j |  j j d d ƒ ƒ } | r} | | 7} q} n  | rÅ | j |  j k rÅ t j	 j |  j ƒ d } | rÅ | | 7} qÅ n  | S(   so   Get an ideal filename from the given HTTP response, falling back to
    the link filename if not provided.
    s   content-dispositioni   s   content-typet    (
   R/   R   R3   R8   R   t	   mimetypest   guess_extensionR'   R,   R-   (   R   R$   R/   R4   t   ext(    (    s;   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/download.pyt   _get_http_response_filenamel   s    	c         C   sI   | j  j d d ƒ d } |  j | d i d d 6d t ƒ} | j ƒ  | S(   Nt   #i   i    R   t   identitys   Accept-Encodingt   stream(   R'   t   splitR3   R#   t   raise_for_status(   t   sessionR$   t
   target_urlR   (    (    s;   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/download.pyt   _http_get_download„   s    	
t   Downloadc           B   s   e  Z d  „  Z RS(   c         C   s   | |  _  | |  _ | |  _ d  S(   N(   t   responseR/   R*   (   t   selfRG   R/   R*   (    (    s;   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/download.pyt   __init__¤   s    		(   t   __name__t
   __module__RI   (    (    (    s;   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/download.pyRF   £   s   t
   Downloaderc           B   s   e  Z d  „  Z d „  Z RS(   c         C   s   | |  _  | |  _ d  S(   N(   t   _sessiont   _progress_bar(   RH   RC   R%   (    (    s;   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/download.pyRI   ±   s    	c         C   ss   y t  |  j | ƒ } Wn2 t j k
 rJ } t j d | j j | ƒ ‚  n Xt | t	 | | ƒ t
 | | |  j ƒ ƒ S(   Ns   HTTP error %s while getting %s(   RE   RM   R    t	   HTTPErrorR   t   criticalRG   t   status_codeRF   R=   R+   RN   (   RH   R$   R   t   e(    (    s;   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/download.pyt   __call__º   s    (   RJ   RK   RI   RS   (    (    (    s;   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/download.pyRL   °   s   		(+   t   __doc__R1   R    R:   R,   t   pip._vendorR    t   pip._vendor.requests.modelsR   t   pip._internal.models.indexR   t   pip._internal.network.cacheR   t   pip._internal.network.utilsR   t   pip._internal.utils.miscR   R   R   t   pip._internal.utils.typingR   t   pip._internal.utils.uiR	   t   typingR
   R   R   t   pip._internal.models.linkR   t   pip._internal.network.sessionR   t	   getLoggerRJ   R   R   R+   R0   R8   R=   RE   t   objectRF   RL   (    (    (    s;   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/download.pyt   <module>   s4   		,				