
    osj>[                    X   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jF                  d      Z$ddZ% G d dejL                        Z' G d de"      Z( G d d      Z)y)    )annotationsN)	Generator   )NetworkStream)ConnectionNotAvailableLocalProtocolErrorRemoteProtocolError)OriginRequestResponse)Lock	SemaphoreShieldCancellation)Trace)safe_iterate   )ConnectionInterfacezhttpcore2.http2c                :    t        d | j                  D              S )Nc              3  r   K   | ]/  \  }}|j                         d k(  xs |j                         dk(   1 yw)s   content-length   transfer-encodingN)lower).0k_vs      H/root/.hermes/venv/lib/python3.12/site-packages/httpcore2/_sync/http2.py	<genexpr>z#has_body_headers.<locals>.<genexpr>   s7     pW\WXZ\qwwy--R>R1RRps   57)anyheaders)requests    r   has_body_headersr       s    p`g`o`oppp    c                      e Zd ZdZdZdZy)HTTPConnectionStater   r      N)__name__
__module____qualname__ACTIVEIDLECLOSED r!   r   r#   r#      s    FDFr!   r#   c                  Z   e Zd ZdZej
                  j                  d      Z	 d!	 	 	 	 	 d"dZd#dZ	d$dZ
d%dZd%d	Zd&d
Zd%dZd'dZd(dZ	 	 	 	 	 	 d)dZd!d*dZd+dZd,dZd-dZd.dZd$dZd/dZd0dZd1dZd1dZd1dZd1dZd1dZd1dZd2dZ d2dZ!d3dZ"	 	 	 d4	 	 	 	 	 	 	 d5d Z#y)6HTTP2Connection   F)validate_inbound_headersNc                   || _         || _        || _        t        j                  j                  | j                        | _        t        j                  | _
        d | _        d| _        t               | _        t               | _        t               | _        t               | _        d| _        d| _        d| _        i | _        d | _        d | _        d | _        y )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)selforiginstreamkeepalive_expirys       r   __init__zHTTP2Connection.__init__)   s     %/?334;;3G)..(,&6&6%*"$)!!&  	 NR#1526r!   c           	        | j                  |j                  j                        s/t        d|j                  j                   d| j                         | j
                  5  | j                  t        j                  t        j                  fv r2| xj                  dz  c_
        d | _        t        j                  | _        n
t               	 d d d        | j                  5  | j                  s	 d|i}t        dt         ||      5   | j"                  di | d d d        d| _        d| _        | j,                  j.                  j0                  }t3        |      | _        t7        || j*                  z
        D ]  }| j4                  j9                           d d d        | j4                  j9                          	 | j,                  j;                         }g | j<                  |<   	 ||d}t        dt         ||      5  | jI                  ||       d d d        t        d	t         ||      5  | jK                  ||       d d d        t        d
t         ||      5 }| jM                  ||      \  }	}
|	|
f|_'        d d d        tQ        	
tS        | ||      d| jT                  |d      S # 1 sw Y   xY w# 1 sw Y   xY w# t$        $ r7}t'               5  | j)                          d d d        |# 1 sw Y   |xY wd }~ww xY w# 1 sw Y   pxY w# t>        j@                  jB                  $ rA d| _"        | xj                  dz  c_
        | j4                  jG                          t               w xY w# 1 sw Y   fxY w# 1 sw Y   ExY w# 1 sw Y   xY w# t$        $ r}t'               5  d|i}t        dt         ||      5  | jW                  |       d d d        n# 1 sw Y   nxY wd d d        n# 1 sw Y   nxY wtY        |t>        j@                  jZ                        r,| j\                  rt_        | j\                        ta        |      |d }~ww xY 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rP   s   HTTP/2)http_versionnetwork_streamrP   )statusr   content
