U
    h!                     @  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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floatztyping.Iterator[float])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   >/tmp/pip-unpacked-wheel-a8helrha/httpcore/_async/connection.pyexponential_backoff   s    r   c                   @  s   e Zd Zd4dddddd	d
d
ddddddZdddddZdddddZdddddZddddZdddd Zddd!d"Z	ddd#d$Z
ddd%d&Zd'dd(d)Zd'dd*d+Zd dd,d-Zd5d.d/d0dd1d2d3ZdS )6AsyncHTTPConnectionNTFr   r
   zssl.SSLContext | Nonezfloat | Noneboolintz
str | NonezAsyncNetworkBackend | Nonez%typing.Iterable[SOCKET_OPTION] | NoneNone)originssl_contextkeepalive_expiryhttp1http2retrieslocal_addressudsnetwork_backendsocket_optionsr   c                 C  sb   || _ || _|| _|| _|| _|| _|| _|| _|	d k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__r   r   )requestr   c              
     s
  |  |jjs(td|jj d| j z| j4 I d H  | jd kr| |I d H }|d}|d k	op|	 dk}|s| j
r| jsddlm} || j|| jd| _nt| j|| jd| _W 5 Q I d H R X W n, tk
r } zd| _|W 5 d }~X Y nX | 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    RuntimeErrorr*   r5   r3   _connectZget_extra_infoselected_alpn_protocolr.   r-   r$   r<   r,   r   BaseExceptionr4   handle_async_request)r7   r9   r=   r:   Zhttp2_negotiatedr<   excr   r   r   rD   E   s8    



z(AsyncHTTPConnection.handle_async_requestr   c                   s  |j di }|j dd }|dd }| j}ttd}zj| jd kr| jjd| jj	| j
|| jd}tdt||4 I d H  }| jjf |I d H }	|	|_W 5 Q I d H R X nR| j|| jd}td	t||4 I d H  }| jjf |I d H }	|	|_W 5 Q I d H R X | jjd
kr| jd krt n| j}
| jr4ddgndg}|
| |
|pX| jjd|d}tdt||4 I d H }|	jf |I d H }	|	|_W 5 Q I d H R X |	W S  ttfk
r   |dkrƂ |d8 }t|}tdt||4 I d H }| j|I d H  W 5 Q I d H R X Y q8X 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   i   sl    

   



zAsyncHTTPConnection._connect)r    r   c                 C  s
   || j kS N)r*   )r7   r    r   r   r   r>      s    z&AsyncHTTPConnection.can_handle_request)r   c              
     sF   | j d k	rBtdtd i 4 I d H  | j  I d H  W 5 Q I d H R X d S )Nclose)r3   r   rW   acloser7   r   r   r   rb      s    
zAsyncHTTPConnection.aclosec                 C  s6   | j d kr,| jo*| jjdks$| j o*| j S | j  S )NrO   )r3   r.   r*   rX   r-   r4   is_availablerc   r   r   r   rd      s    
z AsyncHTTPConnection.is_availablec                 C  s   | j d kr| jS | j  S r`   )r3   r4   has_expiredrc   r   r   r   re      s    
zAsyncHTTPConnection.has_expiredc                 C  s   | j d kr| jS | j  S r`   )r3   r4   is_idlerc   r   r   r   rf      s    
zAsyncHTTPConnection.is_idlec                 C  s   | j d kr| jS | j  S r`   )r3   r4   	is_closedrc   r   r   r   rg      s    
zAsyncHTTPConnection.is_closedstrc                 C  s"   | j d kr| jrdS dS | j  S )NzCONNECTION FAILEDZ
CONNECTING)r3   r4   inforc   r   r   r   ri      s    
zAsyncHTTPConnection.infoc                 C  s   d| j j d|   dS )N<z [z]>)	__class____name__ri   rc   r   r   r   __repr__   s    zAsyncHTTPConnection.__repr__c                   s   | S r`   r   rc   r   r   r   
__aenter__   s    zAsyncHTTPConnection.__aenter__ztype[BaseException] | NonezBaseException | Noneztypes.TracebackType | None)exc_type	exc_value	tracebackr   c                   s   |   I d H  d S r`   )rb   )r7   ro   rp   rq   r   r   r   	__aexit__   s    zAsyncHTTPConnection.__aexit__)	NNTFr   NNNN)NNN)rl   
__module____qualname__r8   rD   rA   r>   rb   rd   re   rf   rg   ri   rm   rn   rr   r   r   r   r   r   &   s2            $$>   r   )#
__future__r   r   loggingssltypestypingZ_backends.autor   Z_backends.baser   r   r   _exceptionsr   r	   Z_modelsr
   r   r   _sslr   Z_synchronizationr   Z_tracer   Zhttp11r   Z
interfacesr   rU   	getLoggerrW   r   r   r   r   r   r   <module>   s$   
