
     @gHZ                    F   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j"                  Z# G d de          Z$ G d d          Z%dS )    )annotationsN   )NetworkStream)ConnectionNotAvailableLocalProtocolErrorRemoteProtocolError)OriginRequestResponse)Lock	SemaphoreShieldCancellation)Trace   )ConnectionInterfacezhttpcore.http2requestr
   returnboolc                >    t          d | j        D                       S )Nc              3  |   K   | ]7\  }}|                                 d k    p|                                 dk    V  8dS )s   content-length   transfer-encodingNlower.0kvs      H/var/www/piapp/venv/lib/python3.11/site-packages/httpcore/_sync/http2.py	<genexpr>z#has_body_headers.<locals>.<genexpr>   s[        Aq 	
		&&K!''))7K*K         )anyheaders)r   s    r   has_body_headersr#      s2      O     r    c                      e Zd ZdZdZdZdS )HTTPConnectionStater   r      N)__name__
__module____qualname__ACTIVEIDLECLOSED r    r   r%   r%   $   s        FDFFFr    r%   c                  (   e Zd ZdZej                            d          Z	 d=d>dZd?dZ	d@dZ
dAdZdAdZdBdZdAdZdCdZdDdZdEd Z	 d=dFd"ZdGd%ZdHd&ZdId'ZdJd)Zd@d*ZdKd+ZdLd-ZdMd.ZdMd/ZdMd0ZdMd1ZdNd3ZdNd4ZdOd5Z 	 	 	 dPdQd<Z!dS )RHTTP2Connection   F)validate_inbound_headersNoriginr	   streamr   keepalive_expiryfloat | Nonec                   || _         || _        || _        t          j                            | j                  | _        t          j	        | _
        d | _        d| _        t                      | _        t                      | _        t                      | _        t                      | _        d| _        d| _        d| _        i | _        d | _        d | _        d | _        d S )N)configr   F)_origin_network_stream_keepalive_expiryh2
connectionH2ConnectionCONFIG	_h2_stater%   r+   _state
_expire_at_request_countr   
_init_lock_state_lock
_read_lock_write_lock_sent_connection_init_used_all_stream_ids_connection_error_events_connection_terminated_read_exception_write_exception)selfr2   r3   r4   s       r   __init__zHTTP2Connection.__init__.   s     %/?334;3GG).(,&&66&&66%*"$)!!&  	 NR#1526r    r   r
   r   r   c           	     Z   |                      |j        j                  s$t          d|j        j         d| j                   | j        5  | j        t          j        t          j	        fv r)| xj
        dz  c_
        d | _        t          j        | _        nt                      	 d d d            n# 1 swxY w Y   | j        5  | j        s	 d|i}t          dt           ||          5   | j        di | d d d            n# 1 swxY w Y   nN# t$          $ rA}t'                      5  |                                  d d d            n# 1 swxY w Y   |d }~ww xY wd| _        d| _        | j        j        j        }t3          |          | _        t7          || j        z
            D ]}| j                                         d d d            n# 1 swxY w Y   | j                                         	 | j                                        }g | j        |<   n=# t>          j         j!        $ r& d| _"        | xj
        dz  c_
        t                      w xY w	 ||d}t          dt           ||          5  | #                    ||           d d d            n# 1 swxY w Y   t          d	t           ||          5  | $                    ||           d d d            n# 1 swxY w Y   t          d