extensionsrP   response_closedr+   )1can_handle_requesturlrI   RuntimeErrorr2   r>   r:   r#   r(   r)   r<   r;   r   r=   rA   r   logger_send_connection_initBaseExceptionr   close_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_rP   kwargstracerW   r   s              r   handle_requestzHTTP2Connection.handle_requestK   s	   &&w{{'9'9:
 !>w{{?Q?Q>RRdeieqeqdrstt 	/{{299;N;S;STT##q(#"&188,.. 		/ __ 	:--"+W!5J5vw
S A222@Z@A .2* %&!-1^^-J-J-a-a*.78R.S+9D<M<MMN :A//779:)	:. 	##++-	+CCEI&(DLL#*	!(yAF-vwG Q**7i*PQ*FGVD N''9'MN167FK 7u"&"8"8T]"8"^&,g%6"7 1$9U$-&*&:&:!*		 	i	/ 	/A A$ +- %

%I%I	: 	:8 }}55 	+(,D%1$''//1(**		+Q QN N7 7  	#% ?%y1,fgvF ?))I)>? ? ?? ? ?
 #r}}::; ..-d.I.IJJ )--I-	s  !A)J$L-J>J1J>A5L6)L  N 7M/N %M<9N  N	30N $J.1J;	6J>>	K>
K9K,"
K9,K61K99K>>LLAM,/M94N <NN 	NN 	Q
Q)O1 O	O1O%!O1(	Q1O:	6AQQc           	     :   t         j                  j                  dt         j                  j                  j                  dt         j                  j                  j
                  dt         j                  j                  j                  di      | j                  _        | j                  j                  t         j                  j                  j                  = | j                  j                          | j                  j                  d       | j                  |       y)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   rc   ENABLE_CONNECT_PROTOCOLinitiate_connectionincrement_flow_control_window_write_outgoing_data)rH   r   s     r   r_   z%HTTP2Connection._send_connection_init   s     )+(<(< ((44a((??((==u )= 
)
% NN))"++*B*B*Z*Z[**,44U;!!'*r!   c                <   t        |       }|j                  D cg c]  \  }}|j                         dk(  s| c}}d   }d|j                  fd|fd|j                  j
                  fd|j                  j                  fg|j                  D cg c])  \  }}|j                         dvr|j                         |f+ c}}z   }| j                  j                  |||       | j                  j                  d	|
       | j                  |       yc c}}w c c}}w )z@
        Send the request headers to a given stream ID.
           hostr   s   :methods
   :authoritys   :schemes   :path)r   r   )
end_streamr   rT   N)r    r   r   methodr\   schemetargetr9   send_headersr   r   )rH   r   rP   r   r   v	authorityr   s           r   rl   z%HTTP2Connection._send_request_headers   s    *'22
 $+??K41aaggi76JQKAN	 (I&++,w{{))*	
  
1wwy WWYN

 	##Iw:#N44Ui4P!!'*' L
s   DD.Dc                   t        |      syt        |j                  t        j                        sJ t        |j                        5 }|D ]  }| j                  |||        	 ddd       | j                  ||       y# 1 sw Y   xY w)zP
        Iterate over the request body sending it to a given stream ID.
        N)r    rr   rJ   typingIterabler   _send_stream_data_send_end_stream)rH   r   rP   iteratorchunks        r   rm   z"HTTP2Connection._send_request_body   s      ('..&//:::'..) 	BX! B&&w	5AB	B 	gy1		B 	Bs   A??Bc                    |rb| j                  ||      }t        t        |      |      }|d| ||d }}| j                  j	                  ||       | j                  |       |rayy)zI
        Send a single chunk of data in one or more data frames.
        N)_wait_for_outgoing_flowminlenr9   	send_datar   )rH   r   rP   datamax_flow
