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	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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" e #d¡Z$ddd„Z%G dd„ dej&ƒZ'G dd„ de"ƒZ(G dd„ dƒZ)dS )é    )ÚannotationsN)ÚAsyncGeneratoré   )ÚAsyncNetworkStream)ÚConnectionNotAvailableÚLocalProtocolErrorÚRemoteProtocolError)ÚOriginÚRequestÚResponse)Ú	AsyncLockÚAsyncSemaphoreÚAsyncShieldCancellation)ÚTrace)Úsafe_async_iterateé   )ÚAsyncConnectionInterfacezhttpcore2.http2Úrequestr
   ÚreturnÚboolc                 C  s   t dd„ | jD ƒƒS )Nc                 s  s,   � | ]\}}|  ¡ d kp|  ¡ dkV  qdS )s   content-lengthó   transfer-encodingN©Úlower)Ú.0ÚkÚ_v© r   úY/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/httpcore2/_async/http2.pyÚ	<genexpr>   s   €* z#has_body_headers.<locals>.<genexpr>)ÚanyÚheaders)r   r   r   r   Úhas_body_headers   s   r!   c                   @  s   e Zd ZdZdZdZdS )ÚHTTPConnectionStater   r   é   N)Ú__name__Ú
__module__Ú__qualname__ÚACTIVEÚIDLEÚCLOSEDr   r   r   r   r"      s    r"   c                   @  sD  e Zd ZdZejjdd�Z	d[d\dd„Zd]dd„Z	d^dd„Z
d_dd„Zd_dd„Zd`dd„Zd_d d!„Zdad#d$„Zdbd&d'„Zdcd)d*„Zd[ddd,d-„Zded0d1„Zdfd2d3„Zdgd4d5„Zdhd7d8„Zd^d9d:„Zdid;d<„Zdjd>d?„Zdkd@dA„ZdkdBdC„ZdkdDdE„ZdkdFdG„ZdkdHdI„ZdkdJdK„ZdldMdN„Z dldOdP„Z!dmdQdR„Z"			dndodYdZ„Z#dS )pÚAsyncHTTP2Connectioné   F)Úvalidate_inbound_headersNÚoriginr	   Ústreamr   Úkeepalive_expiryúfloat | Nonec                 C  s†   || _ || _|| _tjj| jd�| _tj	| _
d | _d| _tƒ | _tƒ | _tƒ | _tƒ | _d| _d| _d| _i | _d | _d | _d | _d S )N)Úconfigr   F)Ú_originÚ_network_streamÚ_keepalive_expiryÚh2Ú
connectionÚH2ConnectionÚCONFIGÚ	_h2_stater"   r(   Ú_stateÚ
_expire_atÚ_request_countr   Ú
_init_lockÚ_state_lockÚ
_read_lockÚ_write_lockÚ_sent_connection_initÚ_used_all_stream_idsÚ_connection_errorÚ_eventsÚ_connection_terminatedÚ_read_exceptionÚ_write_exception)Úselfr-   r.   r/   r   r   r   Ú__init__)   s&   ý
zAsyncHTTP2Connection.__init__r   r
   r   r   c                 Ã  sT  �|   |jj¡std|jj› d| j› �ƒ‚| j4 I d H š& | jtjtj	fv r5|  j
d7  _
d | _tj| _ntƒ ‚W d   ƒI d H  n1 I d H sHw   Y  | j4 I d H šŒ | jsÖz2d|i}tdt||ƒ4 I d H š | jdi |¤ŽI d H  W d   ƒI d H  n1 I d H s„w   Y  W n) ty³ } ztƒ � |  ¡ I d H  W d   ƒ |‚1 s¨w   Y  |‚d }~ww d| _d| _| jjj}t|ƒ| _t|| j ƒD ]
}| j ¡ I d H  qËW d   ƒI d H  n1 I d H sæw   Y  | j ¡ I d H  z| j ¡ }g | j|< W n tj j!�y   d| _"|  j
d8  _
| j #¡ I d H  tƒ ‚w z£||dœ}tdt||ƒ4 I d H š | j$||d�I d H  W d   ƒI d H  n1 I d H �sLw   Y  td	t||ƒ4 I d H š | j%||d�I d H  W d   ƒI d H  n1 I d H �sxw   Y  td
t||ƒ4 I d H š}| j&||d�I d H \}	}
|	|
f|_'W d   ƒI d H  n1 I d H �s«w   Y  t(|	|
t)| ||d�d| j*|dœd�W S  t�y) } zZtƒ �7 d|i}tdt||ƒ4 I d H š | j+|d�I d H  W d   ƒI d H  n1 I d H �sùw   Y  W d   ƒ n	1 �s	w   Y  t,|tj j-ƒ�r#| j.�rt/| j.ƒ‚t0|ƒ‚|‚d }~ww )NzAttempted to send request to z on connection to r   r   Úsend_connection_initT©r   Ú	stream_idÚsend_request_headersÚsend_request_bodyÚreceive_response_headers©rL   s   HTTP/2)Úhttp_versionÚnetwork_streamrL   )Ústatusr    ÚcontentÚ
extensionsrL   Úresponse_closedr   )1Úcan_handle_requestÚurlr-   ÚRuntimeErrorr2   r>   r:   r"   r'   r(   r<   r;   r   r=   rA   r   ÚloggerÚ_send_connection_initÚBaseExceptionr   ÚacloseÚ_max_streamsr9   Úlocal_settingsÚmax_concurrent_streamsr   Ú_max_streams_semaphoreÚrangeÚacquireÚget_next_available_stream_idrD   r5   Ú
exceptionsÚNoAvailableStreamIDErrorrB   ÚreleaseÚ_send_request_headersÚ_send_request_bodyÚ_receive_responseÚreturn_valuer   ÚHTTP2ConnectionByteStreamr3   Ú_response_closedÚ
isinstanceÚProtocolErrorrE   r   r   )rH   r   Ú
sci_kwargsÚexcÚlocal_settings_max_streamsÚ_rL   ÚkwargsÚtracerS   r    r   r   r   Úhandle_async_requestK   s¢   €
(ú(ÿ€
ÿþ€ý

€(ë
ü
*ÿ*ÿ*þýü
*ÿ€þ

€êz)AsyncHTTP2Connection.handle_async_requestÚNonec                 Ã  sn   �t jjdt jjjdt jjjdt jjjdid�| j_| jjt jjj	= | j 
¡  | j d¡ |  |¡I dH  dS )z�
        The HTTP/2 connection requires some initial setup before we can start
        using individual request/response streams on it.
        Tr   éd   r+   )ÚclientÚinitial_valuesé   N)r5   ÚsettingsÚSettingsÚSettingCodesÚENABLE_PUSHÚMAX_CONCURRENT_STREAMSÚMAX_HEADER_LIST_SIZEr9   r_   ÚENABLE_CONNECT_PROTOCOLÚinitiate_connectionÚincrement_flow_control_windowÚ_write_outgoing_data)rH   r   r   r   r   r[   ©   s   €


ú
þ
z*AsyncHTTP2Connection._send_connection_initrL   Úintc                 Ã  sŒ   �t |ƒ }dd„ |jD ƒd }d|jfd|fd|jjfd|jjfgdd„ |jD ƒ }| jj|||d	� | jjd
|d� |  	|¡I dH  dS )z@
        Send the request headers to a given stream ID.
        c                 S  s    g | ]\}}|  ¡ d kr|‘qS )ó   hostr   ©r   r   Úvr   r   r   Ú
<listcomp>Ò   s     z>AsyncHTTP2Connection._send_request_headers.<locals>.<listcomp>r   s   :methods
   :authoritys   :schemes   :pathc                 S  s(   g | ]\}}|  ¡ d vr|  ¡ |f‘qS ))r‡   r   r   rˆ   r   r   r   rŠ   Ù   s    ÿ
þ)Ú
end_streamr{   rP   N)
r!   r    ÚmethodrX   ÚschemeÚtargetr9   Úsend_headersr„   r…   )rH   r   rL   r‹   Ú	authorityr    r   r   r   rh   È   s   €


üþûz*AsyncHTTP2Connection._send_request_headersc              	   Ã  sœ   �t |ƒsdS t|jtjƒsJ ‚t|jƒ4 I dH š}|2 z3 dH W }|  |||¡I dH  q6 W d  ƒI dH  n1 I dH s>w   Y  |  ||¡I dH  dS )zP
        Iterate over the request body sending it to a given stream ID.
        N)r!   rn   r.   ÚtypingÚAsyncIterabler   Ú_send_stream_dataÚ_send_end_stream)rH   r   rL   ÚiteratorÚchunkr   r   r   ri   ç   s   €ÿ(ÿz'AsyncHTTP2Connection._send_request_bodyÚdataÚbytesc                 Ã  sr   �d}|t |ƒk r7|  ||¡I dH }|||| … }|t |ƒ7 }| j ||¡ |  |¡I dH  |t |ƒk s	dS dS )zI
        Send a single chunk of data in one or more data frames.
        r   N)ÚlenÚ_wait_for_outgoing_flowr9   Ú	send_datar…   )rH   r   rL   r—   ÚpositionÚmax_flowr–   r   r   r   r“   õ   s   €ûz&AsyncHTTP2Connection._send_stream_datac                 Ã  s"   �| j  |¡ |  |¡I dH  dS )z`
        Send an empty data frame on on a given stream ID with the END_STREAM flag set.
        N)r9   r‹   r…   )rH   r   rL   r   r   r   r”     s   €z%AsyncHTTP2Connection._send_end_streamú%tuple[int, list[tuple[bytes, bytes]]]c                 Ã  sŠ   �	 |   ||¡I dH }t|tjjƒrnqd}g }|jdusJ ‚|jD ]\}}|dkr4t|jddd�ƒ}q"| d¡s@| 	||f¡ q"||fS )	zT
        Return the response status code and headers for a given stream ID.
        TNéÈ   s   :statusÚasciiÚignore)Úerrorsó   :)
