
    +h]                    @   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j>                  d      Z ddZ! G d dejD                        Z# G d de      Z$ G d d      Z%y)    )annotationsN   )AsyncNetworkStream)ConnectionNotAvailableLocalProtocolErrorRemoteProtocolError)OriginRequestResponse)	AsyncLockAsyncSemaphoreAsyncShieldCancellation)Trace   )AsyncConnectionInterfacezhttpcore.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/var/www/html/venv/lib/python3.12/site-packages/httpcore/_async/http2.py	<genexpr>z#has_body_headers.<locals>.<genexpr>   s<      Aq 	
	&&K!'')7K*KKs   57)anyheaders)requests    r   has_body_headersr      s      OO      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                     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d.dZd/dZd/dZd/dZd/dZd0dZd0dZd1dZ 	 	 	 d2	 	 	 	 	 	 	 d3dZ!y)4AsyncHTTP2Connection   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AsyncHTTP2Connection.__init__.   s     %/?334;;3G)..(,#+$;#+$;%*"$)!!&  	 NR#1526r   c           	     
  K   | j                  |j                  j                        s/t        d|j                  j                   d| j                         | j
                  4 d {    | j                  t        j                  t        j                  fv r2| xj                  dz  c_
        d | _        t        j                  | _        n
t               d d d       d {    | j                  4 d {    | j                  s	 d|i}t        dt         ||      4 d {     | j"                  di | d {    d d d       d {    d| _        d| _        | j,                  j.                  j0                  }t3        |      | _        t7        || j*                  z
        D ]$  }| j4                  j9                          d {    & d d d       d {    | j4                  j9                          d {    	 | j,                  j;                         }g | j<                  |<   	 ||d}t        dt         ||      4 d {    | jG                  ||       d {    d d d       d {    t        d	t         ||      4 d {    | jI                  ||       d {    d d d       d {    t        d
t         ||      4 d {   }| jK                  ||       d {   \  }	}
|	|
f|_&        d d d       d {    tO        	
tQ        | ||      d| jR                  |d      S 7 7 Y# 1 d {  7  sw Y   jxY w7 ]7 47 7 # 1 d {  7  sw Y   !xY w# t$        $ r@}t'               5  | j)                          d {  7   d d d        |# 1 sw Y   |xY wd }~ww xY w7 7 # 1 d {  7  sw Y   xY w7 # t>        j@                  jB                  $ r' d| _"        | xj                  dz  c_
        t               w xY w7 7 7 # 1 d {  7  sw Y   xY w7 7 7 # 1 d {  7  sw Y   xY w7 7 {7 b# 1 d {  7  sw Y   sxY w# t$        $ r}t'               5  d|i}t        dt         ||      4 d {  7   | jU                  |       d {  7   d d d       d {  7   n# 1 d {  7  sw Y   nxY wd d d        n# 1 sw Y   nxY wtW        |t>        j@                  jX                        r,| jZ                  rt]        | jZ                        t_        |      |d }~ww xY 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rN   s   HTTP/2)http_versionnetwork_streamrN   )statusr   content
extensionsrN   response_closedr)   )0can_handle_requesturlrG   RuntimeErrorr0   r<   r8   r!   r&   r'   r:   r9   r   r;   r?   r   logger_send_connection_initBaseExceptionr   aclose_max_streamsr7   local_settingsmax_concurrent_streamsr   _max_streams_semaphorerangeacquireget_next_available_stream_idrB   r3   
exceptionsNoAvailableStreamIDErrorr@   _send_request_headers_send_request_body_receive_responsereturn_valuer   HTTP2ConnectionByteStreamr1   _response_closed
isinstanceProtocolErrorrC   r   r   )rF   r   
sci_kwargsexclocal_settings_max_streams_rN   kwargstracerU   r   s              r   handle_async_requestz)AsyncHTTP2Connection.handle_async_requestU   s9    &&w{{'9'9:
 /0B0B/C Dll^% 
 ## 	/ 	/{{299;N;S;STT##q(#"&188,..	/ 	/ ?? 	@ 	@--	"+W!5J$.  G G 9d88F:FFFG G .2* %&! NN11HH + /==W.X+9D<M<MMN @A55==???@1	@ 	@6 ))11333	+CCEI&(DLL#.	!(yAF3VWfM W W00I0VVVW W0&'6J T T--g-SSST T*FGV 7 7(,(>(>#y )? ) # '-g%6"7 7 1$9U$-&*&:&:!*		 	w	/ 	/ 	/ 	/ 	/	@G GG G G G % 02 ,"kkm++,I,I" @3	@ 	@ 	@ 	@6 	4
 }}55 	+(,D%1$(**	+WVW W W WTST T T T7#7 7 7 7$  	(* E%y1 !2FGVL E E//)/DDDE E E E EE E E
 #r}}::; ..-d.I.IJJ )--I-	s  A%U''L5(U'+A)L;U'L8 U'4M5U'8OM3 M!M3$M:M;M?M3
MM3A6ON?OU'O!U'9O:U'?)O )R P%R P.P( P.$R /P+0R 
QR Q%Q&Q*R 5Q
6R Q#R Q,+Q&,Q,<R Q),R 4U'8U';MMM		U'M3MM3M0	#M&$M0	+M33	N<<
N7N*N
N* 
N7*N4/N77N<<OU'OOO	U'AP""U'%R (P.+R .Q4P75Q<	R Q
R Q QQ 	R &Q,)R ,Q?2Q53Q?:R 	U$
UT0R3
1T5S#S
S#TST#S5)S,*S51T8	UT
	AUU$$U'c           	     V  K   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                  |       d{    y7 w)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)r3   settingsSettingsSettingCodesENABLE_PUSHMAX_CONCURRENT_STREAMSMAX_HEADER_LIST_SIZEr7   ra   ENABLE_CONNECT_PROTOCOLinitiate_connectionincrement_flow_control_window_write_outgoing_data)rF   r   s     r   r]   z*AsyncHTTP2Connection._send_connection_init   s      )+(<(< ((44a((??((==u )= 
)
% NN))KK$$<<
 	**,44U;''000s   DD)!D'"D)c                X  K   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                  |       d{    yc c}}w c c}}w 7 w)z@
        Send the request headers to a given stream ID.
           hostr   s   :methods
   :authoritys   :schemes   :path)r   r   )
