B
    @)H[@4  ã            	   @   s¾  d dl m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
 d dlZddlmZ ddlmZ ddlmZ yd dlZejZW n, eefk
r®   dZG dd	„ d	eƒZY nX yeZW n$ ek
rÜ   G d
d„ deƒZY nX ddlmZmZmZmZ ddl m!Z!m"Z" ddl#m$Z$m%Z%m&Z&m'Z'm(Z( ddl)m*Z* ddl+m,Z, e -e.¡Z/dddœZ0e 1ddd¡Z2G dd„ de3ƒZ4G dd„ dee3ƒZG dd„ deƒZ5G dd„ de5ƒZ6dd„ Z7e�r¶e5Z8e6Z5ne4Z5dS )é    )Úabsolute_importN)ÚerrorÚtimeouté   )Úsix)ÚHTTPConnection)ÚHTTPExceptionc               @   s   e Zd ZdS )ÚBaseSSLErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú_C:\Users\HIRONO~1\AppData\Local\Temp\pip-install-qz7kpjmn\pip\pip\_vendor\urllib3\connection.pyr	      s   r	   c               @   s   e Zd ZdS )ÚConnectionErrorN)r
   r   r   r   r   r   r   r      s   r   )ÚNewConnectionErrorÚConnectTimeoutErrorÚSubjectAltNameWarningÚSystemTimeWarning)Úmatch_hostnameÚCertificateError)Úresolve_cert_reqsÚresolve_ssl_versionÚassert_fingerprintÚcreate_urllib3_contextÚssl_wrap_socket)Ú
connection)ÚHTTPHeaderDictéP   i»  )ÚhttpÚhttpsià  c               @   s   e Zd ZdZdS )ÚDummyConnectionz-Used to detect a failed ConnectionCls import.N)r
   r   r   Ú__doc__r   r   r   r   r    A   s   r    c               @   sV   e Zd ZdZed ZejejdfgZ	dZ
