o
    óT·jž  ã                   @  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é   )ÚSyncBackend)ÚSOCKET_OPTIONÚNetworkBackendÚNetworkStream)ÚConnectErrorÚConnectTimeout)ÚOriginÚRequestÚResponse)Údefault_ssl_context)ÚLock)ÚTraceé   )ÚHTTP11Connection)ÚConnectionInterfaceg      à?zhttpcore2.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   ú]/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/httpcore2/_sync/connection.pyÚexponential_backoff   s
   €ÿr   c                   @  s¾   e Zd Z									dBdCdd„ZdDdd„ZdEd!d"„ZdFd#d$„ZdGd%d&„ZdHd'd(„ZdHd)d*„Z	dHd+d,„Z
dHd-d.„ZdHd/d0„ZdHd1d2„ZdId4d5„ZdId6d7„ZdJd8d9„Z			dKdLd@dA„ZdS )MÚHTTPConnectionNTFr   Úoriginr
   Ússl_contextússl.SSLContext | NoneÚkeepalive_expiryúfloat | NoneÚhttp1ÚboolÚhttp2ÚretriesÚintÚlocal_addressú
str | NoneÚudsÚnetwork_backendúNetworkBackend | 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HTTPConnection.__init__Úrequestr   r   c              
   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   ÚRuntimeErrorr0   r;   r9   Ú_connectÚget_extra_infoÚselected_alpn_protocolr4   r3   r%   rB   r2   r   ÚBaseExceptionr:   Úhandle_request)r=   r?   rC   r@   Úhttp2_negotiatedrB   Úexcr   r   r   rK   C   s:   



ýý€ñ€€þzHTTPConnection.handle_requestr   c                 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 r‘tƒ n| j}
| jr¡| jržddgndgndg}|
 |¡ |
|p²| jj d¡|dœ}tdt||ƒ�}|	jdi |¤Ž}	|	|_W d   ƒ |	W S 1 sÕw   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(   rN   r-   Úconnect_tcp)ÚpathrN   r-   Úconnect_unix_socket)ó   httpss   wssrA   zhttp/1.1)r   Úserver_hostnamerN   Ú	start_tlsr   r   Úretryr   )Ú
extensionsÚgetr5   r   ÚRETRIES_BACKOFF_FACTORr7   r0   rR   ÚdecoderS   r6   r<   r   Úloggerr8   rT   Úreturn_valuerV   Úschemer1   r   r4   r3   Úset_alpn_protocolsrY   r   r	   ÚnextÚsleep)r=   r?   ÚtimeoutsrO   rN   Úretries_leftÚdelaysÚkwargsÚtracerC   r   Úalpn_protocolsÚdelayr   r   r   rG   b   sj   

ûþ€ýþ 
ý
þýÿ€ûÛzHTTPConnection._connectc                 C  s
   || j kS ©N)r0   )r=   r   r   r   r   rD   —   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)r9   r   r_   rm   ©r=   r   r   r   rm   š   s
   
"ÿÿzHTTPConnection.closec                 C  ó   | j d uo	| j  ¡ S rl   )r9   Úis_connectedrn   r   r   r   rp   Ÿ   ó   zHTTPConnection.is_connectedc                 C  s6   | j d u r| jo| jjdks| j o| j S | j  ¡ S )NrW   )r9   r4   r0   ra   r3   r:   Úis_availablern   r   r   r   rr   ¢   s   
"
zHTTPConnection.is_availablec                 C  ó   | j d u r| jS | j  ¡ S rl   )r9   r:   Úhas_expiredrn   r   r   r   rt   ª   ó   

zHTTPConnection.has_expiredc                 C  rs   rl   )r9   r:   Úis_idlern   r   r   r   rv   ¯   ru   zHTTPConnection.is_idlec                 C  ro   rl   )r9   Úcan_multiplexrn   r   r   r   rw   ´   rq   zHTTPConnection.can_multiplexc                 C  rs   rl   )r9   r:   Ú	is_closedrn   r   r   r   rx   ·   ru   zHTTPConnection.is_closedÚstrc                 C  s"   | j d u r| jr
dS dS | j  ¡ S )NzCONNECTION FAILEDÚ
CONNECTING)r9   r:   Úinforn   r   r   r   r{   ¼   s   

zHTTPConnection.infoc                 C  s   d| j j› d|  ¡ › d�S )Nú<z [z]>)Ú	__class__Ú__name__r{   rn   r   r   r   Ú__repr__Á   s   zHTTPConnection.__repr__c                 C  s   | S rl   r   rn   r   r   r   Ú	__enter__Ç   s   zHTTPConnection.__enter__Úexc_typeútype[BaseException] | NoneÚ	exc_valueúBaseException | NoneÚ	tracebackútypes.TracebackType | Nonec                 C  s   |   ¡  d S rl   )rm   )r=   r�   rƒ   r…   r   r   r   Ú__exit__Ê   s   zHTTPConnection.__exit__)	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   ry   )r   r   )NNN)r�   r‚   rƒ   r„   r…   r†   r   r/   )r~   Ú
__module__Ú__qualname__r>   rK   rG   rD   rm   rp   rr   rt   rv   rw   rx   r{   r   r€   r‡   r   r   r   r   r   &   s8    õ


5









ür   )r   r   r   r   )#Ú
__future__r   r   ÚloggingÚsslÚtypesÚtypingÚ_backends.syncr   Ú_backends.baser   r   r   Ú_exceptionsr   r	   Ú_modelsr
   r   r   Ú_sslr   Ú_synchronizationr   Ú_tracer   Úhttp11r   Ú
interfacesr   r]   Ú	getLoggerr_   r   r   r   r   r   r   Ú<module>   s&    