t           ||          5 }| %                    ||          \  }}	||	f|_&        d d d            n# 1 swxY w Y   tO          ||	tQ          | ||          d| j)        |d          S # t$          $ r}t'                      5  d|i}t          dt           ||          5  | *                    |           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   tW          |t>          j         j,                  r*| j-        rt]          | j-                  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rS   s   HTTP/2)http_versionnetwork_streamrS   )statusr"   content
extensionsrS   response_closedr-   )0can_handle_requesturlr2   RuntimeErrorr8   rD   r@   r%   r*   r+   rB   rA   r   rC   rG   r   logger_send_connection_initBaseExceptionr   close_max_streamsr?   local_settingsmax_concurrent_streamsr   _max_streams_semaphorerangeacquireget_next_available_stream_idrJ   r;   
exceptionsNoAvailableStreamIDErrorrH   _send_request_headers_send_request_body_receive_responsereturn_valuer   HTTP2ConnectionByteStreamr9   _response_closed
isinstanceProtocolErrorrK   r   r   )
rN   r   kwargsexclocal_settings_max_streams_rS   tracerZ   r"   s
             r   handle_requestzHTTP2Connection.handle_requestS   s   &&w{'9:: 	
 %0B % %l% %  
  	/ 	/{29;N;STTT##q(##"&18,... 		/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ _ 	: 	:- :'1F5vwOO = =22<<V<<<= = = = = = = = = = = = = = =$   +-- % %

% % % % % % % % % % % % % % %I
 .2* %&! N1H + /88R.S.S+9D<MMNN : :A/779999/	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	:2 	#++---	+CCEEI&(DL##}5 	+ 	+ 	+(,D%1$(***	+
.	!(yAAF-vwGG Q Q**7i*PPPQ Q Q Q Q Q Q Q Q Q Q Q Q Q Q*FGVDD N N''9'MMMN N N N N N N N N N N N N N N*FGV  7"&"8"8#y #9 # # '-g%6"7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 1$9UUU$-&*&:!* 		 	 	 	  	 	 	#%% ? ?%y1,fgvFF ? ?))I)>>>? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
 #r}:;; . . K-d.IJJJ )---I-	sk  AB//B36B3G
D%C?3D?D	DD	D
G
EE#E8EEEEEEA)GGG0#H :IM! .JM! JM! JM! 4KM! KM! K M! :$L*M! *L..M! 1L.2.M! !
P*+P%9ON8,O8N<<O?N< OP%O	P%O	AP%%P*Nonec           	        t           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                            d           |                     |           dS )z
        The HTTP/2 connection requires some initial setup before we can start
        using individual request/response streams on it.
        Tr   d   r0   )clientinitial_values   N)r;   settingsSettingsSettingCodesENABLE_PUSHMAX_CONCURRENT_STREAMSMAX_HEADER_LIST_SIZEr?   rf   ENABLE_CONNECT_PROTOCOLinitiate_connectionincrement_flow_control_window_write_outgoing_data)rN   r   s     r   rb   z%HTTP2Connection._send_connection_init   s     )+(<(< (4a(?(=u )= 
)
 
)
% N)K$<
 	**,,,44U;;;!!'*****r    rS   intc                b   t          |           }d |j        D             d         }d|j        fd|fd|j        j        fd|j        j        fgd |j        D             z   }| j                            |||           | j                            d	|
           | 	                    |           dS )z@
        Send the request headers to a given stream ID.
        c                H    g | ]\  }}|                                 d k    | S )   hostr   r   s      r   
<listcomp>z9HTTP2Connection._send_request_headers.<locals>.<listcomp>   s.    KKK41aaggii76J6JQ6J6J6Jr    r   s   :methods
   :authoritys   :schemes   :pathc                l    g | ]1\  }}|                                 d v|                                 |f2S ))r   r   r   r   s      r   r   z9HTTP2Connection._send_request_headers.<locals>.<listcomp>   sR     
 
 
1wwyy  WWYYN  r    )
end_streamr   rW   N)
r#   r"   methodr_   schemetargetr?   send_headersr   r   )rN   r   rS   r   	authorityr"   s         r   rn   z%HTTP2Connection._send_request_headers   s     *'222
 LK7?KKKAN	 (I&+,w{)*	


 

 
 

 	##Iw:#NNN44Ui4PPP!!'*****r    c                    t          |          sdS t          |j        t          j                  sJ |j        D ]}|                     |||           |                     ||           dS )zP
        Iterate over the request body sending it to a given stream ID.
        N)r#   rt   r3   typingIterable_send_stream_data_send_end_stream)rN   r   rS   datas       r   ro   z"HTTP2Connection._send_request_body   s{      (( 	F'.&/:::::N 	= 	=D""7It<<<<gy11111r    r   bytesc                    |r{|                      ||          }t          t          |          |          }|d|         ||d         }}| j                            ||           |                     |           |ydS dS )zI
        Send a single chunk of data in one or more data frames.
        N)_wait_for_outgoing_flowminlenr?   	send_datar   )rN   r   rS   r   max_flow
