o
    e}                      @   sZ  d dl Zd dlZd dlZd dlZdZzd dlmZ W n ey%   dZY n
w e Z	e	j
p.e	jZer7ejer?d dlZe Zzd dlmZ W n eyR   dZY nw zd dlmZ W n eyj   d dlmZ Y nw dZdZe ZG dd	 d	eZzd dlZzd d
lmZ W n ey   d d
lmZ Y nw W n
 ey   Y dS w G dd deZdS )    N)get_default_verify_paths)_DEFAULT_CIPHERSzECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:ECDH+RC4:DH+RC4:RSA+RC4:!aNULL:!eNULL:!MD5)lock)coros      @c                   @   sx   e Zd ZdZdZddeedfddZdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )ConnectionPoolr      Fc
           
      C   sZ   d| _ || _|| _|| _|| _t|| _tj	
|| _|	| _|| _|| _|| _|| _d S )NF)_closed_connection_host_connection_port_request_hostZ_request_portr   BoundedSemaphore
_semaphoregeventqueue	LifoQueue_socket_queue
_use_proxyconnection_timeoutnetwork_timeoutsizedisable_ipv6)
selfconnection_hostconnection_portrequest_hostrequest_portr   r   r   r   	use_proxy r   OD:\Projects\ConvertPro\env\Lib\site-packages\geventhttpclient/connectionpool.py__init__-   s   	
zConnectionPool.__init__c                 C   s2   d}| j r	tjj}tj| j| j|dtjj}|S )zA resolve (dns) socket informations needed to connect it.
        r   )r   r   socketAF_INETgetaddrinfor
   r   SOL_TCP)r   familyinfor   r   r   _resolveD   s   

zConnectionPool._resolvec                 C   sb   d| _ | j s/z| jjdd}z|  W n   Y W n tjjy'   Y nw | j rd S d S )NTFblock)r	   r   emptygetcloser   r   Emptyr   sockr   r   r   r,   P   s   
zConnectionPool.closec                 C   s   t j|||}|S )z tcp socket factory.
        )r   r!   )r   r%   socktypeprotocolr/   r   r   r   _create_tcp_socket\   s   z!ConnectionPool._create_tcp_socketc                 C   s   |   }d}|D ]c}z| j|dd  }W n ty+ } z
|s!|}W Y d}~qd}~ww z|| j | ||d }| | || j |W   S  tyd } z|	  |sZ|}W Y d}~qd}~w   |	   |rp|t
d| j| jf )zl might be overridden and super for wrapping into a ssl socket
            or set tcp/socket options
        N   zCannot resolve %s:%s)r'   r2   	Exception
settimeoutr   _connect_socketafter_connectr   IOErrorr,   RuntimeErrorZ_hostZ_port)r   Z
sock_infosZfirst_errorZ	sock_infor/   er   r   r   _create_socketb   s<   

zConnectionPool._create_socketc                 C   s   d S Nr   r.   r   r   r   r8      s   zConnectionPool.after_connectc                 C   s   | | | | |S r=   )connect_setup_proxy)r   r/   addressr   r   r   r7      s   

zConnectionPool._connect_socketc                 C   sV   | j r'|tdj| dd |d}| }|r!|d dkr)td| d S d S )Nz>CONNECT {self._request_host}:{self._request_port} HTTP/1.1

r   utf8i      s   200z%Error response from Proxy server : %s)r   sendsixbinary_typeformatrecvsplitr:   )r   r/   resppartsr   r   r   r?      s"   
zConnectionPool._setup_proxyc              	   C   s^   | j   | jrtdz| jjddW S  tjjy.   z| 	 W  Y S    | j 
   w )zI get a socket from the pool. This blocks until one is available.
        zconnection pool closedFr(   )r   acquirer	   r:   r   r+   r   r   r-   r<   releaserA   r   r   r   
get_socket   s   

zConnectionPool.get_socketc                 C   s<   | j rz|  W dS    Y dS | j| | j  dS )z& return a socket to the pool.
        N)r	   r,   r   putr   rM   r.   r   r   r   return_socket   s   
zConnectionPool.return_socketc                 C   s.   z|   W n   Y | js| j  dS dS )z1 call when the socket is no more usable.
        N)r,   r	   r   rM   r.   r   r   r   release_socket   s   zConnectionPool.release_socketN)__name__
__module____qualname__DEFAULT_CONNECTION_TIMEOUTDEFAULT_NETWORK_TIMEOUTr    r'   r,   r2   r<   r8   r7   r?   rN   rP   rQ   r   r   r   r   r   )   s$    
"r   )match_hostnamec                       sV   e Zd ZdZeeejjdZ	e
ejddZ fddZ fddZ fd	d
Z  ZS )SSLConnectionPoolag   SSLConnectionPool creates connections wrapped with SSL/TLS.

        :param host: hostname
        :param port: port
        :param ssl_options: accepts any options supported by `ssl.wrap_socket`
        :param ssl_context_factory: use `ssl.create_default_context` by default
            if provided. It must be a callable that returns a SSLContext.
        )ciphersca_certs	cert_reqscreate_default_contextNc                    sL   | di | _| dd | _| dd| _tt| j||||fi | d S )Nssl_optionsssl_context_factoryinsecureF)popr]   r^   r_   superrX   r    )r   r   r   r   r   kw	__class__r   r   r       s   
zSSLConnectionPool.__init__c                    s.   t t| | | jst| | j d S d S r=   )ra   rX   r8   r_   rW   getpeercertr   r.   rc   r   r   r8      s   zSSLConnectionPool.after_connectc                    s^   t t| ||}| jd u r#| j }|| j tj	j
|fi |S |  j
|fi | jS r=   )ra   rX   r7   r^   default_optionscopyupdater]   r   sslwrap_socket)r   r/   r@   r]   rc   r   r   r7      s   

z!SSLConnectionPool._connect_socket)rR   rS   rT   __doc__r   	_CA_CERTSr   ri   CERT_REQUIREDrf   getattrr^   r    r8   r7   __classcell__r   r   rc   r   rX      s    
rX   )Zgevent.queuer   Zgevent.socketosrE   rl   ri   r   ImportErrorZ_certscafilecapathpathisdircertifiwherer   r   r   rU   rV   objectZIGNOREDr   Z
gevent.sslrW   Zbackports.ssl_match_hostnamerX   r   r   r   r   <module>   sV     