o
    7'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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 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é   )ÚAsyncNetworkStream)ÚConnectionNotAvailableÚLocalProtocolErrorÚRemoteProtocolError)ÚOriginÚRequestÚResponse)Ú	AsyncLockÚAsyncSemaphoreÚAsyncShieldCancellation)ÚTraceé   )ÚAsyncConnectionInterfacezhttpcore.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   úKC:\Users\shubh\Videos\agent\nova\Lib\site-packages\httpcore/_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                   @  s2  e Zd ZdZejjdd�Z	dWdXdd„ZdYdd„Z	dZd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d_d)d*„Z	dWd`d,d-„Zdad0d1„Zdbd2d3„Zdcd4d5„Zddd7d8„ZdZd9d:„Zded;d<„Zdfd>d?„Zdgd@dA„ZdgdBdC„ZdgdDdE„ZdgdFdG„ZdhdIdJ„ZdhdKdL„ZdidMdN„Z 			djdkdUdV„Z!dS )lÚAsyncHTTP2Connectioné   F)Z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Ú
connectionZ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                 Ã  sD  �|   |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  _
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 �sDw   Y  td	t||ƒ4 I d H š | j$||d�I d H  W d   ƒI d H  n1 I d H �spw   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-ƒ‚t/|ƒ‚|‚d }~ww )NzAttempted to send request to z on connection to r   r   Zsend_connection_initT©r   Ú	stream_idZsend_request_headersZsend_request_bodyZreceive_response_headers©rH   s   HTTP/2)Úhttp_versionZnetwork_streamrH   )Ústatusr   ÚcontentÚ
extensionsrH   Úresponse_closedr   )0Úcan_handle_requestÚurlr+   ÚRuntimeErrorr0   r;   r7   r!   r&   r'   r9   r8   r   r:   r>   r   ÚloggerÚ_send_connection_initÚBaseExceptionr   ÚacloseÚ_max_streamsr6   Úlocal_settingsÚmax_concurrent_streamsr   Ú_max_streams_semaphoreÚrangeÚacquireZget_next_available_stream_idrA   r3   Ú
exceptionsZNoAvailableStreamIDErrorr?   Ú_send_request_headersÚ_send_request_bodyÚ_receive_responseÚreturn_valuer
   ÚHTTP2ConnectionByteStreamr1   Ú_response_closedÚ
isinstanceÚProtocolErrorrB   r   r   )rE   r   Z
sci_kwargsÚexcZlocal_settings_max_streamsÚ_rH   ÚkwargsÚtracerK   r   r   r   r   Úhandle_async_requestU   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*   )ÚclientZinitial_valuesé   N)r3   ÚsettingsZSettingsÚSettingCodesZENABLE_PUSHÚMAX_CONCURRENT_STREAMSZMAX_HEADER_LIST_SIZEr6   rW   ZENABLE_CONNECT_PROTOCOLZinitiate_connectionÚincrement_flow_control_windowÚ_write_outgoing_data)rE   r   r   r   r   rS   ½   s   €


ú
þÿ
z*AsyncHTTP2Connection._send_connection_initrH   Ú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   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 ))rt   r   r   r   r   r   r   ru   ï   s    ÿ
þ)Ú
end_streamrm   rI   N)
r    r   ÚmethodrP   ÚschemeÚtargetr6   Úsend_headersrq   rr   )rE   r   rH   rv   Ú	authorityr   r   r   r   r]   Þ   s   €