chunk_sizer   s          r   r   z!HTTP2Connection._send_stream_data   sg     33GYGHSY1J{
+T*+->4ENN$$Y6%%g. r!   c                \    | j                   j                  |       | j                  |       y)z`
        Send an empty data frame on on a given stream ID with the END_STREAM flag set.
        N)r9   r   r   )rH   r   rP   s      r   r   z HTTP2Connection._send_end_stream   s$     	!!),!!'*r!   c                V   	 | j                  ||      }t        |t        j                  j                        rn8d}g }|j
                  J |j
                  D ]L  \  }}|dk(  rt        |j                  dd            }(|j                  d      r:|j                  ||f       N ||fS )zT
        Return the response status code and headers for a given stream ID.
           s   :statusasciiignore)errors   :)
_receive_stream_eventrr   r5   eventsResponseReceivedr   intdecode
startswithappend)rH   r   rP   eventstatus_coder   r   r   s           r   rn   z!HTTP2Connection._receive_response	  s     ..w	BE%!;!;< 
 -/}}(((MM 	'DAqJ!!((78("DE\\$'1v&		' W%%r!   c              #    K   	 | j                  ||      }t        |t        j                  j                        rd|j
                  J |j                  J |j
                  }| j                  j                  ||       | j                  |       |j                   n%t        |t        j                  j                        ryw)z]
        Iterator that returns the bytes of the response body for a given stream ID.
        N)r   rr   r5   r   DataReceivedflow_controlled_lengthr   r9   acknowledge_received_datar   StreamEnded)rH   r   rP   r   amounts        r   _receive_response_bodyz&HTTP2Connection._receive_response_body  s      ..w	BE%!7!7833???zz---5588K))'2jj E299#8#89 s   CCc                2   | j                   j                  |      s.| j                  ||       | j                   j                  |      s.| j                   |   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.
        r   )	rD   get_receive_eventspoprr   r5   r   StreamResetr	   )rH   r   rP   r   s       r   r   z%HTTP2Connection._receive_stream_event-  sw     ,,""9-  )4 ,,""9-Y'++A.eRYY223%e,,r!   c           	        | j                   5  | j                  S| j                  j                  }|r&|r$||kD  r| xj                  dz  c_        t	               t        | j                        || j                  j                  |      sQ| j                  |      }|D ]:  }t        |t        j                  j                        r3t        dt        |      5 }| j                  |       ||_        ddd       [t        |t        j                  j"                  t        j                  j$                  t        j                  j&                  t        j                  j(                  f      rC|j*                  | j                  v s| j                  |j*                     j-                  |       t        |t        j                  j.                        s4|| _        = ddd       | j1                  |       y# 1 sw Y   bxY w# 1 sw Y   (xY w)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_datarr   r5   r   RemoteSettingsChangedr   r^   _receive_remote_settings_changero   r   r   r   r   rP   r   ConnectionTerminatedr   )rH   r   rP   r   r   r   ry   s          r   r   zHTTP2Connection._receive_events<  s   
 __ #	<**6!%!<!<!K!KI4N''1,'022)$*E*EFF  (8(8(C11':# <E!%)H)HI"#<fgN 7RW @@G16E.7 7 $II66II22II11II11	 !??dll: LL9@@G#E299+I+IJ6;3'<!#	<J 	!!'*'7 7%#	< #	<s2   C
HG60BHAH
H6H ;HHc                L   |j                   j                  t        j                  j                  j
                        }|rt        |j                  | j                  j                  j                        }|r|| j                  k7  r|| j                  kD  r?| j                  j                          | xj                  dz  c_        || j                  kD  r?|| j                  k  r@| j                  j                          | xj                  dz  c_        || j                  k  r?y y y y y )Nr   )changed_settingsr   r5   r   r   r   r   	new_valuer9   rc   rd   rb   re   rk   rg   )rH   r   rd   new_max_streamss       r   r   z/HTTP2Connection._receive_remote_settings_changeh  s    !&!7!7!;!;BKK<T<T<k<k!l!!&00--DDO ?d6G6G#G%(9(99//779%%*% &(9(99 &(9(99//779%%*% &(9(99	 $H "r!   c                   | j                   j                          | j                  5  | j                  |= | j                  r| j                  s| j                          n| j                  t        j                  k(  rq| j                  set        j                  | _        | j                  (t        j                         }|| j                  z   | _        | j                  r| j                          d d d        y # 1 sw Y   y xY wN)re   rk   r>   rD   rE   ra   r:   r#   r(   r)   r4   time	monotonicr;   rB   )rH   rP   nows      r   rq   z HTTP2Connection._response_closedw  s    ##++- 	!Y'**4<<

 3 : ::4<<166))5..*C&)D,B,B&BDO,,JJL	! 	! 	!s   CC55C>c                    | j                   j                          t        j                  | _        | j
                  j                          y r   )r9   close_connectionr#   r*   r:   r3   ra   rH   s    r   ra   zHTTP2Connection.close  s3     	''))00""$r!   c                z   |j                   j                  di       }|j                  dd       }| j                  | j                  	 | j                  j	                  | j
                  |      }|dk(  rt        d      	 | j                  j                  |      }|S # t        $ r}|| _        d| _        |d }~ww xY w)Ntimeoutreadr!   zServer disconnectedT)rY   r   rF   r3   r   READ_NUM_BYTESr	   	ExceptionrC   r9   receive_data)rH   r   timeoutsr   r   ru   r   s          r   r   z#HTTP2Connection._read_incoming_data  s    %%)))R8,,vt,+&&&	'',,T-@-@'JDs{)*?@@  )-(C(CD(I  	 $'D %)D"I	s   6B 	B:%B55B:c                   |j                   j                  di       }|j                  dd       }| j                  5  | j                  j	                         }| j
                  | j
                  	 | j                  j                  ||       	 d d d        y # t        $ r}|| _        d| _	        |d }~ww xY w# 1 sw Y   y xY w)Nr   writeT)
rY   r   r@   r9   data_to_sendrG   r3   r   r   rC   )rH   r   r   r   r   ru   s         r   r   z$HTTP2Connection._write_outgoing_data  s    %%)))R8,,w- 	>>668L$$0+++$$**<A	 	   ),%)-&		 	s)   3B6/B	B3B..B33B66B?c                2   | j                   j                  |      }| j                   j                  }t        ||      }|dk  rT| j	                  |       | j                   j                  |      }| j                   j                  }t        ||      }|dk  rT|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   )r9   local_flow_control_windowmax_outbound_frame_sizer   r   )rH   r   rP   
local_flowmax_frame_sizeflows         r   r   z'HTTP2Connection._wait_for_outgoing_flow  s     ..BB9M
"nnDD:~.ai  )AA)LJ!^^CCNz>2D	 ai
 r!   c                     || j                   k(  S r   )r2   rH   rI   s     r   r[   z"HTTP2Connection.can_handle_request  s    %%r!   c                $    | j                          S r   )	is_closedr   s    r   is_connectedzHTTP2Connection.is_connected  s    >>###r!   c                   | j                   t        j                  k7  xrd | j                   xrU | j                   xrF | j
                  j                  j                  t        j                  j                  j                  k(   S r   )r:   r#   r*   rC   rB   r9   state_machinestater5   r6   ConnectionStater   s    r   is_availablezHTTP2Connection.is_available  sq    KK.555 a***a---a ^^11772==;X;X;_;__`		