end_streamr|   rR   N)r   r   r   methodrZ   schemetargetr7   send_headersr   r   )rF   r   rN   r   r   r   	authorityr   s           r   ri   z*AsyncHTTP2Connection._send_request_headers   s     *'22
 $+??K41aaggi76JQKAN	 (I&++,w{{))*	
  
1wwy WWYN

 	##Iw:#N44Ui4P''000' L
 	1s.   D*DDAD*.D"AD*D(D*c                  K   t        |      syt        |j                  t        j                        sJ |j                  2 3 d{   }| j                  |||       d{    %7  7 6 | j                  ||       d{  7   yw)zP
        Iterate over the request body sending it to a given stream ID.
        N)r   ro   rH   typingAsyncIterable_send_stream_data_send_end_stream)rF   r   rN   datas       r   rj   z'AsyncHTTP2Connection._send_request_body   s       ('..&*>*>???!.. 	C 	C$(()TBBB	CB )##GY777sG   ?BA*A&A*	B A(!B&A*(B*B BBc                   K   |rr| j                  ||       d{   }t        t        |      |      }|d| ||d }}| j                  j	                  ||       | j                  |       d{    |rqyy7 ]7 w)zI
        Send a single chunk of data in one or more data frames.
        N)_wait_for_outgoing_flowminlenr7   	send_datar   )rF   r   rN   r   max_flow
