o
    2wi#                     @   s"  d dl Z d dlZd dlZd dlmZ dZzd dlmZ W n ey'   dZY n
w e Z	e	j
p0e	jZer9e jerAd dlZe ZdZdZdZe ZG dd dZz d dlmZ d dlZzd d	lmZ W n eyo   dZY nw W n
 ey{   Y dS w 	ddejjfddZG dd deZdS )    N)lock)get_default_verify_pathszECDH+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      @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_host_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   \/home/ubuntu/sommelier/.venv/lib/python3.10/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 )z6resolve (dns) socket information needed to connect it.r   )r   r   socketAF_INETgetaddrinfor   r	   SOL_TCP)r   familyinfor   r   r   _resolveA   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 d| j )zgmight be overridden and super for wrapping into a ssl socket
        or set tcp/socket options
        N   zCannot resolve :)r&   r1   	Exception
settimeoutr   _connect_socketafter_connectr   OSErrorr+   RuntimeError_host_port)r   
sock_infosfirst_error	sock_infor.   er   r   r   _create_socketa   s8   

zConnectionPool._create_socketc                 C   s   d S Nr   r-   r   r   r   r8      s   zConnectionPool.after_connectc                 C   s   | | | | |S rB   )connect_setup_proxy)r   r.   addressr   r   r   r7      s   

zConnectionPool._connect_socketc                 C   s`   | j r,|td| j d| j dd |d}| }|r%|d dkr.td| d S d S )	NzCONNECT r4   z HTTP/1.1

utf8i      s   200z#Error response from Proxy server : )r   sendbytesr
   r   recvsplitr:   )r   r.   resppartsr   r   r   rD      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 )z?get a socket from the pool. This blocks until one is available.zconnection pool closedFr'   )r   acquirer   r:   r   r*   r   r   r,   rA   release)r   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   rO   r-   r   r   r   return_socket   s   
zConnectionPool.return_socketc                 C   s.   z|   W n   Y | js| j  dS dS )z'call when the socket is no more usable.N)r+   r   r   rO   r-   r   r   r   release_socket   s   zConnectionPool.release_socketN)__name__
__module____qualname__DEFAULT_CONNECTION_TIMEOUTDEFAULT_NETWORK_TIMEOUTr   r&   r+   r1   rA   r8   r7   rD   rP   rR   rS   r   r   r   r   r   #   s&    
!r   )PROTOCOL_TLS_CLIENT)create_default_contextTreturnc                 C   s   |pi }z| |d}W n t y   |  }|j|d Y nw ||_|r(tjj|_d|v r;d|v r;|j|d |d d d|v rF||d  dD ]}||v rVt	||||  qH|S )a  
        Initializes an SSL context with additional SSL options.

        :param ssl_context_factory: Callable to create an SSL context
        :param ca_certs: Path to CA certificates file
        :param check_hostname: Whether to enable hostname checking
        :param ssl_options: Optional dictionary of additional SSL options
        :return: Configured SSLContext instance
        )cafilecertfilekeyfile)r]   r^   ciphers)optionsverify_flags)
	TypeErrorload_verify_locationscheck_hostnamer   sslCERT_REQUIREDverify_modeload_cert_chainset_cipherssetattr)ssl_context_factoryca_certsrd   ssl_optionsssl_contextoptionr   r   r   init_ssl_context   s*   
rp   c                       sF   e Zd ZdZeeejje	dZ
			d	 fdd	Z fddZ  ZS )
SSLConnectionPoolaf  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.
        )r_   rl   	cert_reqsssl_versionFNc           	         st   || _ | j | _| j|pi  |pt}|d ur(t|| jd | j  |d| _nd | _t j	||||fi | d S )Nrl   )rd   rm   )
insecuredefault_optionscopyrm   updaterZ   rp   rn   superr   )	r   r   r   r   r   rt   rk   rm   kw	__class__r   r   r     s   
zSSLConnectionPool.__init__c                    sN   t  ||}| jd u rtjj|fi | jS | jd| j}| jj||dS )Nserver_hostname)r|   )	rx   r7   rn   r   re   wrap_socketrm   r*   r
   )r   r.   rE   r|   rz   r   r   r7     s
   
z!SSLConnectionPool._connect_socket)FNN)rT   rU   rV   __doc___DEFAULT_CIPHERS	_CA_CERTSr   re   rf   rY   ru   r   r7   __classcell__r   r   rz   r   rq      s    
rq   )TN)osgevent.queuer   gevent.socketr   r   re   r   ImportError_certsr\   capathpathisdircertifiwherer   rW   rX   objectIGNOREDr   rY   
gevent.sslrZ   
SSLContextrp   rq   r   r   r   r   <module>   sN     
'