r!   c                X    t        j                         }| j                  }|d uxr ||kD  S r   )r   r   r;   )rH   r   	expire_ats      r   has_expiredzHTTP2Connection.has_expired  s-    nn OO	$8y8r!   c                <    | j                   t        j                  k(  S r   )r:   r#   r)   r   s    r   is_idlezHTTP2Connection.is_idle  s    {{16666r!   c                     y)NTr+   r   s    r   can_multiplexzHTTP2Connection.can_multiplex  s    r!   c                <    | j                   t        j                  k(  S r   )r:   r#   r*   r   s    r   r   zHTTP2Connection.is_closed  s    {{18888r!   c                |    t        | j                        }|d| j                  j                   d| j                   S )Nz
, HTTP/2, , Request Count: )strr2   r:   namer<   r   s     r   infozHTTP2Connection.info  s:    T\\":dkk&6&6%77HI\I\H]^^r!   c           	         | 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_namerI   s      r   __repr__zHTTP2Connection.__repr__  sU    ^^,,
T\\":,b
"T[[-=-=,>>OPTPcPcOddfggr!   c                    | S r   r+   r   s    r   	__enter__zHTTP2Connection.__enter__  s    r!   c                $    | j                          y r   )ra   )rH   exc_type	exc_value	tracebacks       r   __exit__zHTTP2Connection.__exit__  s     	