chunk_sizechunks          r   r   z!HTTP2Connection._send_stream_data  s      	/33GYGGHSYY11J{
{+T*++->4EN$$Y666%%g...  	/ 	/ 	/ 	/ 	/r    c                d    | j                             |           |                     |           dS )z`
        Send an empty data frame on on a given stream ID with the END_STREAM flag set.
        N)r?   r   r   )rN   r   rS   s      r   r   z HTTP2Connection._send_end_stream  s4     	!!),,,!!'*****r    %tuple[int, list[tuple[bytes, bytes]]]c                J   	 |                      ||          }t          |t          j        j                  rn7d}g }|j        D ]\\  }}|dk    r%t          |                    dd                    }0|                    d          s|	                    ||f           ]||fS )zT
        Return the response status code and headers for a given stream ID.
        T   s   :statusasciiignore)errors   :)
_receive_stream_eventrt   r;   eventsResponseReceivedr"   r   decode
startswithappend)rN   r   rS   eventstatus_coder"   r   r   s           r   rp   z!HTTP2Connection._receive_response  s    	..w	BBE%!;<< 	
 M 	' 	'DAqJ!!((78("D"DEE\\$'' '1v&&&W%%r    typing.Iterator[bytes]c              #  8  K   	 |                      ||          }t          |t          j        j                  rA|j        }| j                            ||           |                     |           |j	        V  n!t          |t          j        j
                  rdS )z]
        Iterator that returns the bytes of the response body for a given stream ID.
        TN)r   rt   r;   r   DataReceivedflow_controlled_lengthr?   acknowledge_received_datar   r   StreamEnded)rN   r   rS   r   amounts        r   _receive_response_bodyz&HTTP2Connection._receive_response_body0  s      	..w	BBE%!788 588KKK))'222j    E29#899 	r    Kh2.events.ResponseReceived | h2.events.DataReceived | h2.events.StreamEndedc                6   | j                             |          s0|                     ||           | j                             |          0| 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   )	rJ   get_receive_eventspoprt   r;   r   StreamResetr   )rN   r   rS   r   s       r   r   z%HTTP2Connection._receive_stream_event@  s     ,""9-- 	5  )444 ,""9-- 	5Y'++A..eRY233 	-%e,,,r    
int | Nonec           	        | j         5  | j        H| j        j        }|r&|r$||k    r| xj        dz  c_        t	                      t          | j                  || j                            |          s0|                     |          }|D ]}t          |t          j        j                  rKt          dt          |          5 }|                     |           ||_        ddd           n# 1 swxY w Y   mt          |t          j        j        t          j        j        t          j        j        t          j        j        f          r4|j        | j        v r%| j        |j                                     |           t          |t          j        j                  r|| _        ddd           n# 1 swxY w Y   |                     |           dS )zp
        Read some data from the network until we see one or more events
        for a given stream ID.
        Nr   receive_remote_settings)rE   rK   last_stream_idrB   r   r   rJ   r   _read_incoming_datart   r;   r   RemoteSettingsChangedr   ra   _receive_remote_settings_changerq   r   r   r   r   rS   r   ConnectionTerminatedr   )rN   r   rS   r   r   r   rz   s          r   r   zHTTP2Connection._receive_eventsO  sE    _ %	< %	<*6!%!<!K 3 3I4N4N''1,''0222)$*EFFF  (8(8(C(C 11'::# < <E!%)HII <"5vw  7" @@GGG16E.	7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 $I6I2I1I1	  < !?dl:: L9@@GGG#E29+IJJ <6;3K%	< %	< %	< %	< %	< %	< %	< %	< %	< %	< %	< %	< %	< %	< %	<N 	!!'*****s7   B<F1C-!F1-C11F14C15B0F11F58F5r   h2.events.Eventc                   |j                             t          j        j        j                  }|rt          |j        | j        j	        j
                  }|r|| j        k    r|| j        k    r4| j                                         | xj        dz  c_        || j        k    4|| j        k     r<| j                                         | xj        dz  c_        || j        k     4d S d S d S d S d S )Nr   )changed_settingsr   r;   r   r   r   r   	new_valuer?   rf   rg   re   rh   releaserj   )rN   r   rg   new_max_streamss       r   r   z/HTTP2Connection._receive_remote_settings_change  s   !&!7!;!;K$;"
 "
 " 	+!&0-D O  +?d6G#G#G%(999/77999%%*%% &(999 &(999/77999%%*%% &(99999	+ 	+
+ +#G#G :9r    c                   | j                                          | j        |= | j        5  | j        r| j        s|                                  nq| j        t          j        k    r\| j        sUt          j	        | _        | j
        "t          j                    }|| j
        z   | _        | j        r|                                  d d d            d S # 1 swxY w Y   d S N)rh   r   rJ   rD   rK   rd   r@   r%   r*   r+   r:   time	monotonicrA   rH   )rN   rS   nows      r   rs   z HTTP2Connection._response_closed  s   #++---L# 
	! 
	!* 	!4< 	!

 3 :::4<:16)5.**C&)D,B&BDO, !JJLLL
	! 
	! 
	! 
	! 
	! 
	! 
	! 
	! 
	! 
	! 
	! 
	! 
	! 
	! 
	! 
	! 
	! 
	!s   BCCCc                    | j                                          t          j        | _        | j                                         d S r   )r?   close_connectionr%   r,   r@   r9   rd   rN   s    r   rd   zHTTP2Connection.close  s=     	''))))0""$$$$$r    list[h2.events.Event]c                j   |j                             di           }|                    dd           }| j        | j        	 | j                            | j        |          }|dk    rt          d          n"# t          $ r}|| _        d| _        |d }~ww xY w| j	        
                    |          }|S )Ntimeoutreadr    zServer disconnectedT)r\   r   rL   r9   r   READ_NUM_BYTESr   	ExceptionrI   r?   receive_data)rN   r   timeoutsr   r   rw   r   s          r   r   z#HTTP2Connection._read_incoming_data  s    %)))R88,,vt,,+&&	',,T-@'JJDs{{)*?@@@  	 	 	 $'D %)D"I	 )-(C(CD(I(Is   5A7 7
BBBc                v   |j                             di           }|                    dd           }| j        5  | j                                        }| j        | j        	 | j                            ||           n"# t          $ r}|| _        d| _	        |d }~ww xY w	 d d d            d S # 1 swxY w Y   d S )Nr   writeT)
r\   r   rF   r?   data_to_sendrM   r9   r   r   rI   )rN   r   r   r   r   rw   s         r   r   z$HTTP2Connection._write_outgoing_data  s   %)))R88,,w-- 	 	>6688L$0++$**<AAAA    ),%)-&	 B	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s5   (B."A>=B.>
BBBB..B25B2c                    | j                             |          }| j         j        }t          ||          }|dk    rQ|                     |           | j                             |          }| j         j        }t          ||          }|dk    Q|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   )rN   r   rS   
local_flowmax_frame_sizeflows         r   r   z'HTTP2Connection._wait_for_outgoing_flow  s     .BB9MM
"nD:~..aii  )))AA)LLJ!^CNz>22D	 aii
 r    r   c                    || j         k    S r   )r8   rN   r2   s     r   r^   z"HTTP2Connection.can_handle_request  s    %%r    c                    | j         t          j        k    o9| j         o1| j         o)| j        j        j        t          j	        j
        j        k     S r   )r@   r%   r,   rI   rH   r?   state_machinestater;   r<   ConnectionStater   s    r   is_availablezHTTP2Connection.is_available  sX    K.55 **-- ,2=078		
r    c                P    t          j                    }| j        d uo
|| j        k    S r   )r   r   rA   )rN   r   s     r   has_expiredzHTTP2Connection.has_expired  s(    n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6r    c                ,    | j         t          j        k    S r   )r@   r%   r,   r   s    r   	is_closedzHTTP2Connection.is_closed  s    {1888r    strc                \    t          | j                  }|d| j        j         d| j         S )Nz
, HTTP/2, , Request Count: )r   r8   r@   namerB   r   s     r   infozHTTP2Connection.info  sD    T\"" 4 44;#3 4 4"14 4	
r    c           	     ~    | j         j        }t          | j                  }d| d|d| j        j         d| j         d	S )N<z [z, r   z]>)	__class__r'   r   r8   r@   r   rB   )rN   
class_namer2   s      r   __repr__zHTTP2Connection.__repr__  sc    ^,
T\""6
 6 6f 6 6$+*: 6 6"16 6 6	
r    c                    | S r   r-   r   s    r   	__enter__zHTTP2Connection.__enter__  s    r    exc_typetype[BaseException] | None	exc_valueBaseException | None	tracebacktypes.TracebackType | Nonec                .    |                                   d S r   )rd   )rN   r  r  r	  s       r   __exit__zHTTP2Connection.__exit__   s     	

r    r   )r2   r	   r3   r   r4   r5   )r   r
   r   r   )r   r
   r   r|   )r   r
   rS   r   r   r|   )r   r
   rS   r   r   r   r   r|   )r   r
   rS   r   r   r   )r   r
   rS   r   r   r   )r   r
   rS   r   r   r   )r   r
   rS   r   r   r|   )r   r   r   r|   )rS   r   r   r|   r   r|   )r   r
   r   r   )r   r
   rS   r   r   r   )r2   r	   r   r   )r   r   )r   r   )r   r/   )NNN)r  r  r  r  r	  r
  r   r|   )"r'   r(   r)   r   r;   r7   H2Configurationr>   rO   r{   rb   rn   ro   r   r   rp   r   r   r   r   rs   rd   r   r   r   r^   r   r   r   r   r   r  r  r  r-   r    r   r/   r/   *   si       NY&&&FFF *.	#7 #7 #7 #7 #7Jd d d dL+ + + +B+ + + +>
2 
2 
2 
2/ / / /+ + + +& & & &*         9=.+ .+ .+ .+ .+`+ + + +"! ! ! !% % % %   8   6   (& & & &	
 	
 	
 	
E E E E7 7 7 79 9 9 9
 
 
 

 
 
 
   
 04*.04	      r    r/   c                  &    e Zd Zdd	ZddZddZdS )rr   r<   r/   r   r
   rS   r   r   r|   c                >    || _         || _        || _        d| _        d S )NF)_connection_request