üþûz*AsyncHTTP2Connection._send_request_headersc                 Ã  s`   �t |ƒsdS t|jtjƒsJ ‚|j2 z3 dH W }|  |||¡I dH  q6 |  ||¡I dH  dS )zP
        Iterate over the request body sending it to a given stream ID.
        N)r    rc   r,   ÚtypingÚAsyncIterableÚ_send_stream_dataÚ_send_end_stream)rE   r   rH   Údatar   r   r   r^   ý   s   €ÿz'AsyncHTTP2Connection._send_request_bodyr€   Úbytesc                 Ã  sj   �|r3|   ||¡I dH }tt|ƒ|ƒ}|d|… ||d… }}| j ||¡ |  |¡I dH  |sdS dS )zI
        Send a single chunk of data in one or more data frames.
        N)Ú_wait_for_outgoing_flowÚminÚlenr6   Z	send_datarr   )rE   r   rH   r€   Zmax_flowÚ
chunk_sizeÚchunkr   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)r6   rv   rr   )rE   r   rH   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_eventrc   r3   ÚeventsÚResponseReceivedr   rs   ÚdecodeÚ
startswithÚappend)rE   r   rH   ÚeventÚstatus_coder   r   r   r   r   r   r_     s    €ý
€z&AsyncHTTP2Connection._receive_responseútyping.AsyncIterator[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�   rc   r3   rŽ   ÚDataReceivedZflow_controlled_lengthr€   r6   Zacknowledge_received_datarr   ÚStreamEnded)rE   r   rH   r“   Úamountr   r   r   Ú_receive_response_body5  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   )	rA   ÚgetÚ_receive_eventsÚpoprc   r3   rŽ   ÚStreamResetr   )rE   r   rH   r“   r   r   r   r�   G  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   Zreceive_remote_settings)r<   rB   Úlast_stream_idr9   r   r   rA   r›   Ú_read_incoming_datarc   r3   rŽ   ZRemoteSettingsChangedr   rR   Ú_receive_remote_settings_changer`   r�   r–   r—   rž   rH   r’   ZConnectionTerminatedrr   )rE   r   rH   r    rŽ   r“   rh   r   r   r   rœ   V  sH   €

ÿ(ü€üþ	€€(Û'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   )Zchanged_settingsr›   r3   rn   ro   rp   rƒ   Ú	new_valuer6   rW   rX   rV   rY   Úreleaser[   )rE   r“   rX   Znew_max_streamsr   r   r   r¢   †  s*   €ÿþ

þ
þ÷z4AsyncHTTP2Connection._receive_remote_settings_changec              	   Ã  s  �| j  ¡ I d H  | j|= | j4 I d H šl | jr#| js#|  ¡ I d H  n<| jtjkrT| jsjtj	| _| j
d ur?t ¡ }|| j
 | _| jru|  ¡ 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)rY   r¥   rA   r;   rB   rU   r7   r!   r&   r'   r2   ÚtimeÚ	monotonicr8   r?   )rE   rH   Únowr   r   r   rb   ™  s,   €
öüþü	.÷z%AsyncHTTP2Connection._response_closedc                 Ã  s(   �| j  ¡  tj| _| j ¡ I d H  d S r¦   )r6   Zclose_connectionr!   r(   r7   r1   rU   ©rE   r   r   r   rU   ¨  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)rM   r›   rC   r1   r­   ÚREAD_NUM_BYTESr   Ú	Exceptionr@   r6   Zreceive_data)rE   r   Útimeoutsr¬   r€   re   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)
rM   r›   r=   r6   Údata_to_sendrD   r1   r²   r°   r@   )rE   r   r±   r¬   r³   re   r   r   r   rr   Í  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)r6   Zlocal_flow_control_windowZmax_outbound_frame_sizerƒ   rœ   )rE   r   rH   Z
local_flowZmax_frame_sizeZflowr   r   r   r‚   è  s   €

üz,AsyncHTTP2Connection._wait_for_outgoing_flowr   c                 C  s
   || j kS r¦   )r0   ©rE   r+   r   r   r   rO   ü  s   