Ú_receive_stream_eventrn   r5   ÚeventsÚResponseReceivedr    r†   ÚdecodeÚ
startswithÚappend)rH   r   rL   ÚeventÚstatus_coder    r   r‰   r   r   r   rj   
  s    €ý
€z&AsyncHTTP2Connection._receive_responseúAsyncGenerator[bytes]c                 C s‚   �	 |   ||¡I dH }t|tjjƒr7|jdusJ ‚|jdus J ‚|j}| j ||¡ |  	|¡I dH  |jV  n	t|tjj
ƒr@dS q)z]
        Iterator that returns the bytes of the response body for a given stream ID.
        TN)r¤   rn   r5   r¥   ÚDataReceivedÚflow_controlled_lengthr—   r9   Úacknowledge_received_datar…   ÚStreamEnded)rH   r   rL   rª   Úamountr   r   r   Ú_receive_response_body  s   €
öz+AsyncHTTP2Connection._receive_response_bodyúKh2.events.ResponseReceived | h2.events.DataReceived | h2.events.StreamEndedc                 Ã  sV   �| j  |¡s|  ||¡I dH  | j  |¡r| j |  d¡}t|tjjƒr)t|ƒ‚|S )zƒ
        Return the next available event for a given stream ID.

        Will read more data from the network if required.
        Nr   )	rD   ÚgetÚ_receive_eventsÚpoprn   r5   r¥   ÚStreamResetr   )rH   r   rL   rª   r   r   r   r¤   .  s   €ÿz*AsyncHTTP2Connection._receive_stream_eventú
