3
/v_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Zd dlmZ	m
Z d dlZd dl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
Z2ej3dZ4G dd de5Z6G dd dee5ZG dd deZ7G dd de7Z8dd Z9ere7Z:e8Z7ne6Z7dS )    )absolute_importN)errortimeout)HTTPConnection)HTTPExceptionc               @   s   e Zd ZdS )BaseSSLErrorN)__name__
__module____qualname__ r   r   4/usr/lib/python3/dist-packages/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)HTTPHeaderDictP   i  )httphttpsi  z[^-!#$%&'*+.^_`|~0-9a-zA-Z]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   D   s   r   c               @   s^   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 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$   )sixZPY3popgetr"   sysversion_infodefault_socket_optionsr%   _HTTPConnection__init__)selfargskwr   r   r   r-   m   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 nX tk
rl   t| d| j| jf Y 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)z(Failed to establish a new connection: %sN)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.connectc             O   s8   t j|}|r"td||j f tj| ||f||S )zSend a request to the serverzAMethod cannot contain non-token characters %r (found at least %r))_CONTAINS_CONTROL_CHAR_REsearch
ValueErrorgroupr,   
putrequest)r.   methodurlr/   kwargsmatchr   r   r   rC      s    
zHTTPConnection.putrequestNc             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}
|
sqt|
tjs|
j	d}
t
t|
d	d }| j|j	d
 | jd | j|
 | jd qW | 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   rC   itemsZ	putheaderZ
endheadersr&   Zstring_typesZbinary_type
isinstanceencodehexlensend)r.   rD   rE   ZbodyZheadersrH   rI   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>   rC   rT   r   r   r   r   r   I   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   rZ   r[   r!   r   r\   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certfiler\   )
r7   r=   r\   r   r   r   r   rZ   r[   r9   )r.   r5   r   r   r   r>      s    

zHTTPSConnection.connect)
r   r	   r
   rU   rV   r]   rW   Z_GLOBAL_DEFAULT_TIMEOUTr-   r>   r   r   r   r   rY      s   rY   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)r\   verify_moderZ   r[   r^   assert_hostnamer   ospath
expanduserca_certsca_cert_dir)r.   rZ   r[   r^   rh   rd   r   ri   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rt| jjdd| j nb|jtjkot|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)r]   r^   )r9   r_   r`   rh   ri   Zserver_hostnamer\   T)Zbinary_formZcheck_hostnameFZsubjectAltNamezCertificate 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   r\   r   r   r]   r   r^   rc   r   rZ   r[   rh   ri   r   ZgetpeercertsslZ	CERT_NONErd   r(   r   _match_hostnamerb   rX   )r.   r5   ZhostnameZis_time_offcontextcertr   r   r   r>   (  sT    



zVerifiedHTTPSConnection.connect)NNNNNNN)r   r	   r
   r    r^   rh   ri   r]   r   rj   r>   r   r   r   r   ra     s      
ra   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)rt   Zasserted_hostnamer6   r   r   r   rr   p  s    rr   );Z
__future__r   rerk   Zloggingre   r)   rW   r   r4   r   r3   rn   r&   Zsix.moves.http_clientr   r,   r   rq   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   ru   rU   rl   rm   compiler?   objectr   rY   ra   rr   ZUnverifiedHTTPSConnectionr   r   r   r   <module>   sR   
	

 &l