ó
'—^c           @   sw  d  Z  d d l Z d d l Z d d l Z d d l 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 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! d d l" m# Z# 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/ m0 Z0 m1 Z1 m2 Z2 m3 Z3 m4 Z4 d d l5 m6 Z6 e3 e7 e7 e2 e4 e8 e7 f f Z9 n  e j: e; ƒ Z< e	 j= d d e ƒd) d* d+ d, d- d. g Z? d/ Z@ d! „  ZA d" „  ZB d# e f d$ „  ƒ  YZC d% e f d& „  ƒ  YZD d' e jE f d( „  ƒ  YZF d S(0   sh   PipSession and supporting code, containing all pip-specific
network request configuration and behavior.
iÿÿÿÿN(   t   requestst   sixt   urllib3(   t   CacheControlAdapter(   t   BaseAdaptert   HTTPAdapter(   t   Response(   t   CaseInsensitiveDict(   t   parse(   t   InsecureRequestWarning(   t   __version__(   t   MultiDomainBasicAuth(   t   SafeFileCache(   t   has_tlst	   ipaddress(   t   libc_ver(   t   build_url_from_netloct   get_installed_versiont   parse_netloc(   t   MYPY_CHECK_RUNNING(   t   url_to_path(   t   Iteratort   Listt   Optionalt   Tuplet   Union(   t   Linkt   ignoret   categoryt   httpst   *t	   localhosts   127.0.0.0/8s   ::1/128t   filet   ssht   BUILD_BUILDIDt   BUILD_IDt   CIt	   PIP_IS_CIc           C   s   t  d „  t Dƒ ƒ S(   s?   
    Return whether it looks like pip is running under CI.
    c         s   s   |  ] } | t  j k Vq d  S(   N(   t   ost   environ(   t   .0t   name(    (    s:   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/session.pys	   <genexpr>`   s    (   t   anyt   CI_ENVIRONMENT_VARIABLES(    (    (    s:   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/session.pyt   looks_like_ciX   s    c    	   
   C   sI  i i d d 6t  d 6d 6t j ƒ  d 6i t j ƒ  d 6d 6}  |  d d d k rg t j ƒ  |  d d <nÈ |  d d d k rÙ t j j d	 k r t j d
  } n	 t j } d j g  | D] } t | ƒ ^ q³ ƒ |  d d <nV |  d d d k rt j ƒ  |  d d <n+ |  d d d k r/t j ƒ  |  d d <n  t j j	 d ƒ rÔd d l
 m } t t d „  t d d d g | j ƒ  ƒ ƒ ƒ } t t d „  t d d g t ƒ  ƒ ƒ ƒ } | r¾| | d <n  | rÔ| |  d <qÔn  t j j	 d ƒ rt j ƒ  d ri d d 6t j ƒ  d d 6|  d <n  t j ƒ  rFt j ƒ  |  j d i  ƒ d <n  t j ƒ  rqt j ƒ  |  j d i  ƒ d <n  t j ƒ  rt j ƒ  |  d <n  t ƒ  rµd d l } | j |  d <n  t d ƒ } | d k	 rÚ| |  d  <n  t ƒ  rét n d |  d! <t j j d" ƒ } | d k	 r| |  d# <n  d$ j  d% |  d& t! j" |  d' d+ d* t ƒƒ S(,   s6   
    Return a string representing the user agent.
    t   pipR)   t   versiont	   installert   pythont   implementationt   CPythont   PyPyt   finali   t   .t   Jythont
   IronPythont   linuxiÿÿÿÿ(   t   distroc         S   s   |  d S(   Ni   (    (   t   x(    (    s:   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/session.pyt   <lambda>ƒ   t    t   idc         S   s   |  d S(   Ni   (    (   R:   (    (    s:   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/session.pyR;   ‡   R<   t   libt   libcR9   t   darwini    t   macOSt   systemt   releaset   cpuNt   openssl_versiont
   setuptoolst   setuptools_versiont   cit   PIP_USER_AGENT_USER_DATAt	   user_datas9   {data[installer][name]}/{data[installer][version]} {json}t   datat   jsont
   separatorst   ,t   :t	   sort_keys(   RN   RO   (#   R
   t   platformt   python_versiont   python_implementationt   syst   pypy_version_infot   releaselevelt   joint   strt
   startswitht   pip._vendorR9   t   dictt   filtert   zipt   linux_distributionR   t   mac_verRB   t
   setdefaultRC   t   machineR   t   _sslt   OPENSSL_VERSIONR   t   NoneR,   t   TrueR&   R'   t   gett   formatRL   t   dumps(	   RK   RU   R:   R9   t   distro_infosR?   t   sslRG   RJ   (    (    s:   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/session.pyt
   user_agentc   sd    	-$"%		t   LocalFSAdapterc           B   s)   e  Z d d d d d d  „ Z d „  Z RS(   c         C   sè   t  | j ƒ } t ƒ  } d | _ | j | _ y t j | ƒ }	 Wn% t k
 rg }
 d | _ |
 | _ n} Xt j	 j
 |	 j d t ƒ} t j | ƒ d p™ d } t i | d 6|	 j d 6| d 6ƒ | _ t | d	 ƒ | _ | j j | _ | S(
   NiÈ   i”  t   usegmti    s
   text/plains   Content-Types   Content-Lengths   Last-Modifiedt   rb(   R   t   urlR   t   status_codeR&   t   statt   OSErrort   rawt   emailt   utilst
   formatdatet   st_mtimeRe   t	   mimetypest
   guess_typeR   t   st_sizet   headerst   opent   close(   t   selft   requestt   streamt   timeoutt   verifyt   certt   proxiest   pathnamet   respt   statst   exct   modifiedt   content_type(    (    s:   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/session.pyt   sendµ   s$    			
c         C   s   d  S(   N(    (   R~   (    (    s:   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/session.pyR}   Ð   s    N(   t   __name__t
   __module__Rd   R‹   R}   (    (    (    s:   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/session.pyRl   ³   s   t   InsecureHTTPAdapterc           B   s   e  Z d  „  Z RS(   c      	   C   s/   t  t |  ƒ j d | d | d t d | ƒ d  S(   Nt   connRo   R‚   Rƒ   (   t   superRŽ   t   cert_verifyt   False(   R~   R   Ro   R‚   Rƒ   (    (    s:   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/session.pyR‘   Ö   s    (   RŒ   R   R‘   (    (    (    s:   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/session.pyRŽ   Ô   s   t
   PipSessionc           B   sA   e  Z d Z d  „  Z d e d „ Z d „  Z d „  Z d „  Z	 RS(   c   
      O   s\  | j  d d ƒ } | j  d d ƒ } | j  d g  ƒ } | j  d d ƒ } t t |  ƒ j | | Ž  g  |  _ t ƒ  |  j d <t d | ƒ |  _	 t
 j d | d d	 d
 d d g d d ƒ } | rÚ t d t | ƒ d | ƒ } n t d | ƒ } t d | ƒ } | |  _ |  j d | ƒ |  j d | ƒ |  j d t ƒ  ƒ x! | D] }	 |  j |	 d t ƒq;Wd S(   sj   
        :param trusted_hosts: Domains not to emit warnings for when not using
            HTTPS.
        t   retriesi    t   cachet   trusted_hostst
   index_urlss
   User-Agentt   totalt   status_forcelistiô  i÷  i  i  t   backoff_factorg      Ð?t   max_retriess   https://s   http://s   file://t   suppress_loggingN(   t   popRd   R   R“   t   __init__t   pip_trusted_originsRk   R{   R   t   authR   t   RetryR   R   R   RŽ   t   _insecure_adaptert   mountRl   t   add_trusted_hostRe   (
   R~   t   argst   kwargsR”   R•   R–   R—   t   secure_adaptert   insecure_adaptert   host(    (    s:   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/session.pyRž   à   s0    				c         C   sÀ   | sG d j  | ƒ } | d k	 r7 | d j  | ƒ 7} n  t j | ƒ n  t | ƒ } | |  j k ru |  j j | ƒ n  |  j t | ƒ d |  j	 ƒ | d s¼ |  j t | ƒ d |  j	 ƒ n  d S(   sÒ   
        :param host: It is okay to provide a host that has previously been
            added.
        :param source: An optional source string, for logging where the host
            string came from.
        s   adding trusted host: {!r}s
    (from {})t   /i   RO   N(
   Rg   Rd   t   loggert   infoR   RŸ   t   appendR£   R   R¢   (   R~   R©   t   sourceRœ   t   msgt	   host_port(    (    s:   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/session.pyR¤   '  s    
c         c   sT   x t  D] } | Vq Wx7 |  j D], \ } } d | | d  k rD d n | f Vq  Wd  S(   NR   (   t   SECURE_ORIGINSRŸ   Rd   (   R~   t   secure_originR©   t   port(    (    s:   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/session.pyt   iter_secure_originsA  s    	c         C   sj  t  j t | ƒ ƒ } | j | j | j } } } | j d d ƒ d } x|  j ƒ  D]ú } | \ } } }	 | | k rˆ | d k rˆ qU n  yF t j	 | d  k r£ d  n t j | ƒ ƒ }
 t j t j | ƒ ƒ } WnA t k
 r| r$| j ƒ  | j ƒ  k r$| d k r$qU q$n X|
 | k r$qU n  | |	 k rN|	 d k rN|	 d  k	 rNqU n  t SWt j d | | ƒ t S(   Nt   +i   iÿÿÿÿR   sõ   The repository located at %s is not a trusted or secure host and is being ignored. If this repository is available via HTTPS we recommend you use HTTPS instead, otherwise you may silence this warning and allow it anyway with '--trusted-host %s'.(   t   urllib_parset   urlparseRX   t   schemet   hostnameR³   t   rsplitR´   R   t
   ip_addressRd   R   t   ensure_textt
   ip_networkt
   ValueErrort   lowerRe   R«   t   warningR’   (   R~   t   locationt   parsedt   origin_protocolt   origin_hostt   origin_portR²   t   secure_protocolt   secure_hostt   secure_portt   addrt   network(    (    s:   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/session.pyt   is_secure_originH  s<    
c         O   s2   | j  d |  j ƒ t t |  ƒ j | | | | Ž S(   NR   (   R`   R   R   R“   R   (   R~   t   methodRo   R¥   R¦   (    (    s:   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/session.pyR     s    N(
   RŒ   R   Rd   R   Rž   R’   R¤   R´   RË   R   (    (    (    s:   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/session.pyR“   Ü   s   	G		H(   R   R   R   (   R   R   R   (   R   s   127.0.0.0/8R   (   R   s   ::1/128R   (   R    R   N(   R!   R   R   (   R"   R#   R$   R%   (G   t   __doc__t   email.utilsRt   RL   t   loggingRx   R&   RQ   RT   t   warningsRZ   R    R   R   t   pip._vendor.cachecontrolR   t   pip._vendor.requests.adaptersR   R   t   pip._vendor.requests.modelsR   t   pip._vendor.requests.structuresR   t   pip._vendor.six.moves.urllibR   R¶   t   pip._vendor.urllib3.exceptionsR	   R-   R
   t   pip._internal.network.authR   t   pip._internal.network.cacheR   t   pip._internal.utils.compatR   R   t   pip._internal.utils.glibcR   t   pip._internal.utils.miscR   R   R   t   pip._internal.utils.typingR   t   pip._internal.utils.urlsR   t   typingR   R   R   R   R   t   pip._internal.models.linkR   RX   t   intt   SecureOrigint	   getLoggerRŒ   R«   t   filterwarningsRd   R±   R+   R,   Rk   Rl   RŽ   t   SessionR“   (    (    (    s:   /tmp/pip-build-eiI0Wo/pip/pip/_internal/network/session.pyt   <module>   sX   ($	   		P!