chunk_sizechunks          r   r   z&AsyncHTTP2Connection._send_stream_data	  s}      !99'9MMHSY1J{
+T*+->4ENN$$Y6++G444 M 5s(   A<A8AA<.A:/A<6A<:A<c                x   K   | j                   j                  |       | j                  |       d{    y7 w)z`
        Send an empty data frame on on a given stream ID with the END_STREAM flag set.
        N)r7   r   r   )rF   r   rN   s      r   r   z%AsyncHTTP2Connection._send_end_stream  s.      	!!),''000s   0:8:c                r  K   	 | j                  ||       d{   }t        |t        j                  j                        rn@d}g }|j
                  J |j
                  D ]L  \  }}|dk(  rt        |j                  dd            }(|j                  d      r:|j                  ||f       N ||fS 7 w)zT
        Return the response status code and headers for a given stream ID.
        N   s   :statusasciiignore)errors   :)
_receive_stream_eventro   r3   eventsResponseReceivedr   intdecode
startswithappend)rF   r   rN   eventstatus_coder   r   r   s           r   rk   z&AsyncHTTP2Connection._receive_response  s      44WiHHE%!;!;< 
 }}(((MM 	'DAqJ!!((78("DE\\$'1v&		' W%% Is   B7B5BB7B7c                 K   	 | j                  ||       d{   }t        |t        j                  j                        rm|j
                  J |j                  J |j
                  }| j                  j                  ||       | j                  |       d{    |j                   n%t        |t        j                  j                        ry7 7 <w)z]
        Iterator that returns the bytes of the response body for a given stream ID.
        N)r   ro   r3   r   DataReceivedflow_controlled_lengthr   r7   acknowledge_received_datar   StreamEnded)rF   r   rN   r   amounts        r   _receive_response_bodyz+AsyncHTTP2Connection._receive_response_body5  s      44WiHHE%!7!7833???zz---5588K//888jj E299#8#89 H 9s"   CCB CC;CCc                N  K   | j                   j                  |      s6| j                  ||       d{    | j                   j                  |      s6| j                   |   j                  d      }t	        |t
        j                  j                        rt        |      |S 7 ow)z
        Return the next available event for a given stream ID.

        Will read more data from the network if required.
        Nr   )	rB   get_receive_eventspopro   r3   r   StreamResetr   )rF   r   rN   r   s       r   r   z*AsyncHTTP2Connection._receive_stream_eventG  s      ,,""9-&&w	::: ,,""9-Y'++A.eRYY223%e,,	 ;s   1B%B#B%AB%c           	       K   | j                   4 d{    | j                  S| j                  j                  }|r&|r$||kD  r| xj                  dz  c_        t	               t        | j                        || j                  j                  |      sq| j                  |       d{   }|D ]R  }t        |t        j                  j                        rKt        dt        |      4 d{   }| j                  |       d{    ||_        ddd      d{    st        |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L|| _        U ddd      d{    | j1                  |       d{    y7 7 7 I7 37 # 1 d{  7  sw Y   xY w7 C# 1 d{  7  sw Y   SxY w7 A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=   rC   last_stream_idr:   r   r   rB   r   _read_incoming_dataro   r3   r   RemoteSettingsChangedr   r\   _receive_remote_settings_changerl   r   r   r   r   rN   r   ConnectionTerminatedr   )rF   r   rN   r   r   r   rv   s          r   r   z$AsyncHTTP2Connection._receive_eventsV  s      ?? %	< %	<**6!%!<!<!K!KI4N''1,'022)$*E*EFF  (8(8(C#77@@# <E!%)H)HI#(5vw$ 7 7""&"F"Fu"MMM16E.	7 7 7 $II66II22II11II11	 !??dll: LL9@@G#E299+I+IJ6;3+<!%	< %	<N ''000O%	< A7 N7 7 7 7%%	< %	< %	< %	<N 	1s   I.H0I.BI)H3*AI-H6
.I1H?H9
H?IH<BI,AI<
II.II.*I,+I.3I6I9H?<I?IIIII.I)I I)%I.c                |  K   |j                   j                  t        j                  j                  j
                        }|rt        |j                  | j                  j                  j                        }|r|| j                  k7  r|| j                  kD  rG| j                  j                          d {    | xj                  dz  c_        || j                  kD  rG|| j                  k  rH| j                  j                          d {    | xj                  dz  c_        || j                  k  rGy y y y y 7 7 0w)Nr   )changed_settingsr   r3   r}   r   r   r   	new_valuer7   ra   rb   r`   rc   releasere   )rF   r   rb   new_max_streamss       r   r   z4AsyncHTTP2Connection._receive_remote_settings_change  s     "'!7!7!;!;KK$$;;"
 "!&00--DDO ?d6G6G#G%(9(9955==???%%*% &(9(99 &(9(9955==???%%*% &(9(99	 $H " @ @s0   B1D<3D84(D<,D<	D:
(D<3D<:D<c                  K   | j                   j                          d {    | j                  |= | j                  4 d {    | j                  r%| j                  s| j                          d {    n| j                  t        j                  k(  ry| j                  smt        j                  | _        | j                  (t        j                         }|| j                  z   | _        | j                  r| j                          d {    d d d       d {    y 7 7 7 7 7 # 1 d {  7  sw Y   y xY wwN)rc   r   rB   r<   rC   r_   r8   r!   r&   r'   r2   time	monotonicr9   r@   )rF   rN   nows      r   rn   z%AsyncHTTP2Connection._response_closed  s     ))11333LL### 
	( 
	(**4<<kkm## 3 : ::4<<166))5..*C&)D,B,B&BDO,,++-''
	( 
	( 
	( 	4
	(# (
	( 
	( 
	( 
	(s|   D>D!D>D!D>,D)2D#3BD)	D%
D)D>D'D>!D>#D)%D)'D>)D;/D20D;7D>c                   K   | j                   j                          t        j                  | _        | j
                  j                          d {    y 7 wr   )r7   close_connectionr!   r(   r8   r1   r_   rF   s    r   r_   zAsyncHTTP2Connection.aclose  s=      	''))00""))+++s   AAAAc                  K   |j                   j                  di       }|j                  dd       }| j                  | j                  	 | j                  j	                  | j
                  |       d {   }|dk(  rt        d      	 | j                  j                  |      }|S 7 2# t        $ r}|| _        d| _        |d }~ww xY ww)Ntimeoutreadr   zServer disconnectedT)rW   r   rD   r1   r   READ_NUM_BYTESr   	ExceptionrA   r7   receive_data)rF   r   timeoutsr   r   rr   r   s          r   r   z(AsyncHTTP2Connection._read_incoming_data  s     %%)))R8,,vt,+&&&	--2243F3FPPDs{)*?@@  )-(C(CD(I% Q  	 $'D %)D"I	s<   AC	
)B( 3B&4B( C	&B( (	C1CCC	c                  K   |j                   j                  di       }|j                  dd       }| j                  4 d {    | j                  j	                         }| j
                  | j
                  	 | j                  j                  ||       d {    d d d       d {    y 7 l7 # t        $ r}|| _        d| _	        |d }~ww xY w7 *# 1 d {  7  sw Y   y xY ww)Nr   writeT)
rW   r   r>   r7   data_to_sendrE   r1   r   r   rA   )rF   r   r   r   r   rr   s         r   r   z)AsyncHTTP2Connection._write_outgoing_data  s     %%)))R8,,w-## 	 	>>668L$$0+++**00wGGG	 	 	 H  ),%)-&		 	 	 	sw   ?C*B.C*3C9B2B0B2C*(C)C*0B22	C;CCCC*C'CC'#C*c                N  K   | j                   j                  |      }| j                   j                  }t        ||      }|dk(  r\| j	                  |       d{    | j                   j                  |      }| j                   j                  }t        ||      }|dk(  r\|S 7 Iw)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)r7   local_flow_control_windowmax_outbound_frame_sizer   r   )rF   r   rN   
local_flowmax_frame_sizeflows         r   r   z,AsyncHTTP2Connection._wait_for_outgoing_flow  s      ..BB9M
"nnDD:~.ai&&w///AA)LJ!^^CCNz>2D	 ai
 	 0s   AB%B#AB%!B%c                     || j                   k(  S r   )r0   rF   rG   s     r   rY   z'AsyncHTTP2Connection.can_handle_request  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   )r8   r!   r(   rA   r@   r7   state_machinestater3   r4   ConnectionStater   s    r   is_availablez!AsyncHTTP2Connection.is_available  ss    KK.555 ***--- ,,22==00778		
r   c                h    t        j                         }| j                  d uxr || j                  kD  S r   )r   r   r9   )rF   r   s     r   has_expiredz AsyncHTTP2Connection.has_expired
  s+    nnd*DsT__/DDr   c                <    | j                   t        j                  k(  S r   )r8   r!   r'   r   s    r   is_idlezAsyncHTTP2Connection.is_idle  s    {{16666r   c                <    | j                   t        j                  k(  S r   )r8   r!   r(   r   s    r   	is_closedzAsyncHTTP2Connection.is_closed  s    {{18888r   c                |    t        | j                        }|d| j                  j                   d| j                   S )Nz
, HTTP/2, , Request Count: )strr0   r8   namer:   r   s     r   infozAsyncHTTP2Connection.info  sA    T\\"j
4;;#3#3"4 5"1124	
r   c           	         | j                   j                  }t        | j                        }d| d|d| j                  j
                   d| j                   d	S )N<z [z, r   z]>)	__class__r#   r   r0   r8   r   r:   )rF   
