o
    i!                     @  s   d dl mZ d dlZd dlZ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 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ddZ!G dd deZ"dS )    )annotationsN   )AutoBackend)SOCKET_OPTIONAsyncNetworkBackendAsyncNetworkStream)ConnectErrorConnectTimeout)OriginRequestResponse)default_ssl_context)	AsyncLock)Trace   )AsyncHTTP11Connection)AsyncConnectionInterfaceg      ?zhttpcore.connectionfactorfloatreturntyping.Iterator[float]c                 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   T/home/kim/smarthome/.venv/lib/python3.10/site-packages/httpcore/_async/connection.pyexponential_backoff   s
   r   c                   @  s   e Zd Z									d>d?ddZd@ddZdAd!d"ZdBd#d$ZdCd%d&ZdDd'd(ZdDd)d*Z	dDd+d,Z
dDd-d.ZdEd0d1ZdEd2d3ZdFd4d5Z			dGdHd<d=ZdS )IAsyncHTTPConnectionNTFr   originr
   ssl_contextssl.SSLContext | Nonekeepalive_expiryfloat | Nonehttp1boolhttp2retriesintlocal_address
str | Noneudsnetwork_backendAsyncNetworkBackend | Nonesocket_options%typing.Iterable[SOCKET_OPTION] | Noner   Nonec                 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AsyncHTTPConnection.__init__requestr   r   c              
     s  |  |jjstd|jj d| j z^| j4 I d H J | jd u r]| |I d H }|d}|d uo9|	 dk}|sB| j
rS| jsSddlm} || j|| jd| _n
t| j|| jd| _W d   I d H  n1 I d H smw   Y  W n ty } zd| _|d }~ww | j|I d H S )	NzAttempted to send request to z on connection to 
ssl_objecth2r   )AsyncHTTP2Connection)r   streamr!   T)can_handle_requesturlr   RuntimeErrorr0   r;   r9   _connectZget_extra_infoselected_alpn_protocolr4   r3   r%   rB   r2   r   BaseExceptionr:   handle_async_request)r=   r?   rC   r@   Zhttp2_negotiatedrB   excr   r   r   rJ   E   sB   




(z(AsyncHTTPConnection.handle_async_requestr   c                   s  |j di }|j dd }|dd }| j}ttd}	 z| jd u rf| jjd| jj	| j
|| jd}tdt||4 I d H }| jjdi |I d H }	|	|_W d   I d H  n1 I d H s`w   Y  n8| j|| jd	}td
t||4 I d H }| jjdi |I d H }	|	|_W d   I d H  n1 I d H sw   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||4 I d H }|	jdi |I d H }	|	|_W d   I d H  |	W S 1 I d H sw   Y  |	W S  ttfyC   |dkr |d8 }t|}tdt||4 I d H }| j|I d H  W d   I d H  n1 I d H s<w   Y  Y nw q)Ntimeoutsni_hostnameconnect)r   Tascii)hostportr(   rL   r-   connect_tcp)pathrL   r-   connect_unix_socket)   httpss   wsszhttp/1.1rA   )r   server_hostnamerL   	start_tlsr   r   retryr   )
extensionsgetr5   r   RETRIES_BACKOFF_FACTORr7   r0   rP   decoderQ   r6   r<   r   loggerr8   rR   return_valuerT   schemer1   r   r4   set_alpn_protocolsrW   r   r	   nextsleep)r=   r?   ZtimeoutsrM   rL   Zretries_leftZdelayskwargstracerC   r   alpn_protocolsdelayr   r   r   rG   i   s~   

(
(


*zAsyncHTTPConnection._connectc                 C  s
   || j kS N)r0   )r=   r   r   r   r   rD      s   
z&AsyncHTTPConnection.can_handle_requestc              	     sh   | j d ur2tdtd i 4 I d H  | j  I d H  W d   I d H  d S 1 I d H s+w   Y  d S d S )Nclose)r9   r   r]   acloser=   r   r   r   ri      s   
.zAsyncHTTPConnection.aclosec                 C  s6   | j d u r| jo| jjdkp| j o| j S | j  S )NrU   )r9   r4   r0   r_   r3   r:   is_availablerj   r   r   r   rk      s   

z AsyncHTTPConnection.is_availablec                 C     | j d u r| jS | j  S rg   )r9   r:   has_expiredrj   r   r   r   rm         

zAsyncHTTPConnection.has_expiredc                 C  rl   rg   )r9   r:   is_idlerj   r   r   r   ro      rn   zAsyncHTTPConnection.is_idlec                 C  rl   rg   )r9   r:   	is_closedrj   r   r   r   rp      rn   zAsyncHTTPConnection.is_closedstrc                 C  s"   | j d u r| jr
dS dS | j  S )NzCONNECTION FAILEDZ
CONNECTING)r9   r:   inforj   r   r   r   rr      s   

zAsyncHTTPConnection.infoc                 C  s   d| j j d|   dS )N<z [z]>)	__class____name__rr   rj   r   r   r   __repr__   s   zAsyncHTTPConnection.__repr__c                   s   | S rg   r   rj   r   r   r   
__aenter__   s   zAsyncHTTPConnection.__aenter__exc_typetype[BaseException] | None	exc_valueBaseException | None	tracebacktypes.TracebackType | Nonec                   s   |   I d H  d S rg   )ri   )r=   rx   rz   r|   r   r   r   	__aexit__   s   zAsyncHTTPConnection.__aexit__)	NNTFr   NNNN)r   r
   r   r    r!   r"   r#   r$   r%   r$   r&   r'   r(   r)   r*   r)   r+   r,   r-   r.   r   r/   )r?   r   r   r   )r?   r   r   r   )r   r
   r   r$   )r   r/   )r   r$   )r   rq   )r   r   )NNN)rx   ry   rz   r{   r|   r}   r   r/   )ru   
__module____qualname__r>   rJ   rG   rD   ri   rk   rm   ro   rp   rr   rv   rw   r~   r   r   r   r   r   &   s4    

$
>







r   )r   r   r   r   )#
__future__r   r   loggingssltypestypingZ_backends.autor   Z_backends.baser   r   r   _exceptionsr   r	   Z_modelsr
   r   r   _sslr   Z_synchronizationr   _tracer   Zhttp11r   Z
interfacesr   r[   	getLoggerr]   r   r   r   r   r   r   <module>   s&    