_stream_id_closed)rN   r<   r   rS   s       r   rO   z"HTTP2ConnectionByteStream.__init__*  s%     &#r    r   c              #    K   | j         | j        d}	 t          dt          | j         |          5  | j                            | j         | j                  D ]}|V  	 d d d            d S # 1 swxY w Y   d S # t          $ rA}t                      5  |                                  d d d            n# 1 swxY w Y   |d }~ww xY w)NrR   receive_response_body)	r  r  r   ra   r  r   rc   r   rd   )rN   rv   r   rw   s       r   __iter__z"HTTP2ConnectionByteStream.__iter__2  sp     !]II	.vNN    !-DD MT_ E      E  KKKK                                    
  	 	 	 $%%  

              I	s^   A8 .A+A8 +A//A8 2A/3A8 8
CB>B1%B>1B5	5B>8B5	9B>>Cc                    | j         sgd| _         d| j        i}t          dt          | j        |          5  | j                            | j                   d d d            d S # 1 swxY w Y   d S d S )NTrS   r]   rW   )r  r  r   ra   r  r  rs   )rN   rv   s     r   rd   zHTTP2ConnectionByteStream.closeB  s    | 	MDL!4?3F(&$-HH M M 11DO1LLLM M M M M M M M M M M M M M M M M M	M 	Ms   !A""A&)A&N)r<   r/   r   r
   rS   r   r   r|   )r   r   r  )r'   r(   r)   rO   r  rd   r-   r    r   rr   rr   )  sV               M M M M M Mr    rr   )r   r
   r   r   )&
__future__r   enumloggingr   typesr   	h2.configr;   h2.connection	h2.eventsh2.exceptionsh2.settings_backends.baser   _exceptionsr   r   r   _modelsr	   r
   r   _synchronizationr   r   r   _tracer   
interfacesr   	getLoggerra   r#   IntEnumr%   r/   rr   r-   r    r   <module>r*     s   " " " " " "                          * * * * * *         
 0 / / / / / / / / / B B B B B B B B B B       + + + + + +		+	,	,       $,   | | | | |) | | |~M M M M M M M M M Mr    