int | Nonec                 Ã  sz  �| j 4 I dH š  | jdur)| jj}|r$|r$||kr$|  jd8  _tƒ ‚t| jƒ‚|du s3| j |¡sž|  |¡I dH }|D ]`}t	|t
jjƒrrtdt|ƒ4 I dH š}|  |¡I dH  ||_W d  ƒI dH  n1 I dH slw   Y  q=t	|t
jjt
jjt
jjt
jjfƒr“|j| jv r’| j|j  |¡ q=t	|t
jjƒr�|| _q=W d  ƒI dH  n1 I dH s®w   Y  |  |¡I dH  dS )zp
        Read some data from the network until we see one or more events
        for a given stream ID.
        Nr   Úreceive_remote_settings)r?   rE   Úlast_stream_idr<   r   r   rD   r´   Ú_read_incoming_datarn   r5   r¥   ÚRemoteSettingsChangedr   rZ   Ú_receive_remote_settings_changerk   r¦   r­   r°   r·   rL   r©   ÚConnectionTerminatedr…   )rH   r   rL   rº   r¥   rª   ru   r   r   r   rµ   =  sB   €

(þ€üþ	€€(Ý%z$AsyncHTTP2Connection._receive_eventsrª   úh2.events.RemoteSettingsChangedc                 Ã  s°   �|j  tjjj¡}|rPt|j| jj	j
ƒ}|rR|| jkrT|| jkr5| j ¡ I d H  |  jd7  _|| jks!|| jk rV| j ¡ I d H  |  jd8  _|| jk s:d S d S d S d S d S )Nr   )Úchanged_settingsr´   r5   r|   r~   r€   ÚminÚ	new_valuer9   r_   r`   r^   ra   rg   rc   )rH   rª   r`   Únew_max_streamsr   r   r   r½   i  s&   €þ

þ
þ÷z4AsyncHTTP2Connection._receive_remote_settings_changec              	   Ã  s$  �| j 4 I d H š} || jv r| j ¡ I d H  | j|= | jr(| js(|  ¡ I d H  n<| jtjkrY| jsotj	| _| j
d urDt ¡ }|| j
 | _| jrz|  ¡ I d H  W d   ƒI d H  d S W d   ƒI d H  d S W d   ƒI d H  d S W d   ƒI d H  d S W d   ƒI d H  d S 1 I d H s‹w   Y  d S ©N)r>   rD   ra   rg   rE   r]   r:   r"   r'   r(   r4   ÚtimeÚ	monotonicr;   rB   )rH   rL   Únowr   r   r   rm   x  s.   €

óùûù.ôz%AsyncHTTP2Connection._response_closedc                 Ã  s(   �| j  ¡  tj| _| j ¡ I d H  d S rÄ   )r9   Úclose_connectionr"   r)   r:   r3   r]   ©rH   r   r   r   r]   ˆ  s   €
zAsyncHTTP2Connection.acloseúlist[h2.events.Event]c              
   Ã  s�   �|j  di ¡}| dd ¡}| jd ur| j‚z| j | j|¡I d H }|dkr*tdƒ‚W n ty? } z|| _d| _|‚d }~ww | j	 
|¡}|S )NÚtimeoutÚreadó    zServer disconnectedT)rU   r´   rF   r3   rÌ   ÚREAD_NUM_BYTESr   Ú	ExceptionrC   r9   Úreceive_data)rH   r   ÚtimeoutsrË   r—   rq   r¥   r   r   r   r»   ‘  s$   €
ÿ	€õz(AsyncHTTP2Connection._read_incoming_datac                 Ã  s¸   �|j  di ¡}| dd ¡}| j4 I d H š: | j ¡ }| jd ur#| j‚z| j ||¡I d H  W n tyC } z|| _d| _	|‚d }~ww W d   ƒI d H  d S 1 I d H sUw   Y  d S )NrË   ÚwriteT)
rU   r´   r@   r9   Údata_to_sendrG   r3   rÒ   rÏ   rC   )rH   r   rÑ   rË   rÓ   rq   r   r   r   r…   ­  s"   €

	€õÿ.ùz)AsyncHTTP2Connection._write_outgoing_datac                 Ã  sb   �| j  |¡}| j j}t||ƒ}|dkr/|  |¡I dH  | j  |¡}| j j}t||ƒ}|dks|S )a  
        Returns the maximum allowable outgoing flow for a given stream.

        If the allowable flow is zero, then waits on the network until
        WindowUpdated frames have increased the flow rate.
        https://tools.ietf.org/html/rfc7540#section-6.9
        r   N)r9   Úlocal_flow_control_windowÚmax_outbound_frame_sizerÁ   rµ   )rH   r   rL   Ú
local_flowÚmax_frame_sizeÚflowr   r   r   rš   È  s   €

üz,AsyncHTTP2Connection._wait_for_outgoing_flowr   c                 C  s
   || j kS rÄ   )r2   ©rH   r-   r   r   r   rW   Ü  ó   
z'AsyncHTTP2Connection.can_handle_requestc                 C  s
   |   ¡  S rÄ   )Ú	is_closedrÉ   r   r   r   Úis_connectedß  rÚ   z!AsyncHTTP2Connection.is_connectedc                 C  s2   | j tjko| j o| j o| jjjtj	j
jk S rÄ   )r:   r"   r)   rC   rB   r9   Ústate_machineÚstater5   r6   ÚConnectionStaterÉ   r   r   r   Úis_availableâ  s   ÿþüz!AsyncHTTP2Connection.is_availablec                 C  s   t  ¡ }| j}|d uo||kS rÄ   )rÅ   rÆ   r;   )rH   rÇ   Ú	expire_atr   r   r   Úhas_expiredê  s   z AsyncHTTP2Connection.has_expiredc                 C  ó   | j tjkS rÄ   )r:   r"   r(   rÉ   r   r   r   Úis_idleñ  ó   zAsyncHTTP2Connection.is_idlec                 C  s   dS )NTr   rÉ   r   r   r   Úcan_multiplexô  s   z"AsyncHTTP2Connection.can_multiplexc                 C  rã   rÄ   )r:   r"   r)   rÉ   r   r   r   rÛ   ÷  rå   zAsyncHTTP2Connection.is_closedÚstrc                 C  s$   t | jƒ}|›d| jj› d| j› �S )Nz
, HTTP/2, ú, Request Count: )rç   r2   r:   Únamer<   rÙ   r   r   r   Úinfoú  s   
zAsyncHTTP2Connection.infoc              	   C  s6   | j j}t| jƒ}d|› d|›d| jj› d| j› d�	S )Nú<z [z, rè   z]>)Ú	__class__r$   rç   r2   r:   ré   r<   )rH   Ú
class_namer-   r   r   r   Ú__repr__þ  s   
$zAsyncHTTP2Connection.__repr__c                 Ã  s   �| S rÄ   r   rÉ   r   r   r   Ú
__aenter__  s   €zAsyncHTTP2Connection.__aenter__Úexc_typeútype[BaseException] | NoneÚ	exc_valueúBaseException | NoneÚ	tracebackútypes.TracebackType | Nonec                 Ã  s   �|   ¡ I d H  d S rÄ   )r]   )rH   rð   rò   rô   r   r   r   Ú	__aexit__	  s   €zAsyncHTTP2Connection.__aexit__rÄ   )r-   r	   r.   r   r/   r0   )r   r
   r   r   )r   r
   r   rw   )r   r
   rL   r†   r   rw   )r   r
   rL   r†   r—   r˜   r   rw   )r   r
   rL   r†   r   rž   )r   r
   rL   r†   r   r¬   )r   r
   rL   r†   r   r³   )r   r
   rL   r¸   r   rw   )rª   r¿   r   rw   )rL   r†   r   rw   ©r   rw   )r   r
   r   rÊ   )r   r
   rL   r†   r   r†   )r-   r	   r   r   )r   r   )r   rç   )r   r*   )NNN)rð   rñ   rò   ró   rô   rõ   r   rw   )$r$   r%   r&   rÎ   r5   r1   ÚH2Configurationr8   rI   rv   r[   rh   ri   r“   r”   rj   r²   r¤   rµ   r½   rm   r]   r»   r…   rš   rW   rÜ   rà   râ   rä   ræ   rÛ   rê   rî   rï   rö   r   r   r   r   r*   %   sF    ü
"
^




	


,


	











ür*   c                   @  s*   e Zd Zdd	d
„Zddd„Zddd„ZdS )rl   r6   r*   r   r
   rL   r†   r   rw   c                 C  s   || _ || _|| _d| _d S )NF)Ú_connectionÚ_requestÚ
_stream_idÚ_closed)rH   r6   r   rL   r   r   r   rI     s   
z"HTTP2ConnectionByteStream.__init__r¬   c                 C s  �| j | jdœ}zZtdt| j |ƒ4 I d H š@ t| jj| j | jd�ƒ4 I d H š}|2 z	3 d H W }|V  q)6 W d   ƒI d H  n1 I d H sDw   Y  W d   ƒI d H  W d S 1 I d H s[w   Y  W d S  ty‹ } ztƒ � |  	¡ I d H  W d   ƒ |‚1 s€w   Y  |‚d }~ww )NrK   Úreceive_response_body)
rú   rû   r   rZ   r   rù   r²   r\   r   r]   )rH   rt   r•   r–   rq   r   r   r   Ú	__aiter__  s,   €ÿÿ*ý2ÿ
ÿþ€úz#HTTP2ConnectionByteStream.__aiter__c              	   Ã  s|   �| j s<d| _ d| ji}tdt| j|ƒ4 I d H š | jj| jd�I d H  W d   ƒI d H  d S 1 I d H s5w   Y  d S d S )NTrL   rV   rP   )rü   rû   r   rZ   rú   rù   rm   )rH   rt   r   r   r   r]   *  s   €
.ÿýz HTTP2ConnectionByteStream.acloseN)r6   r*   r   r
   rL   r†   r   rw   )r   r¬   r÷   )r$   r%   r&   rI   rþ   r]   r   r   r   r   rl     s    

rl   )r   r
   r   r   )*Ú
__future__r   ÚenumÚloggingrÅ   Útypesr‘   Úcollections.abcr   Ú	h2.configr5   Úh2.connectionÚ	h2.eventsÚh2.exceptionsÚh2.settingsÚ_backends.baser   Ú_exceptionsr   r   r   Ú_modelsr	   r
   r   Ú_synchronizationr   r   r   Ú_tracer   Ú_utilsr   Ú
interfacesr   Ú	getLoggerrZ   r!   ÚIntEnumr"   r*   rl   r   r   r   r   Ú<module>   s6    

   p