
    ՟f1[                     <   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edefdZ  G d de jB                        Z" G d de      Z# G d d      Z$y)    N   )NetworkStream)ConnectionNotAvailableLocalProtocolErrorRemoteProtocolError)OriginRequestResponse)Lock	SemaphoreShieldCancellation)Trace   )ConnectionInterfacezhttpcore.http2requestreturnc                 :    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      O/var/www/cvtools/html/venv/lib/python3.12/site-packages/httpcore/_sync/http2.py	<genexpr>z#has_body_headers.<locals>.<genexpr>   s<      Aq 	
	&&K!'')7K*KKs   57)anyheaders)r   s    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ede	de
j                  e   fdZd	ed
efdZd	ed
dfdZd	eded
dfdZd	eded
dfdZd	ededed
dfdZd	eded
dfdZd	eded
e
j0                  ee
j2                  e
j0                  eef      f   fdZd	eded
e
j6                  e   fdZd	eded
e
j:                  ej<                  j>                  ej<                  j@                  ej<                  jB                  f   fdZ"	 d*d	ede
j                  e   d
dfdZ#dej<                  jH                  d
dfdZ%ded
dfdZ&d+dZ'd	ed
e
j2                  ej<                  jH                     fdZ(d	ed
dfdZ)d	eded
efdZ*ded
e+fdZ,d
e+fdZ-d
e+fd Z.d
e+fd!Z/d
e+fd"Z0d
e1fd#Z2d
e1fd$Z3d,d%Z4	 	 	 d-d&e
j                  e
jj                  e6      d'e
j                  e6   d(e
j                  e7jp                     d
dfd)Z9y).HTTP2Connection   F)validate_inbound_headersNoriginstreamkeepalive_expiryc                    || _         || _        || _        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)selfr.   r/   r0   s       r   __init__zHTTP2Connection.__init__,   s     %9I334;;3G)..26&6&6%*"$)!!&  	  	# <@<@r   r   r   c           	      x   | 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  | jG                  ||       d d d        t        d	t         ||      5  | jI                  ||       d d d        t        d
t         ||      5 }| jK                  ||      \  }}	||	f|_&        d d d        tO        	tQ        | ||      d| jR                  |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                  $ r' d| _"        | xj                  dz  c_
        t               w xY w# 1 sw Y   LxY w# 1 sw Y   +xY w# 1 sw Y   xY w# t$        $ r}t'               5  d|i}t        dt         ||      5  | jU                  |       d d d        n# 1 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)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urlr.   RuntimeErrorr3   r?   r;   r!   r&   r'   r=   r<   r   r>   rB   r   logger_send_connection_initBaseExceptionr   close_max_streamsr:   local_settingsmax_concurrent_streamsr   _max_streams_semaphorerangeacquireget_next_available_stream_idrE   r6   
exceptionsNoAvailableStreamIDErrorrC   _send_request_headers_send_request_body_receive_responsereturn_valuer
   HTTP2ConnectionByteStreamr4   _response_closed
