
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ÝPfË2  ã               @   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j-e.ƒZ/dddœZ0ej1d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   ú /usr/lib/python3.6/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|jdd ƒ |jdƒ| _tjdk r4|jdd ƒ |jd| jƒ| _t	j
| f|ž|Ž d S )NÚstrictÚsource_addressé   é   Úsocket_options)r$   r%   )r   Z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 Y dd}~X n0 t	k
r¨ } zt
| d| ƒ‚W Y dd}~X 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   Zcreate_connectionÚhostÚportr   ÚSocketTimeoutr   ÚSocketErrorr   )r.   Zextra_kwÚconnÚer   r   r   Ú	_new_conn   s     

 zHTTPConnection._new_connc             C   s$   || _ t| dd ƒr | jƒ  d| _d S )NÚ_tunnel_hostr   )ÚsockÚgetattrÚ_tunnelÚ	auto_open)r.   r5   r   r   r   Ú_prepare_connš   s    zHTTPConnection._prepare_connc             C   s   | j ƒ }| j|ƒ d S )N)r7   r=   )r.   r5   r   r   r   Úconnect¥   s    zHTTPConnection.connectNc             C   s  t |dk	r|ni ƒ}d|k}d|k}| j||||d� x |jƒ D ]\}}| j||ƒ q@W d|krl| jddƒ | jƒ  |dk	�rtjtjf }	t||	ƒrœ|f}xj|D ]b}
|
s¬q¢t|
tjƒsÂ|
j	dƒ}
t
t|
ƒƒd	d… }| j|j	d
ƒƒ | jdƒ | j|
ƒ | jdƒ q¢W | jdƒ dS )zƒ
        Alternative to the common request method, which sends the
        body with chunked encoding and not as one block
        Nzaccept-encodingr1   )Úskip_accept_encodingÚ	skip_hostztransfer-encodingzTransfer-EncodingZchunkedÚutf8r$   zutf-8s   
s   0

)r   Z
putrequestÚitemsZ	putheaderZ
endheadersr   Zstring_typesZbinary_typeÚ
isinstanceÚencodeÚhexÚlenÚsend)r.   ÚmethodZurlZbodyZheadersr?   r@   ÚheaderÚvalueZstringish_typesÚchunkZlen_strr   r   r   Úrequest_chunked©   s8    





zHTTPConnection.request_chunked)NN)r
   r   r   r!   Úport_by_schemeÚdefault_portÚsocketZIPPROTO_TCPZTCP_NODELAYr+   Úis_verifiedr-   r7   r=   r>   rL   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_contextZ	_protocol)	r.   r1   r2   rR   rS   r"   r   rT   r0   r   r   r   r-   Õ   s    zHTTPSConnection.__init__c             C   sN   | j ƒ }| j|ƒ | jd kr2ttd ƒtd ƒd�| _t|| j| j| jd�| _	d S )N)Ússl_versionÚ	cert_reqs)r9   ÚkeyfileÚcertfilerT   )
r7   r=   rT   r   r   r   r   rR   rS   r9   )r.   r5   r   r   r   r>   ä   s    

zHTTPSConnection.connect)
r
   r   r   rM   rN   rU   rO   Z_GLOBAL_DEFAULT_TIMEOUTr-   r>   r   r   r   r   rQ   Ð   s   rQ   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j	|ƒ| _
|oftjj	|ƒ| _dS )zX
        This method should only be called once, before the connection is used.
        NÚCERT_REQUIRED)rT   Úverify_moderR   rS   rV   Úassert_hostnamer   ÚosÚpathÚ
expanduserÚca_certsÚca_cert_dir)r.   rR   rS   rV   r`   r\   r   ra   r   r   r   Úset_cert  s    
z VerifiedHTTPSConnection.set_certc          	   C   sL  | j ƒ }| j}t| dd ƒr4|| _| jƒ  d| _| j}tjj	ƒ t
k }|rXtjdj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ƒ nb|jtjkoît|dd	ƒ oî| jd	k	�r.| jjƒ }|j d
f ƒ�stjdj|ƒt!ƒ t"|| j�p*|ƒ |jtj#k�pD| jd k	| _$d S )Nr8   r   zWSystem time is way off (before {0}). This will probably lead to SSL verification errors)rU   rV   )r9   rW   rX   r`   ra   Zserver_hostnamerT   T)Zbinary_formZcheck_hostnameFZsubjectAltNamezê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.))%r7   r1   r:   r9   r;   r<   r8   ÚdatetimeÚdateZtodayÚRECENT_DATEÚwarningsÚwarnÚformatr   rT   r   r   rU   r   rV   r[   r   rR   rS   r`   ra   r   ZgetpeercertÚsslZ	CERT_NONEr\   r(   r   Ú_match_hostnamerZ   rP   )r.   r5   ZhostnameZis_time_offÚcontextÚcertr   r   r   r>     sT    



zVerifiedHTTPSConnection.connect)NNNNNNN)r
   r   r   r!   rV   r`   ra   rU   r   rb   r>   r   r   r   r   rY   ö   s      
rY   c             C   sL   yt | |ƒ W n8 tk
rF } ztjd|| ƒ | |_‚ W Y d d }~X nX d S )Nz@Certificate did not match expected hostname: %s. Certificate: %s)r   r   Úlogr   Z
_peer_cert)rl   Zasserted_hostnamer6   r   r   r   rj   b  s    rj   )9Z
__future__r   rc   Zloggingr]   r)   rO   r   r4   r   r3   rf   Zpackagesr   Zpackages.six.moves.http_clientr   r,   r   ri   Z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   Z	getLoggerr
   rm   rM   rd   re   Úobjectr    rQ   rY   rj   ZUnverifiedHTTPSConnectionr   r   r   r   Ú<module>   sN   
	
 &l