o
    hQ                      @   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#de$dee$ f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   Y/var/www/html/flask_server/venv/lib/python3.10/site-packages/httpcore/_sync/connection.pyexponential_backoff   s
   r   c                   @   sD  e Zd Z									d.dedeej dee ded	ed
e	dee
 dee
 dee deee  ddfddZdedefddZdedefddZdedefddZd/ddZdefddZdefddZdefdd Zdefd!d"Zde
fd#d$Zde
fd%d&Zd0d'd(Z			d1d)eee  d*ee d+ee ddfd,d-Z dS )2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__requestc              
   C   s   |  |jjstd|jj d| j zQ| jD | jd u rU| |}|d}|d uo1|	 dk}|s:| j
rK| jsKddlm} || j|| jd| _n
t| j|| jd| _W d    n1 s_w   Y  W n tyv } zd| _|d }~ww | 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   _connectget_extra_infoselected_alpn_protocolr.   r-   r$   r<   r,   r   BaseExceptionr4   handle_request)r7   r9   r=   r:   http2_negotiatedr<   excr   r   r   rE   C   sB   




zHTTPConnection.handle_requestc                 C   s  |j di }|j dd }|dd }| j}ttd}	 z| jd u rX| jjd| jj	| j
|| jd}tdt||}| jjdi |}	|	|_W d    n1 sRw   Y  n+| j|| jd	}td
t||}| jjdi |}	|	|_W d    n1 s~w   Y  | jjdv r| jd u rt n| j}
| jrddgndg}|
| |
|p| jjd|d}tdt||}|	jdi |}	|	|_W d    |	W S 1 sw   Y  |	W S  ttfy   |dkr |d8 }t|}tdt||}| j| W d    n	1 sw   Y  Y nw q)Ntimeoutsni_hostnameconnect)r   Tascii)hostportr&   rH   r)   connect_tcp)pathrH   r)   connect_unix_socket)   httpss   wsszhttp/1.1r;   )r!   server_hostnamerH   	start_tlsr   r   retryr   )
extensionsgetr/   r   RETRIES_BACKOFF_FACTORr1   r*   rL   decoderM   r0   r6   r   loggerr2   rN   return_valuerP   schemer+   r   r.   set_alpn_protocolsrS   r   r   nextsleep)r7   r9   timeoutsrI   rH   retries_leftdelayskwargstracer=   r!   alpn_protocolsdelayr   r   r   rA   g   s|   





zHTTPConnection._connectc                 C   s
   || j kS N)r*   )r7   r    r   r   r   r>      s   
z!HTTPConnection.can_handle_requestc                 C   sL   | j d ur$tdtd i  | j   W d    d S 1 sw   Y  d S d S )Nclose)r3   r   rY   rg   r7   r   r   r   rg      s
   
"zHTTPConnection.closec                 C   s6   | j d u r| jo| jjdkp| j o| j S | j  S )NrQ   )r3   r.   r*   r[   r-   r4   is_availablerh   r   r   r   ri      s   

zHTTPConnection.is_availablec                 C      | j d u r| jS | j  S rf   )r3   r4   has_expiredrh   r   r   r   rk         

zHTTPConnection.has_expiredc                 C   rj   rf   )r3   r4   is_idlerh   r   r   r   rm      rl   zHTTPConnection.is_idlec                 C   rj   rf   )r3   r4   	is_closedrh   r   r   r   rn      rl   zHTTPConnection.is_closedc                 C   s"   | j d u r| jr
dS dS | j  S )NzCONNECTION FAILED
CONNECTING)r3   r4   inforh   r   r   r   rp      s   

zHTTPConnection.infoc                 C   s   d| j j d|   dS )N<z [z]>)	__class____name__rp   rh   r   r   r   __repr__   s   zHTTPConnection.__repr__c                 C   s   | S rf   r   rh   r   r   r   	__enter__   s   zHTTPConnection.__enter__exc_type	exc_value	tracebackc                 C   s   |    d S rf   )rg   )r7   rv   rw   rx   r   r   r   __exit__   s   zHTTPConnection.__exit__)	NNTFr   NNNN)r   N)r   r   )NNN)!rs   
__module____qualname__r   r   ssl
SSLContextfloatboolintstrr
   r   r	   r8   r   r   rE   r   rA   r>   rg   ri   rk   rm   rn   rp   rt   ru   r   rD   r   ry   r   r   r   r   r   $   sp    	


$>


r   )'r   loggingr|   typesr   typingr   r   r   r   _backends.syncr   _backends.baser	   r
   r   _exceptionsr   r   _modelsr   r   r   _sslr   _synchronizationr   _tracer   http11r   
interfacesr   rW   	getLoggerrY   r~   r   r   r   r   r   r   <module>   s$    