isinstanceProtocolErrorrF   r   r   )
rI   r   kwargsexclocal_settings_max_streams_rN   tracerU   r   s
             r   handle_requestzHTTP2Connection.handle_requestU   s
   &&w{{'9'9:
 /0B0B/C Dll^% 
  	/{{299;N;S;STT##q(#"&188,.. 		/ __ 	:--'1F5vwO =222<V<= .2* %&! NN11HH + /88R.S+9D<M<MMN :A//779:-	:2 	##++-	+CCEI&(DLL#.	!(yAF-vwG Q**7i*PQ*FGVD N''9'MN*FGV 7"&"8"8#y #9 # '-g%6"7 1$9U$-&*&:&:!*		 	s	/ 	/= =$ +- %

%I%I	: 	:< }}55 	+(,D%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  M; 7MM; %M"9M;  M/30M; $J.1J;	6J>>	K>
K9K,"
K9,K61K99K>>LLAMMM; "M,'M; /M84M; ;	P9
P4O%O8	OO
O	P4O	AP44P9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)r6   settingsSettingsSettingCodesENABLE_PUSHMAX_CONCURRENT_STREAMSMAX_HEADER_LIST_SIZEr:   ra   ENABLE_CONNECT_PROTOCOLinitiate_connectionincrement_flow_control_window_write_outgoing_data)rI   r   s     r   r]   z%HTTP2Connection._send_connection_init   s     )+(<(< ((44a((??((==u )= 
)
% NN))KK$$<<
 	**,44U;!!'*r   rN   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{   rR   N)r   r   r   methodrZ   schemetargetr:   send_headersr   r   )rI   r   rN   r   r   r   	authorityr   s           r   ri   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 |j                  D ]  }| j                  |||        | j                  ||       y)zP
        Iterate over the request body sending it to a given stream ID.
        N)r   ro   r/   typingIterable_send_stream_data_send_end_stream)rI   r   rN   datas       r   rj   z"HTTP2Connection._send_request_body   s\      ('..&//:::NN 	=D""7It<	=gy1r   r   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lenr:   	send_datar   )rI   r   rN   r   max_flow
chunk_sizechunks          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)r:   r   r   )rI   r   rN   s      r   r   z HTTP2Connection._send_end_stream  s$     	!!),!!'*r   c                 :   	 | j                  ||      }t        |t        j                  j                        rn8d}g }|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_eventro   r6   eventsResponseReceivedr   intdecode
startswithappend)rI   r   rN   eventstatus_coder   r   r   s           r   rk   z!HTTP2Connection._receive_response  s     ..w	BE%!;!;< 
 MM 	'DAqJ!!((78("DE\\$'1v&		' W%%r   c              #   T  K   	 | j                  ||      }t        |t        j                  j                        rH|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   ro   r6   r   DataReceivedflow_controlled_lengthr:   acknowledge_received_datar   r   StreamEnded)rI   r   rN   r   amounts        r   _receive_response_bodyz&HTTP2Connection._receive_response_body2  s      ..w	BE%!7!785588K))'2jj E299#8#89 s   B&B(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   )	rE   get_receive_eventspopro   r6   r   StreamResetr   )rI   r   rN   r   s       r   r   z%HTTP2Connection._receive_stream_eventB  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@   rF   last_stream_idr=   r   r   rE   r   _read_incoming_dataro   r6   r   RemoteSettingsChangedr   r\   _receive_remote_settings_changerl   r   r   r   r   rN   r   ConnectionTerminatedr   )rI   r   rN   r   r   r   ru   s          r   r   zHTTP2Connection._receive_eventsS  s    __ %	<**6!%!<!<!K!KI4N''1,'022)$*E*EFF  (8(8(C11':# <E!%)H)HI"5vw 7" @@G16E.	7 7 $II66II22II11II11	 !??dll: LL9@@G#E299+I+IJ6;3+<!%	<N 	!!'*+7 7%%	< %	<s2   C
