U
    «ÃT_n9  ã                   @   sÊ  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,�rXddl/m0Z0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6 e3e7e7e2e4e8e7f  f Z9e :e;¡Z<e	j=ded� ddddddgZ>dZ?dd„ Z@dd „ ZAG d!d"„ d"eƒZBG d#d$„ d$eƒZCG d%d&„ d&ejDƒZEdS )'zhPipSession and supporting code, containing all pip-specific
network request configuration and behavior.
é    N)ÚrequestsÚsixÚurllib3)ÚCacheControlAdapter)ÚBaseAdapterÚHTTPAdapter)ÚResponse)ÚCaseInsensitiveDict)Úparse)ÚInsecureRequestWarning)Ú__version__)ÚMultiDomainBasicAuth)ÚSafeFileCache)Úhas_tlsÚ	ipaddress)Úlibc_ver)Úbuild_url_from_netlocÚget_installed_versionÚparse_netloc)ÚMYPY_CHECK_RUNNING)Úurl_to_path)ÚIteratorÚListÚOptionalÚTupleÚUnion)ÚLinkÚignore)Úcategory)ÚhttpsÚ*r    )r    Ú	localhostr    )r    z127.0.0.0/8r    )r    z::1/128r    )Úfiler    N)Ússhr    r    )ÚBUILD_BUILDIDÚBUILD_IDÚCIÚ	PIP_IS_CIc                   C   s   t dd„ tD ƒƒS )z?
    Return whether it looks like pip is running under CI.
    c                 s   s   | ]}|t jkV  qd S ©N)ÚosÚenviron)Ú.0Úname© r-   úA/tmp/pip-unpacked-wheel-8u7dkzi1/pip/_internal/network/session.pyÚ	<genexpr>`   s     z looks_like_ci.<locals>.<genexpr>)ÚanyÚCI_ENVIRONMENT_VARIABLESr-   r-   r-   r.   Úlooks_like_ciX   s    r2   c                  C   sL  dt dœt ¡ dt ¡ idœ} | d d dkr@t ¡ | d d< n’| d d dkr�tjjd	krltjd
d… }ntj}d dd„ |D ƒ¡| d d< nB| d d dkr²t ¡ | d d< n | d d dkrÒt ¡ | d d< tj d¡�rHddl	m
} ttdd„ tdddg| ¡ ƒƒƒ}ttdd„ tddgtƒ ƒƒƒ}|�r:||d< |�rH|| d< tj d¡�rzt ¡ d �rzdt ¡ d dœ| d< t ¡ �r˜t ¡ |  di ¡d< t ¡ �r¶t ¡ |  di ¡d< t ¡ �rÌt ¡ | d< tƒ �rædd
l}|j| d < td!ƒ}|d
k	�r || d"< tƒ �rd#nd
| d$< tj d%¡}|d
k	�r2|| d&< d'j| tj| d(d#d)�d*�S )+z6
    Return a string representing the user agent.
    Úpip)r,   Úversionr,   )Ú	installerÚpythonÚimplementationr7   ÚCPythonr4   ÚPyPyÚfinalNé   Ú.c                 S   s   g | ]}t |ƒ‘qS r-   )Ústr)r+   Úxr-   r-   r.   Ú
<listcomp>w   s     zuser_agent.<locals>.<listcomp>ÚJythonÚ
IronPythonÚlinuxr   )Údistroc                 S   s   | d S ©Né   r-   ©r>   r-   r-   r.   Ú<lambda>ƒ   ó    zuser_agent.<locals>.<lambda>Úidc                 S   s   | d S rD   r-   rF   r-   r-   r.   rG   ‡   rH   ÚlibÚlibcrC   ÚdarwinÚmacOSÚsystemÚreleaseÚcpuÚopenssl_versionÚ
setuptoolsÚsetuptools_versionTÚciÚPIP_USER_AGENT_USER_DATAÚ	user_dataz9{data[installer][name]}/{data[installer][version]} {json})ú,ú:)Ú
separatorsÚ	sort_keys)ÚdataÚjson) r   ÚplatformÚpython_versionÚpython_implementationÚsysÚpypy_version_infoÚreleaselevelÚjoinÚ
startswithÚpip._vendorrC   ÚdictÚfilterÚzipÚlinux_distributionr   Úmac_verrN   Ú
setdefaultrO   Úmachiner   Ú_sslÚOPENSSL_VERSIONr   r2   r)   r*   ÚgetÚformatr\   Údumps)r[   ra   rC   Údistro_infosrK   ÚsslrS   rV   r-   r-   r.   Ú
user_agentc   sn     ÿýÿþþ





þrt   c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚLocalFSAdapterNc              
   C   s®   t |jƒ}tƒ }d|_|j|_zt |¡}	W n. tk
rZ }
 zd|_|
|_W 5 d }
~
X Y nPX tj	j
|	jdd�}t |¡d p~d}t||	j|dœƒ|_t|dƒ|_|jj|_|S )	NéÈ   i”  T)Úusegmtr   z
text/plain)zContent-TypezContent-LengthzLast-ModifiedÚrb)r   Úurlr   Ústatus_coder)   ÚstatÚOSErrorÚrawÚemailÚutilsÚ
formatdateÚst_mtimeÚ	mimetypesÚ
guess_typer	   Úst_sizeÚheadersÚopenÚclose)ÚselfÚrequestÚstreamÚtimeoutÚverifyÚcertÚproxiesÚpathnameÚrespÚstatsÚexcÚmodifiedÚcontent_typer-   r-   r.   Úsendµ   s&    
ý

zLocalFSAdapter.sendc                 C   s   d S r(   r-   )rˆ   r-   r-   r.   r‡   Ð   s    zLocalFSAdapter.close)NNNNN)Ú__name__Ú
__module__Ú__qualname__r•   r‡   r-   r-   r-   r.   ru   ³   s     ÿ
ru   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚInsecureHTTPAdapterc                    s   t t| ƒj||d|d� d S )NF)Úconnry   rŒ   r�   )Úsuperr™   Úcert_verify)rˆ   rš   ry   rŒ   r�   ©Ú	__class__r-   r.   rœ   Ö   s    
   ÿzInsecureHTTPAdapter.cert_verify)r–   r—   r˜   rœ   Ú__classcell__r-   r-   r�   r.   r™   Ô   s   r™   c                       sF   e Zd ZdZ‡ fdd„Zddd„Zdd„ Zd	d
„ Z‡ fdd„Z‡  Z	S )Ú
PipSessionNc           
         sê   |  dd¡}|  dd¡}|  dg ¡}|  dd¡}tt| ƒj||Ž g | _tƒ | jd< t|d�| _t	j
|d	d
ddgdd�}|rŽtt|ƒ|d�}n
t|d�}t|d�}|| _|  d|¡ |  d|¡ |  dtƒ ¡ |D ]}	| j|	dd� qÒdS )zj
        :param trusted_hosts: Domains not to emit warnings for when not using
            HTTPS.
        Úretriesr   ÚcacheNÚtrusted_hostsÚ
index_urlsz
User-Agent)r¤   iô  i÷  i  i  g      Ð?)ÚtotalÚstatus_forcelistÚbackoff_factor)r¢   Úmax_retries)r¨   zhttps://zhttp://zfile://T)Úsuppress_logging)Úpopr›   r    Ú__init__Úpip_trusted_originsrt   r…   r   Úauthr   ÚRetryr   r   r   r™   Ú_insecure_adapterÚmountru   Úadd_trusted_host)
rˆ   ÚargsÚkwargsr¡   r¢   r£   r¤   Úsecure_adapterÚinsecure_adapterÚhostr�   r-   r.   r«   à   s4    
ñþ

zPipSession.__init__Fc                 C   s„   |s.d  |¡}|dk	r$|d  |¡7 }t |¡ t|ƒ}|| jkrL| j |¡ |  t|ƒd | j¡ |d s€|  t|ƒd | j¡ dS )zÒ
        :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.
        zadding trusted host: {!r}Nz
 (from {})ú/rE   rX   )	rp   ÚloggerÚinfor   r¬   Úappendr°   r   r¯   )rˆ   r¶   Úsourcer©   ÚmsgÚ	host_portr-   r-   r.   r±   '  s    



þzPipSession.add_trusted_hostc                 c   s<   t D ]
}|V  q| jD ] \}}d||d kr.dn|fV  qd S )Nr    )ÚSECURE_ORIGINSr¬   )rˆ   Úsecure_originr¶   Úportr-   r-   r.   Úiter_secure_originsA  s    zPipSession.iter_secure_originsc              	   C   sþ   t  t|ƒ¡}|j|j|j  }}}| dd¡d }|  ¡ D ]®}|\}}}	||kr\|dkr\q<z0t 	|d krnd nt
 |¡¡}
t t
 |¡¡}W n4 tk
rÀ   |r¼| ¡ | ¡ kr¼|dkr¼Y q<Y nX |
|krÌq<||	kræ|	dkræ|	d k	ræq< dS t d||¡ dS )Nú+rE   éÿÿÿÿr    Tzõ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'.F)Úurllib_parseÚurlparser=   ÚschemeÚhostnamerÀ   ÚrsplitrÁ   r   Ú
ip_addressr   Úensure_textÚ
ip_networkÚ
ValueErrorÚlowerr¸   Úwarning)rˆ   ÚlocationÚparsedÚorigin_protocolÚorigin_hostÚorigin_portr¿   Úsecure_protocolÚsecure_hostÚsecure_portÚaddrÚnetworkr-   r-   r.   Úis_secure_originH  sV      ÿ

ÿýÿÿþý
ÿþýú	zPipSession.is_secure_originc                    s(   |  d| j¡ tt| ƒj||f|ž|ŽS )Nr‹   )rk   r‹   r›   r    r‰   )rˆ   Úmethodry   r²   r³   r�   r-   r.   r‰   �  s    zPipSession.request)NF)
r–   r—   r˜   r‹   r«   r±   rÁ   rÙ   r‰   rŸ   r-   r-   r�   r.   r    Ü   s   G
Hr    )FÚ__doc__Úemail.utilsr~   r\   Úloggingr‚   r)   r]   r`   Úwarningsre   r   r   r   Zpip._vendor.cachecontrolr   Úpip._vendor.requests.adaptersr   r   Úpip._vendor.requests.modelsr   Zpip._vendor.requests.structuresr	   Zpip._vendor.six.moves.urllibr
   rÄ   Úpip._vendor.urllib3.exceptionsr   r3   r   Úpip._internal.network.authr   Úpip._internal.network.cacher   Úpip._internal.utils.compatr   r   Úpip._internal.utils.glibcr   Úpip._internal.utils.miscr   r   r   Úpip._internal.utils.typingr   Úpip._internal.utils.urlsr   Útypingr   r   r   r   r   Úpip._internal.models.linkr   r=   ÚintZSecureOriginÚ	getLoggerr–   r¸   Úfilterwarningsr¾   r1   r2   rt   ru   r™   ÚSessionr    r-   r-   r-   r.   Ú<module>   sT   
÷P!