class_namerG   s      r   __repr__zAsyncHTTP2Connection.__repr__  sZ    ^^,,
T\\"
|2fZr$++*:*:); <"112"6	
r   c                   K   | S wr   r)   r   s    r   
__aenter__zAsyncHTTP2Connection.__aenter__&  s     s   c                @   K   | j                          d {    y 7 wr   )r_   )rF   exc_type	exc_value	tracebacks       r   	__aexit__zAsyncHTTP2Connection.__aexit__)  s      kkms   r   )rG   r	   rH   r   rI   zfloat | None)r   r
   returnr   )r   r
   r   None)r   r
   rN   r   r   r   )r   r
   rN   r   r   bytesr   r   )r   r
   rN   r   r   z%tuple[int, list[tuple[bytes, bytes]]])r   r
   rN   r   r   typing.AsyncIterator[bytes])r   r
   rN   r   r   zKh2.events.ResponseReceived | h2.events.DataReceived | h2.events.StreamEnded)r   r
   rN   z
int | Noner   r   )r   zh2.events.RemoteSettingsChangedr   r   )rN   r   r   r   r   r   )r   r
   r   zlist[h2.events.Event])r   r
   rN   r   r   r   )rG   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   r3   r/   H2Configurationr6   rJ   rw   r]   ri   rj   r   r   rk   r   r   r   r   rn   r_   r   r   r   rY   r   r   r   r   r   r   r   r   r)   r   r   r+   r+   *   s   NYY&&&FF *.	%7%7 #%7 '	%7NfP1B1>
