3 �Pf�2�@s�ddlmZddlZddlZddlZddlZddlZddlmZm Z ddl Z ddl m Z ddlmZddlmZyddlZejZWn,eefk r�dZGdd �d e�ZYnXyeZWn$ek r�Gd d �d e�ZYnXdd lmZmZmZmZdd l m!Z!m"Z"ddl#m$Z$m%Z%m&Z&m'Z'm(Z(ddl)m*Z*ddl+m,Z,ej-e.�Z/ddd�Z0ej1ddd�Z2Gdd�de3�Z4Gdd�dee3�ZGdd�de�Z5Gdd�de5�Z6dd�Z7e�r�e5Z8e6Z5ne4Z5dS)�)�absolute_importN)�error�timeout�)�six)�HTTPConnection)� HTTPExceptionc@s eZdZdS)� BaseSSLErrorN)�__name__� __module__� __qualname__�r r � /usr/lib/python3.6/connection.pyr sr c@s eZdZdS)�ConnectionErrorN)r r r r r r rrsr)�NewConnectionError�ConnectTimeoutError�SubjectAltNameWarning�SystemTimeWarning)�match_hostname�CertificateError)�resolve_cert_reqs�resolve_ssl_version�assert_fingerprint�create_urllib3_context�ssl_wrap_socket)� connection)�HTTPHeaderDict�Pi�)�http�httpsi�c@seZdZdZdS)�DummyConnectionz-Used to detect a failed ConnectionCls import.N)r r r �__doc__r r r rr Asr c@sVeZdZdZedZejejdfgZ dZ dd�Z dd�Z d d �Z d d �Zddd�Zd S)ra{ 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., ``[]``). rrFcOsZtjr|jdd�|jd�|_tjdkr4|jdd�|jd|j�|_t j |f|�|�dS)N�strict�source_address���socket_options)r$r%) rZPY3�pop�getr#�sys� version_info�default_socket_optionsr&�_HTTPConnection�__init__)�self�args�kwr r rr-js    zHTTPConnection.__init__cCs�i}|jr|j|d<|jr$|j|d<ytj|j|jf|jf|�}Wnftk rz}zt|d|j|jf��WYdd}~Xn0t k r�}zt |d|��WYdd}~XnX|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&rZcreate_connection�host�portr� SocketTimeoutr� SocketErrorr)r.Zextra_kw�conn�er r r� _new_conns    zHTTPConnection._new_conncCs$||_t|dd�r |j�d|_dS)N� _tunnel_hostr)�sock�getattr�_tunnel� auto_open)r.r5r r r� _prepare_conn�s zHTTPConnection._prepare_conncCs|j�}|j|�dS)N)r7r=)r.r5r r r�connect�szHTTPConnection.connectNc Cst|dk r|ni�}d|k}d|k}|j||||d�x |j�D]\}}|j||�q@Wd|krl|jdd�|j�|dk �rtjtjf} t|| �r�|f}xj|D]b} | s�q�t| tj�s�| j d�} t t | ��d d�} |j | j d ��|j d �|j | �|j d �q�W|j d �dS) z� Alternative to the common request method, which sends the body with chunked encoding and not as one block Nzaccept-encodingr1)�skip_accept_encoding� skip_hostztransfer-encodingzTransfer-EncodingZchunked�utf8r$zutf-8s s0 ) rZ putrequest�itemsZ putheaderZ endheadersrZ string_typesZ binary_type� isinstance�encode�hex�len�send) r.�methodZurlZbodyZheadersr?r@�header�valueZstringish_types�chunkZlen_strr r r�request_chunked�s8        zHTTPConnection.request_chunked)NN)r r r r!�port_by_scheme� default_port�socketZ IPPROTO_TCPZ TCP_NODELAYr+� is_verifiedr-r7r=r>rLr r r rrFs rc@s8eZdZedZdZddddejdfdd�Zdd�Z dS)�HTTPSConnectionrNc Ks8tj|||f||d�|��||_||_||_d|_dS)N)r"rr)rr-�key_file� cert_file� ssl_contextZ _protocol) r.r1r2rRrSr"rrTr0r r rr-�s zHTTPSConnection.__init__cCsN|j�}|j|�|jdkr2ttd�td�d�|_t||j|j|jd�|_ dS)N)� ssl_version� cert_reqs)r9�keyfile�certfilerT) r7r=rTrrrrrRrSr9)r.r5r r rr>�s  zHTTPSConnection.connect) r r r rMrNrUrOZ_GLOBAL_DEFAULT_TIMEOUTr-r>r r r rrQ�s  rQc@s6eZdZdZdZdZdZdZdZddd�Z dd�Z dS)�VerifiedHTTPSConnectionz[ Based on httplib.HTTPSConnection but wraps the socket with SSL certification. NcCsn|dkr(|s|rd}n|jdk r(|jj}||_||_||_||_||_|oTtjj |�|_ |oftjj |�|_ dS)zX This method should only be called once, before the connection is used. N� CERT_REQUIRED) rT� verify_moderRrSrV�assert_hostnamer�os�path� expanduser�ca_certs� ca_cert_dir)r.rRrSrVr`r\rrar r r�set_certs  z VerifiedHTTPSConnection.set_certc CsL|j�}|j}t|dd�r4||_|j�d|_|j}tjj �t k}|rXt j dj t �t�|jdkr|tt|j�t|j�d�|_|j}t|j�|_t||j|j|j|j||d�|_|jr�t|jjdd�|j�nb|jtjko�t|dd � o�|jd k �r.|jj�}|j d f��st j d j |�t!�t"||j�p*|�|jtj#k�pD|jdk |_$dS) Nr8rzWSystem time is way off (before {0}). This will probably lead to SSL verification errors)rUrV)r9rWrXr`raZserver_hostnamerTT)Z binary_formZcheck_hostnameFZsubjectAltNamez�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.))%r7r1r:r9r;r<r8�datetime�dateZtoday� RECENT_DATE�warnings�warn�formatrrTrrrUrrVr[rrRrSr`rarZ getpeercert�sslZ CERT_NONEr\r(r�_match_hostnamerZrP)r.r5ZhostnameZ is_time_off�context�certr r rr>sT        zVerifiedHTTPSConnection.connect)NNNNNNN) r r r r!rVr`rarUrrbr>r r r rrY�s rYcCsLyt||�Wn8tk rF}ztjd||�||_�WYdd}~XnXdS)Nz@Certificate did not match expected hostname: %s. Certificate: %s)rr�logrZ _peer_cert)rlZasserted_hostnamer6r r rrjbsrj)9Z __future__rrcZloggingr]r)rOrr4rr3rfZpackagesrZpackages.six.moves.http_clientrr,rriZSSLErrorr � ImportError�AttributeError� BaseExceptionr� NameError� Exception� exceptionsrrrrZpackages.ssl_match_hostnamerrZ util.ssl_rrrrr�utilr� _collectionsrZ getLoggerr rmrMrdre�objectr rQrYrjZUnverifiedHTTPSConnectionr r r r�sN         &l