a
    OfQ                      @   s   d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	 ddl
mZ ddlmZmZmZ ddlmZmZ ddlmZmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlm Z  dZ!e"dZ#e$ee$ dddZ%G dd de Z&dS )    N)TracebackType)IterableIteratorOptionalType   )SyncBackend)SOCKET_OPTIONNetworkBackendNetworkStream)ConnectErrorConnectTimeout)OriginRequestResponse)default_ssl_context)Lock)Trace   )HTTP11Connection)ConnectionInterfaceg      ?zhttpcore.connection)factorreturnc                 c   s&   dV  t  D ]}| d|  V  qdS )z
    Generate a geometric sequence that has a ratio of 2 and starts with 0.

    For example:
    - `factor = 2`: `0, 2, 4, 8, 16, 32, 64, ...`
    - `factor = 3`: `0, 3, 6, 12, 24, 48, 96, ...`
    r   r   N)	itertoolscount)r   n r   R/var/www/ai-form-bot/venv/lib/python3.9/site-packages/httpcore/_sync/connection.pyexponential_backoff   s    r   c                   @   s  e Zd Zd$eeej ee eee	ee
 ee
 ee eee  ddddZeedd	d
ZeedddZeedddZddddZedddZedddZedddZedddZe
dddZe
dddZd ddd Zd%eee  ee ee dd!d"d#Z dS )&HTTPConnectionNTFr   )originssl_contextkeepalive_expiryhttp1http2retrieslocal_addressudsnetwork_backendsocket_optionsr   c                 C   sb   || _ || _|| _|| _|| _|| _|| _|| _|	d u r>t n|	| _	d | _
d| _t | _|
| _d S )NF)_origin_ssl_context_keepalive_expiry_http1_http2_retries_local_address_udsr   _network_backend_connection_connect_failedr   _request_lock_socket_options)selfr    r!   r"   r#   r$   r%   r&   r'   r(   r)   r   r   r   __init__%   s    zHTTPConnection.__init__)requestr   c              
   C   s  |  |jjs(td|jj d| j z| j | jd u r| |}|d}|d uob|	 dk}|st| j
r| jsddlm} || j|| jd| _nt| j|| jd| _W d    n1 s0    Y  W n. ty } zd| _|W Y d }~n
d }~0 0 | j|S )	NzAttempted to send request to z on connection to 
ssl_objecth2r   )HTTP2Connection)r    streamr"   T)can_handle_requesturlr    RuntimeErrorr*   r5   r3   _connectZget_extra_infoselected_alpn_protocolr.   r-   r$   r<   r,   r   BaseExceptionr4   handle_request)r7   r9   r=   r:   Zhttp2_negotiatedr<   excr   r   r   rD   C   s8    




*zHTTPConnection.handle_requestc                 C   s*  |j di }|j dd }|dd }| j}ttd}zx| jd u r| jjd| jj	| j
|| jd}tdt||(}| jjf i |}	|	|_W d    n1 s0    Y  nV| j|| jd}td	t||(}| jjf i |}	|	|_W d    n1 s0    Y  | jjd
v r| jd u r&t n| j}
| jr<ddgndg}|
| |
|p`| jjd|d}tdt||&}|	jf i |}	|	|_W d    n1 s0    Y  |	W S  ttfy"   |dkr҂ |d8 }t|}tdt||}| j| W d    n1 s0    Y  Y q80 q8d S )Ntimeoutsni_hostnameconnect)r   ascii)hostportr&   rF   r)   connect_tcp)pathrF   r)   connect_unix_socket)   httpss   wsszhttp/1.1r;   )r!   server_hostnamerF   	start_tlsr   r   retry)
extensionsgetr/   r   RETRIES_BACKOFF_FACTORr1   r*   rJ   decoderK   r0   r6   r   loggerr2   rL   Zreturn_valuerN   schemer+   r   r.   set_alpn_protocolsrQ   r   r   nextsleep)r7   r9   ZtimeoutsrG   rF   Zretries_leftZdelayskwargstracer=   r!   alpn_protocolsdelayr   r   r   rA   g   sf    

&
$

&
zHTTPConnection._connect)r    r   c                 C   s
   || j kS N)r*   )r7   r    r   r   r   r>      s    z!HTTPConnection.can_handle_request)r   c                 C   sF   | j d urBtdtd i  | j   W d    n1 s80    Y  d S )Nclose)r3   r   rW   ra   r7   r   r   r   ra      s    
zHTTPConnection.closec                 C   s6   | j d u r,| jo*| jjdks$| j o*| j S | j  S )NrO   )r3   r.   r*   rX   r-   r4   is_availablerb   r   r   r   rc      s    
zHTTPConnection.is_availablec                 C   s   | j d u r| jS | j  S r`   )r3   r4   has_expiredrb   r   r   r   rd      s    
zHTTPConnection.has_expiredc                 C   s   | j d u r| jS | j  S r`   )r3   r4   is_idlerb   r   r   r   re      s    
zHTTPConnection.is_idlec                 C   s   | j d u r| jS | j  S r`   )r3   r4   	is_closedrb   r   r   r   rf      s    
zHTTPConnection.is_closedc                 C   s"   | j d u r| jrdS dS | j  S )NzCONNECTION FAILEDZ
CONNECTING)r3   r4   inforb   r   r   r   rg      s    
zHTTPConnection.infoc                 C   s   d| j j d|   dS )N<z [z]>)	__class____name__rg   rb   r   r   r   __repr__   s    zHTTPConnection.__repr__c                 C   s   | S r`   r   rb   r   r   r   	__enter__   s    zHTTPConnection.__enter__)exc_type	exc_value	tracebackr   c                 C   s   |    d S r`   )ra   )r7   rm   rn   ro   r   r   r   __exit__   s    zHTTPConnection.__exit__)	NNTFr   NNNN)NNN)!rj   
__module____qualname__r   r   ssl
SSLContextfloatboolintstrr
   r   r	   r8   r   r   rD   r   rA   r>   ra   rc   rd   re   rf   rg   rk   rl   r   rC   r   rp   r   r   r   r   r   $   sT            
$>   
r   )'r   loggingrs   typesr   typingr   r   r   r   Z_backends.syncr   Z_backends.baser	   r
   r   _exceptionsr   r   Z_modelsr   r   r   _sslr   Z_synchronizationr   Z_tracer   Zhttp11r   Z
interfacesr   rU   	getLoggerrW   ru   r   r   r   r   r   r   <module>   s"   