r!   r   )rI   r
   rJ   r   rK   zfloat | None)r   r   returnr   )r   r   r  None)r   r   rP   r   r  r  )r   r   rP   r   r   bytesr  r  )r   r   rP   r   r  z%tuple[int, list[tuple[bytes, bytes]]])r   r   rP   r   r  Generator[bytes])r   r   rP   r   r  zKh2.events.ResponseReceived | h2.events.DataReceived | h2.events.StreamEnded)r   r   rP   z
int | Noner  r  )r   zh2.events.RemoteSettingsChangedr  r  )rP   r   r  r  r  r  )r   r   r  zlist[h2.events.Event])r   r   rP   r   r  r   )rI   r
   r  bool)r  r	  )r  r   )r  r-   )NNN)r   ztype[BaseException] | Noner  zBaseException | Noner  ztypes.TracebackType | Noner  r  )$r%   r&   r'   r   r5   r1   H2Configurationr8   rL   rz   r_   rl   rm   r   r   rn   r   r   r   r   rq   ra   r   r   r   r[   r   r   r   r   r   r   r   r   r   r  r+   r!   r   r-   r-   %   s   NYY&&&FF *.	 7 7  7 '	 7D\|+>+>2	/+&( +.	T*+X+!%86(&$
979_h
 04*.04	, ( .	
 
r!   r-   c                  $    e Zd ZddZddZddZy)rp   c                <    || _         || _        || _        d| _        y )NF)_connection_request
_stream_id_closed)rH   r6   r   rP   s       r   rL   z"HTTP2ConnectionByteStream.__init__  s    %#r!   c              #    K   | j                   | j                  d}	 t        dt        | j                   |      5  t	        | j
                  j                  | j                   | j                              5 }|D ]  }|  	 d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w# t        $ r7}t               5  | j                          d d d        |# 1 sw Y   |xY wd }~ww xY ww)NrO   receive_response_body)
r  r  r   r^   r   r  r   r`   r   ra   )rH   rx   r   r   ru   s        r   __iter__z"HTTP2ConnectionByteStream.__iter__  s     !]]I	.vN $!$$;;DMM]a]l]l;m $!) $#$$$ $$ $$ $  	 $% 

II	s{   C-B* ;B4BB	B* C-B	BB'#B* &C-'B* *	C*3
C%=C
C%C"	C%%C**C-c                    | j                   sad| _         d| j                  i}t        dt        | j                  |      5  | j
                  j                  | j                         d d d        y y # 1 sw Y   y xY w)NTrP   rZ   rT   )r  r  r   r^   r  r  rq   )rH   rx   s     r   ra   zHTTP2ConnectionByteStream.close(  sp    ||DL!4??3F(&$--H M  11DOO1LM M M Ms   'A//A8N)r6   r-   r   r   rP   r   r  r  )r  r  r  )r%   r&   r'   rL   r  ra   r+   r!   r   rp   rp     s    "Mr!   rp   )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   	getLoggerr^   r    IntEnumr#   r-   rp   r+   r!   r   <module>r(     s    "      %      * Y Y / / B B  ! +			,	-q$,, h) hVM Mr!   