dd„ Zdd„ Zd	d
„ Zdd„ Zddd„ZdS )r   a{  
    Based on httplib.HTTPConnection but provides an extra constructor
    backwards-compatibility layer between older and newer Pythons.

    Additional keyword parameters are used to configure attributes of the connection.
    Accepted parameters include:

      - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool`
      - ``source_address``: Set the source address for the current connection.

        .. note:: This is ignored for Python 2.6. It is only applied for 2.7 and 3.x

      - ``socket_options``: Set specific options on the underlying socket. If not specified, then
        defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling
        Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy.

        For example, if you wish to enable TCP Keep Alive in addition to the defaults,
        you might pass::

            HTTPConnection.default_socket_options + [
                (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),
            ]

        Or you may want to disable the defaults by passing an empty list (e.g., ``[]``).
    r   r   Fc             O   sZ   t jr| dd ¡ | d¡| _tjdk r4| dd ¡ | d| j¡| _t	j
| f|ž|Ž d S )NÚstrictÚsource_address)é   é   Úsocket_options)r   ÚPY3ÚpopÚgetr#   ÚsysÚversion_infoÚdefault_socket_optionsr&   Ú_HTTPConnectionÚ__init__)ÚselfÚargsÚkwr   r   r   r.   j   s    
zHTTPConnection.__init__c          
   C   s®   i }| j r| j |d< | jr$| j|d< ytj| j| jf| jf|Ž}W nf tk
rz } zt| d| j| jf ƒ‚W dd}~X Y n0 t	k
r¨ } zt
| d| ƒ‚W dd}~X Y nX |S )zp Establish a socket connection and set nodelay settings on it.

        :return: New socket connection.
        r#   r&   z0Connection to %s timed out. (connect timeout=%s)Nz(Failed to establish a new connection: %s)r#   r&   r   Úcreate_connectionÚhostÚportr   ÚSocketTimeoutr   ÚSocketErrorr   )r/   Úextra_kwÚconnÚer   r   r   Ú	_new_conn   s     

 zHTTPConnection._new_connc             C   s$   || _ t| dd ƒr |  ¡  d| _d S )NÚ_tunnel_hostr   )ÚsockÚgetattrÚ_tunnelÚ	auto_open)r/   r8   r   r   r   Ú_prepare_connš   s    zHTTPConnection._prepare_connc             C   s   |   ¡ }|  |¡ d S )N)r:   r@   )r/   r8   r   r   r   Úconnect¥   s    zHTTPConnection.connectNc             C   s  t |dk	r|ni ƒ}d|k}d|k}| j||||d� x | ¡ D ]\}}|  ||¡ q@W d|krl|  dd¡ |  ¡  |dk	�rtjtjf }	t||	ƒrœ|f}xj|D ]b}
|
s¬q¢t|
tjƒsÂ|
 	d¡}
t
t|
ƒƒd	d… }|  | 	d
¡¡ |  d¡ |  |
¡ |  d¡ q¢W |  d¡ dS )zƒ
        Alternative to the common request method, which sends the
        body with chunked encoding and not as one block
        Nzaccept-encodingr3   )Úskip_accept_encodingÚ	skip_hostztransfer-encodingzTransfer-EncodingÚchunkedÚutf8r$   zutf-8s   
s   0

)r   Ú
putrequestÚitemsÚ	putheaderÚ
endheadersr   Ústring_typesÚbinary_typeÚ
isinstanceÚencodeÚhexÚlenÚsend)r/   ÚmethodÚurlÚbodyÚheadersrB   rC   ÚheaderÚvalueÚstringish_typesÚchunkÚlen_strr   r   r   Úrequest_chunked©   s8    





zHTTPConnection.request_chunked)NN)r
   r   r   r!   Úport_by_schemeÚdefault_portÚsocketÚIPPROTO_TCPÚTCP_NODELAYr,   Úis_verifiedr.   r:   r@   rA   rZ   r   r   r   r   r   F   s   r   c               @   s8   e Zd Zed ZdZddddejdfdd„Zdd„ Z	dS )ÚHTTPSConnectionr   Nc       	      K   s8   t j| ||f||dœ|—Ž || _|| _|| _d| _d S )N)r"   r   r   )r   r.   Úkey_fileÚ	cert_fileÚssl_contextÚ	_protocol)	r/   r3   r4   rb   rc   r"   r   rd   r1   r   r   r   r.   Õ   s    zHTTPSConnection.__init__c             C   sN   |   ¡ }|  |¡ | jd kr2ttd ƒtd ƒd�| _t|| j| j| jd�| _	d S )N)Ússl_versionÚ	cert_reqs)r<   ÚkeyfileÚcertfilerd   )
r:   r@   rd   r   r   r   r   rb   rc   r<   )r/   r8   r   r   r   rA   ä   s    

zHTTPSConnection.connect)
r
   r   r   r[   r\   rf   r]   Ú_GLOBAL_DEFAULT_TIMEOUTr.   rA   r   r   r   r   ra   Ð   s   ra   c               @   s6   e Zd ZdZdZdZdZdZdZddd„Z	dd„ Z
dS )ÚVerifiedHTTPSConnectionz[
    Based on httplib.HTTPSConnection but wraps the socket with
    SSL certification.
    Nc             C   sn   |dkr(|s|rd}n| j dk	r(| j j}|| _|| _|| _|| _|| _|oTtj 	|¡| _
|oftj 	|¡| _dS )zX
        This method should only be called once, before the connection is used.
        NÚCERT_REQUIRED)rd   Úverify_moderb   rc   rg   Úassert_hostnamer   ÚosÚpathÚ
expanduserÚca_certsÚca_cert_dir)r/   rb   rc   rg   rr   rn   r   rs   r   r   r   Úset_cert  s    
z VerifiedHTTPSConnection.set_certc          	   C   sN  |   ¡ }| j}t| dd ƒr4|| _|  ¡  d| _| j}tj 	¡ t
k }|rXt d t
¡t¡ | jd kr|tt| jƒt| jƒd�| _| j}t| jƒ|_t|| j| j| j| j||d�| _| jrÌt| jjdd�| jƒ nd|jtjk�r0t|dd	ƒ�s0| jd	k	�r0| j ¡ }|  d
d¡�st d |¡t!¡ t"|| j�p,|ƒ |jtj#k�pF| jd k	| _$d S )Nr;   r   zWSystem time is way off (before {0}). This will probably lead to SSL verification errors)rf   rg   )r<   rh   ri   rr   rs   Úserver_hostnamerd   T)Úbinary_formÚcheck_hostnameFÚsubjectAltNamer   zêCertificate for {0} has no `subjectAltName`, falling back to check for a `commonName` for now. This feature is being removed by major browsers and deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 for details.))%r:   r3   r=   r<   r>   r?   r;   ÚdatetimeÚdateÚtodayÚRECENT_DATEÚwarningsÚwarnÚformatr   rd   r   r   rf   r   rg   rm   r   rb   rc   rr   rs   r   ÚgetpeercertÚsslÚ	CERT_NONErn   r)   r   Ú_match_hostnamerl   r`   )r/   r8   ÚhostnameÚis_time_offÚcontextÚcertr   r   r   rA     sT    



zVerifiedHTTPSConnection.connect)NNNNNNN)r
   r   r   r!   rg   rr   rs   rf   r   rt   rA   r   r   r   r   rk   ö   s      
rk   c          
   C   sL   yt | |ƒ W n8 tk
rF } zt d|| ¡ | |_‚ W d d }~X Y nX d S )Nz@Certificate did not match expected hostname: %s. Certificate: %s)r   r   Úlogr   Ú
_peer_cert)r‡   Úasserted_hostnamer9   r   r   r   rƒ   b  s    rƒ   )9Ú
__future__r   ry   Úloggingro   r*   r]   r   r6   r   r5   r}   Úpackagesr   Zpackages.six.moves.http_clientr   r-   r   r�   ÚSSLErrorr	   ÚImportErrorÚAttributeErrorÚBaseExceptionr   Ú	NameErrorÚ	ExceptionÚ
exceptionsr   r   r   r   Zpackages.ssl_match_hostnamer   r   Z	util.ssl_r   r   r   r   r   Úutilr   Ú_collectionsr   Ú	getLoggerr
   rˆ   r[   rz   r|   Úobjectr    ra   rk   rƒ   ÚUnverifiedHTTPSConnectionr   r   r   r   Ú<module>   sN   
	
 &l