HG60BHAH
H6H ;HHr   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   r6   r|   r~   r   r   	new_valuer:   ra   rb   r`   rc   releasere   )rI   r   rb   new_max_streamss       r   r   z/HTTP2Connection._receive_remote_settings_change  s    !&!7!7!;!;KK$$;;"
 "!&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                  |= | j                  5  | 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)rc   r   rE   r?   rF   r_   r;   r!   r&   r'   r5   time	monotonicr<   rC   )rI   rN   nows      r   rn   z HTTP2Connection._response_closed  s    ##++-LL# 
	!**4<<

 3 : ::4<<166))5..*C&)D,B,B&BDO,,JJL
	! 
	! 
	!s   B8C55C>c                     | j                   j                          t        j                  | _        | j
                  j                          y r   )r:   close_connectionr!   r(   r;   r4   r_   rI   s    r   r_   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)rW   r   rG   r4   r   READ_NUM_BYTESr   	ExceptionrD   r:   receive_data)rI   r   timeoutsr   r   rr   r   s          r   r   z#HTTP2Connection._read_incoming_data  s     %%)))R8,,vt,+&&&	'',,T-@-@'JDs{)*?@@  04~~/J/J4/P  	 $'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)
rW   r   rA   r:   data_to_sendrH   r4   r   r   rD   )rI   r   r   r   r   rr   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   )r:   local_flow_control_windowmax_outbound_frame_sizer   r   )rI   r   rN   
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   )r3   rI   r.   s     r   rY   z"HTTP2Connection.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   )r;   r!   r(   rD   rC   r:   state_machinestater6   r7   ConnectionStater   s    r   is_availablezHTTP2Connection.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   r<   )rI   r   s     r   has_expiredzHTTP2Connection.has_expired  s+    nnd*DsT__/DDr   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                 <    | j                   t        j                  k(  S r   )r;   r!   r(   r   s    r   	is_closedzHTTP2Connection.is_closed  s    {{18888r   c                 |    t        | j                        }|d| j                  j                   d| j                   S )Nz
, HTTP/2, , Request Count: )strr3   r;   namer=   r   s     r   infozHTTP2Connection.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   r3   r;   r   r=   )rI   
class_namer.   s      r   __repr__zHTTP2Connection.__repr__  sZ    ^^,,
T\\"
|2fZr$++*:*:); <"112"6	
r   c                     | S r   r)   r   s    r   	__enter__zHTTP2Connection.__enter__#  s    r   exc_type	exc_value	tracebackc                 $    | j                          y r   )r_   )rI   r   r   r   s       r   __exit__zHTTP2Connection.__exit__&  s     	

r   r   r   N)r   r+   )NNN):r#   r$   r%   r   r6   r2   H2Configurationr9   r   r   r   OptionalfloatrJ   r	   r
   rv   r]   r   ri   rj   bytesr   r   TupleListrk   Iteratorr   Unionr   r   r   r   r   r   Eventr   rn   r_   r   r   r   boolrY   r   r   r   r   r   r   r   r   Typer^   typesTracebackTyper   r)   r   r   r+   r+   (   s   NYY&&&FF 48	'A'A 'A !//%0	'ARdg d( dL+W + +B+W + + +>
2' 
2c 
2d 
2//+./6;/	/+ +C +D +&&+.&	c6;;v||E5L'ABB	C&*+.		 +.	
		""BII$:$:BII<Q<QQ
$ CG.+.++1??3+?.+	.+`+RYY__ + +"!# !$ !%	RYY__	%<G  6w 3 3 (& &D &	
d 	
ET E7 794 9
c 

# 

 AE48:>	//&++m"<= ??=1 ??5#6#67	
 
r   r+   c                   R    e Zd ZdedededdfdZdej                  e	   fdZ
d	dZy)
rm   r7   r   rN   r   Nc                 <    || _         || _        || _        d| _        y )NF)_connection_request
_stream_id_closed)rI   r7   r   rN   s       r   rJ   z"HTTP2ConnectionByteStream.__init__0  s!     &#r   c              #     K   | j                   | j                  d}	 t        dt        | j                   |      5  | j                  j                  | j                   | j                        D ]  }|  	 d d d        y # 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)NrM   receive_response_body)	r  r  r   r\   r
  r   r^   r   r_   )rI   rq   r   rr   s       r   __iter__z"HTTP2ConnectionByteStream.__iter__8  s     !]]I	.vN  !--DD MMT__ E   E  K      
  	 $% 

II	sc   CB
 ;A>5B
 =C>BB
 CB
 
	C

CB8.
C8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)NTrN   rX   rR   )r  r  r   r\   r  r
  rn   )rI   rq   s     r   r_   zHTTP2ConnectionByteStream.closeH  sp    ||DL!4??3F(&$--H M  11DOO1LM M M Ms   'A//A8r   )r#   r$   r%   r+   r	   r   rJ   r   r  r   r  r_   r)   r   r   rm   rm   /  sB    )4;HK	&//%0  Mr   rm   )%enumloggingr   r  r   	h2.configr6   h2.connection	h2.eventsh2.exceptionsh2.settings_backends.baser   _exceptionsr   r   r   _modelsr   r	   r
   _synchronizationr   r   r   _tracer   
interfacesr   	getLoggerr\   r  r   IntEnumr!   r+   rm   r)   r   r   <module>r!     s              * 
 0 / B B  +			+	,g $ $,, D) DNM Mr   