z'AsyncHTTP2Connection.can_handle_requestc                 C  s2   | j tjko| j o| j o| jjjtj	j
jk S r¦   )r7   r!   r(   r@   r?   r6   Zstate_machineÚstater3   r4   ZConnectionStaterª   r   r   r   Úis_availableÿ  s   ÿþÿÿüz!AsyncHTTP2Connection.is_availablec                 C  s   t  ¡ }| jd uo|| jkS r¦   )r§   r¨   r8   )rE   r©   r   r   r   Úhas_expired
  s   z AsyncHTTP2Connection.has_expiredc                 C  ó   | j tjkS r¦   )r7   r!   r'   rª   r   r   r   Úis_idle  ó   zAsyncHTTP2Connection.is_idlec                 C  r¸   r¦   )r7   r!   r(   rª   r   r   r   Ú	is_closed  rº   zAsyncHTTP2Connection.is_closedÚstrc                 C  s$   t | jƒ}|›d| jj› d| j› �S )Nz
, HTTP/2, ú, Request Count: )r¼   r0   r7   Únamer9   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¼   r0   r7   r¾   r9   )rE   Ú
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¦   )rU   )rE   rÅ   rÇ   rÉ   r   r   r   Ú	__aexit__)  s   €zAsyncHTTP2Connection.__aexit__r¦   )r+   r   r,   r   r-   r.   )r   r	   r   r
   )r   r	   r   rj   )r   r	   rH   rs   r   rj   )r   r	   rH   rs   r€   r�   r   rj   )r   r	   rH   rs   r   r‡   )r   r	   rH   rs   r   r•   )r   r	   rH   rs   r   rš   )r   r	   rH   rŸ   r   rj   )r“   r£   r   rj   )rH   rs   r   rj   ©r   rj   )r   r	   r   r«   )r   r	   rH   rs   r   rs   )r+   r   r   r   )r   r   )r   r¼   )r   r)   )NNN)rÅ   rÆ   rÇ   rÈ   rÉ   rÊ   r   rj   )"r#   r$   r%   r¯   r3   r/   ZH2Configurationr5   rF   ri   rS   r]   r^   r~   r   r_   r™   r�   rœ   r¢   rb   rU   r¡   rr   r‚   rO   r¶   r·   r¹   r»   r¿   rÃ   rÄ   rË   r   r   r   r   r)   *   sD    ü
'
h
!



	

ÿ
0


	









ür)   c                   @  s*   e Zd Zdd	d
„Zddd„Zddd„ZdS )ra   r4   r)   r   r	   rH   rs   r   rj   c                 C  s   || _ || _|| _d| _d S )NF)Ú_connectionÚ_requestÚ
_stream_idÚ_closed)rE   r4   r   rH   r   r   r   rF   3  s   
z"HTTP2ConnectionByteStream.__init__r•   c                 C sÜ   �| j | jdœ}z<tdt| j |ƒ4 I d H š" | jj| j | jd�2 z	3 d H W }|V  q 6 W d   ƒI d H  W d S 1 I d H s=w   Y  W d S  tym } ztƒ � |  ¡ I d H  W d   ƒ |‚1 sbw   Y  |‚d }~ww )NrG   Zreceive_response_body)	rÎ   rÏ   r   rR   rÍ   r™   rT   r   rU   )rE   rg   r†   re   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 )NTrH   rN   rI   )rÐ   rÏ   r   rR   rÎ   rÍ   rb   )rE   rg   r   r   r   rU   K  s   €
.ÿýz HTTP2ConnectionByteStream.acloseN)r4   r)   r   r	   rH   rs   r   rj   )r   r•   rÌ   )r#   r$   r%   rF   rÑ   rU   r   r   r   r   ra   2  s    

ra   )r   r	   r   r   )&Ú
__future__r   ÚenumÚloggingr§   Útypesr|   Z	h2.configr3   Zh2.connectionZ	h2.eventsZh2.exceptionsZh2.settingsZ_backends.baser   Ú_exceptionsr   r   r   Z_modelsr   r	   r
   Z_synchronizationr   r   r   Ú_tracer   Z
interfacesr   Ú	getLoggerrR   r    ÚIntEnumr!   r)   ra   r   r   r   r   Ú<module>   s4    

    