855+.56;5	51&&+.&	.&,+.	$$+.	T  9=.1.1+5.1	.1`+4+	+&(,86(&	
E79


 04*.04	, ( .	
 
r   r+   c                  4    e Zd Z	 	 	 	 	 	 	 	 ddZddZddZy)rm   c                <    || _         || _        || _        d| _        y )NF)_connection_request
_stream_id_closed)rF   r4   r   rN   s       r   rJ   z"HTTP2ConnectionByteStream.__init__3  s!     &#r   c                 K   | j                   | j                  d}	 t        dt        | j                   |      4 d {    | j                  j                  | j                   | j                        2 3 d {   }| 7 D7 6 d d d       d {  7   y # 1 d {  7  sw Y   y xY w# t        $ r@}t               5  | j                          d {  7   d d d        |# 1 sw Y   |xY wd }~ww xY ww)NrM   receive_response_body)	r  r  r   r\   r  r   r^   r   r_   )rF   ru   r   rr   s       r   	__aiter__z#HTTP2ConnectionByteStream.__aiter__;  s     !]]I	4fdmmVT    #'#3#3#J#J MMT__ $K $    %  K	   $         
  	 )* $kkm##$I$I	s   C: B. BB. 2B3B7B8B;BB. BBB. BB. C:B+B" B+'B. *C:+B. .	C77
C2C%CC%
C2%C/	*C22C77C:c                L  K   | j                   syd| _         d| j                  i}t        dt        | j                  |      4 d {    | j
                  j                  | j                         d {    d d d       d {    y y 7 D7 7 
# 1 d {  7  sw Y   y xY ww)NTrN   rX   rR   )r  r  r   r\   r  r  rn   )rF   ru   s     r   r_   z HTTP2ConnectionByteStream.acloseK  s     ||DL!4??3F.vN S S&&77$//7RRRS S S SRS S S SsZ   AB$B	B$*B2B3B7B$BB$BB$B!BB!B$N)r4   r+   r   r
   rN   r   r   r   )r   r   r   )r#   r$   r%   rJ   r
  r_   r)   r   r   rm   rm   2  s2    .9@MP	 Sr   rm   )r   r
   r   r   )&
__future__r   enumloggingr   typesr   	h2.configr3   h2.connection	h2.eventsh2.exceptionsh2.settings_backends.baser   _exceptionsr   r   r   _modelsr	   r
   r   _synchronizationr   r   r   _tracer   
interfacesr   	getLoggerr\   r   IntEnumr!   r+   rm   r)   r   r   <module>r     s    "           / 
 0 / Q Q  0			+	,$,, E3 EPS Sr   