
    F2jZ                    "   U d dl mZ d dlZd dlmZmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZmZ ddlmZmZ ddlmZmZmZmZmZ dd	lmZ d
dlmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& d
dlm'Z( d
dlmZ) d
dl*m+Z+  ej,        d          Z-dgZ.dZ/ e0d          Z1 e0d          Z2 e0d          Z3 e0d          Z4 e0d          Z5 e0            Z6de7d<    e8d          Z9 e:dd          D ]Z;d
e9e;<   [; G d de          Z< G d de          Z= G d d e          Z> G d! d"e          Z? G d# d$e          Z@ G d% d&eA          ZB G d' d(eB          ZC G d) d*eB          ZD G d+ d,eB          ZE G d- d.eB          ZF G d/ d0eB          ZG G d1 d2eB          ZH G d3 d4eB          ZI G d5 d6eB          ZJ G d7 d8eB          ZK G d9 d:eB          ZLdXd@ZMdYdCZNdZdEZOd[dFZP	 d\d]dMZQd^dOZRd^dPZSd_dRZTd^dSZU G dT dU          ZV G dV dW          ZWdS )`    )annotationsN)EnumIntEnum   )UINT_VAR_MAX_SIZE)	BufferBufferReadErrorDecoderStreamErrorDecompressionFailedEncoderStreamErrorQpackDecoderQpackEncoderStreamBlockedencode_uint_var)QuicConnectionstream_is_unidirectional)DatagramFrameReceived	QuicEventStopSendingReceivedStreamDataReceivedStreamReset)QuicLoggerTrace   )	DatagramReceivedDataReceivedGoawayReceivedH3EventHeadersHeadersReceivedInformationalHeadersReceivedPushPromiseReceivedWebTransportStreamDataReceived)StopSending)r   )NoAvailablePushIDErrorhttp3h3)r   r            )   :status)   :method   :scheme
   :authority   :paths	   :protocol)r+   r-   )r+   r,   r-   r.   frozenset[bytes]_TRAILERS_PSEUDO   A   [   c                  b    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdS )	ErrorCode3   r1   i  i  i  i  i  i  i  i  i	  i
  i  i  i  i  i  i  i   i  i  N)__name__
__module____qualname__H3_DATAGRAM_ERRORH3_NO_ERRORH3_GENERAL_PROTOCOL_ERRORH3_INTERNAL_ERRORH3_STREAM_CREATION_ERRORH3_CLOSED_CRITICAL_STREAMH3_FRAME_UNEXPECTEDH3_FRAME_ERRORH3_EXCESSIVE_LOADH3_ID_ERRORH3_SETTINGS_ERRORH3_MISSING_SETTINGSH3_REQUEST_REJECTEDH3_REQUEST_CANCELLEDH3_REQUEST_INCOMPLETEH3_MESSAGE_ERRORH3_CONNECT_ERRORH3_VERSION_FALLBACKQPACK_DECOMPRESSION_FAILEDQPACK_ENCODER_STREAM_ERRORQPACK_DECODER_STREAM_ERROR     Y/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/qh3/h3/connection.pyr5   r5   D   s        K %$ %NK !!&!&!&rP   r5   c                  6    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdS )	FrameTyper   r   r   r'   r(   r)            r2   N)r7   r8   r9   DATAHEADERSPRIORITYCANCEL_PUSHSETTINGSPUSH_PROMISEGOAWAYMAX_PUSH_IDDUPLICATE_PUSHWEBTRANSPORT_STREAMrO   rP   rQ   rS   rS   \   sC        DGHKHLFKNrP   rS   c                      e Zd ZdZdZdZdS )HeadersStater   r   r   N)r7   r8   r9   INITIALAFTER_HEADERSAFTER_TRAILERSrO   rP   rQ   rb   rb   i   s        GMNNNrP   rb   c                  .    e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
Settingr      rT      r6   iw iB7`+!   N)r7   r8   r9   QPACK_MAX_TABLE_CAPACITYMAX_FIELD_SECTION_SIZEQPACK_BLOCKED_STREAMSENABLE_CONNECT_PROTOCOLH3_DATAGRAMH3_DATAGRAM_DRAFT05ENABLE_WEBTRANSPORTDUMMYrO   rP   rQ   rg   rg   o   sB        "  "K #$ EEErP   rg   c                  "    e Zd ZdZdZdZdZdZdS )
StreamTyper   r   r   r'   T   N)r7   r8   r9   CONTROLPUSHQPACK_ENCODERQPACK_DECODERWEBTRANSPORTrO   rP   rQ   rt   rt      s'        GDMMLLLrP   rt   c                  *    e Zd ZdZej        ZdddZdS )	ProtocolErrorz
    Base class for protocol errors.

    These errors are not exposed to the API user, they are handled
    in :meth:`H3Connection.handle_event`.
     reason_phrasestrc                    || _         d S N)r~   )selfr~   s     rQ   __init__zProtocolError.__init__   s    *rP   N)r}   )r~   r   )r7   r8   r9   __doc__r5   r<   
error_coder   rO   rP   rQ   r|   r|      sA          4J+ + + + + + +rP   r|   c                      e Zd Zej        ZdS )QpackDecompressionFailedN)r7   r8   r9   r5   rL   r   rO   rP   rQ   r   r              5JJJrP   r   c                      e Zd Zej        ZdS )QpackDecoderStreamErrorN)r7   r8   r9   r5   rN   r   rO   rP   rQ   r   r      r   rP   r   c                      e Zd Zej        ZdS )QpackEncoderStreamErrorN)r7   r8   r9   r5   rM   r   rO   rP   rQ   r   r      r   rP   r   c                      e Zd Zej        ZdS )ClosedCriticalStreamN)r7   r8   r9   r5   r?   r   rO   rP   rQ   r   r      s        4JJJrP   r   c                      e Zd Zej        ZdS )
FrameErrorN)r7   r8   r9   r5   rA   r   rO   rP   rQ   r   r      s        )JJJrP   r   c                      e Zd Zej        ZdS )FrameUnexpectedN)r7   r8   r9   r5   r@   r   rO   rP   rQ   r   r              .JJJrP   r   c                      e Zd Zej        ZdS )MessageErrorN)r7   r8   r9   r5   rI   r   rO   rP   rQ   r   r      s        +JJJrP   r   c                      e Zd Zej        ZdS )MissingSettingsErrorN)r7   r8   r9   r5   rE   r   rO   rP   rQ   r   r      r   rP   r   c                      e Zd Zej        ZdS )SettingsErrorN)r7   r8   r9   r5   rD   r   rO   rP   rQ   r   r      s        ,JJJrP   r   c                      e Zd Zej        ZdS )StreamCreationErrorN)r7   r8   r9   r5   r>   r   rO   rP   rQ   r   r      s        3JJJrP   r   
frame_typeint
frame_databytesreturnc                    t          |          }t          |dt          z  z             }|                    |            |                    |           |                    |           |j        S )Nr   capacity)lenr   r   push_uint_var
push_bytesdata)r   r   frame_lengthbufs       rQ   encode_framer      si    z??L
,->)>>
?
?
?Cj!!!l###NN:8OrP   settingsdict[int, int]c                    t          d          }|                                 D ]/\  }}|                    |           |                    |           0|j        S )Ni   r   )r   itemsr   r   )r   r   settingvalues       rQ   encode_settingsr      sa    
$


C"..** ! !'"""%    8OrP   r   c                    t          |           }|                                }|                                st          d          |S )Nr   z*MAX_PUSH_ID frame has extra trailing bytes)r   pull_uint_vareofr   )r   r   max_push_ids      rQ   parse_max_push_idr      sI    
d


C##%%K7799 GEFFFrP   c                X   t          |           }i }|                                sv|                                }|                                }|t          v rt	          d|dd          ||v rt	          d|dd          |||<   |                                vt          |          S )Nr   zSetting identifier 0xxz is reserved is included twice)r   r   r   RESERVED_SETTINGSr   dict)r   r   r   r   r   s        rQ   parse_settingsr      s    
d


C!Hggii "##%%!!##''' O O O O OPPPh U U U U UVVV! ggii " >>rP   headersr   allowed_pseudo_headersrequired_pseudo_headersextract_headerbytes | Nonec                   d}d }d }d }t                      }d }	t          }
| D ]\  }}|D ]}|
|         rt          d|d          ||	|}	|r|d         dk    rs|rt          d|d          ||vrt          d|d          ||v rt          d|d	          |                    |           |d
k    r|}|dk    r|}|dk    r|}d}|                    |          s5|                    |          }t          dt          |           d          |dv r"|st          d          |st          d          |	S )NFzHeader z contains uppercase lettersr   :   zPseudo-header z% is not allowed after regular headersz is not validr   r-   r.   r,   TzPseudo-headers z are missing)s   https   httpsz+Pseudo-header b':authority' cannot be emptyz&Pseudo-header b':path' cannot be empty)set_HAS_UPPERCASEr   addissubset
differencesorted)r   r   r   r   after_pseudo_headers	authoritypathschemeseen_pseudo_headersextracted_header_value
_has_upperkeyr   bmissings                  rQ   validate_headersr      s    !"IDF&)ee+/J ( (
U 	Q 	QA!} Q"#OS#O#O#OPPPQ %*@*H%*" 	(3q6R<<# "QSQQQ   000"#HC#H#H#HIII)))"#MC#M#M#MNNN##C((( m##!		
"" $(   #++,?@@ L)445HIIJVG__JJJKKK$$$ 	NLMMM 	IGHHH!!rP   Nonec                >    t          | t          t                     d S N)r   r   )r   _PUSH_PROMISE_PSEUDOr   s    rQ   validate_push_promise_headersr   %  s,    3 4     rP   c                >    t          | t          t                     d S r   )r   _REQUEST_ALLOWED_PSEUDO_REQUEST_REQUIRED_PSEUDOr   s    rQ   validate_request_headersr   -  s,    6 8     rP   
int | Nonec                    t          | t          t          d          }|d S 	 t          |          S # t          $ r t          d|          d w xY w)Nr*   )r   r   r   zInvalid :status value )r   _RESPONSE_ALLOWED_PSEUDO_RESPONSE_REQUIRED_PSEUDOr   
ValueErrorr   )r   status_codes     rQ   validate_response_headersr   5  s{     07 9!	! ! !K tO; O O OCKCCDD$NOs	   2 Ac                >    t          | t          t                     d S r   )r   r0   r   s    rQ   validate_trailersr   F  s,    / 0     rP   c                  &    e Zd Zd
dZddZddZd	S )H3Stream	stream_idr   r   r   c                
   d| _         d | _        t                      | _        d| _        d | _        d | _        t          j        | _	        t          j        | _
        d | _        d | _        || _        d | _        d| _        d| _        d S )NF)blockedblocked_frame_size	bytearraybufferended
frame_sizer   rb   rc   headers_recv_stateheaders_send_statepush_id
session_idr   stream_typereceiving_endedsending_endedr   r   s     rQ   r   zH3Stream.__init__O  sz    .2kk
&*&*0<0D0<0D#'&*"'+$"rP   boolc                .    | j         o| j        o| j         S r   )r   r   r   r   s    rQ   is_endedzH3Stream.is_ended_  s    !Od&:O4<?OOrP   c                @    | j         rt          d          d| _         d S )Nzstream was already endedT)r   r   r   s    rQ   finish_sendingzH3Stream.finish_sendingb  s*     	>!"<===!rP   N)r   r   r   r   )r   r   r   r   )r7   r8   r9   r   r   r   rO   rP   rQ   r   r   N  sT        # # # # P P P P" " " " " "rP   r   c                     e Zd ZdZd@dAd	Z	 d@dBdZdCdZdDdZdEdZdEdZ	dFdZ
dGdZdHdZ	 d@dId ZedJd"            ZedJd#            ZdKdLd(ZdMd+ZdNd,ZdOd.ZdPd0ZdQd2ZdRd4ZdSd6ZdTd7Z	 dKdUd8ZdVd9ZdWd;ZdXd<ZdXd=ZdYd?Zd$S )ZH3Connectionzu
    A low-level HTTP/3 connection object.

    :param quic: A :class:`~qh3.connection.QuicConnection` instance.
    Fquicr   enable_webtransportr   r   r   c                   d| _         d| _        || _        |j        j        | _        d| _        || _        |j        | _        t          | j         | j                  | _
        d| _        d| _        t                      | _        d| _        d| _        d| _        i | _        | j        rdnd | _        d| _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        i | _        |                                  d S )Ni   d   Fr   ri   )_max_table_capacity_blocked_streams_enable_webtransportconfiguration	is_client
_is_client_is_done_quic_quic_loggerr   _decoder_decoder_bytes_received_decoder_bytes_sentr   _encoder_encoder_bytes_received_encoder_bytes_sent_settings_received_stream_max_push_id_next_push_id_local_control_stream_id_local_decoder_stream_id_local_encoder_stream_id_peer_control_stream_id_peer_decoder_stream_id_peer_encoder_stream_id_received_settings_sent_settings_blocked_stream_map_init_connection)r   r  r  s      rQ   r   zH3Connection.__init__p  s   #(  #$7!,6
484E$T%=t?TUU'($#$ $'($#$ "',.-1_(F$"#48%48%48%37$37$37$9=598: rP   r   r   is_unidirectionalc                   |rH|                      t          j                  }| j                            |t          |                     n|| j                                        }|                     |t          j                   | j                            |t          t          j	                  t          |          z              |S )z
        Create a WebTransport stream and return the stream ID.

        :param session_id: The WebTransport session identifier.
        :param is_unidirectional: Whether to create a unidirectional stream.
        r   r   )
_create_uni_streamrt   rz   r  send_stream_datar   get_next_available_stream_id_log_stream_typerS   r`   )r   r   r%  r   s       rQ   create_webtransport_streamz'H3Connection.create_webtransport_stream  s      	//
0GHHIJ''	?:3N3NOOOO
??AAI!!#1H "    J''	 =>>!*--.  
 rP   eventr   list[H3Event]c                (   | j         s		 t          |t                    r|                     |          S t          |t                    r|                     |j                  S t          |t                    r |                     |j	        |j
                  S t          |t                    r |                     |j	        |j
                  S nD# t          $ r7}d| _         | j                            |j
        |j                   Y d}~nd}~ww xY wg S )zx
        Handle a QUIC event and return a list of HTTP events.

        :param event: The QUIC event to handle.
        T)r   r~   N)r  
isinstancer   _receive_stream_datar   _receive_datagramr   r   _receive_stream_resetr   r   r   _receive_stop_sendingr|   r  closer~   )r   r-  excs      rQ   handle_eventzH3Connection.handle_event  s7    } 	e%788 Y44U;;;'<== Y11%*==={33 Y55eouGWXXX':;; Y55eouGWXXXY     $
  "~S=N !         	s(   )C .C #4C 4C 
D-D

Dr   c                R    || j         | j        | j        | j        | j        | j        fv S )z
        RFC 9114 6.2: control, QPACK encoder, and QPACK decoder streams are
        critical streams. Closure of any critical stream MUST be treated as
        a connection error of type H3_CLOSED_CRITICAL_STREAM.
        )r  r  r   r  r  r  r   s     rQ   _is_critical_streamz H3Connection._is_critical_stream  s:     ((()))
 
 	
rP   r   c                t   |                      |          rt          d| d          | j                            |          }|t	          ||          gS d|_        |                                r| j                            |d            | j                            |d            t	          ||          gS )NCritical stream z reset by peerr   r   T)	r9  r   r  getH3StreamResetr   r   popr#  r   r   r   streams       rQ   r3  z"H3Connection._receive_stream_reset  s     ##I.. 	U&'S)'S'S'STTT!!),,>!I*MMMNN "&?? 	.LY--- $$Y555	jIIIJJrP   c                P   |                      |          rt          d| d          | j                            |          }|6d|_        |                                r| j                            |d            | j                            |d            t          ||          gS )Nr;  z stop-sending by peerTr<  )	r9  r   r  r=  r   r   r?  r#  H3StopSendingr@  s       rQ   r4  z"H3Connection._receive_stop_sending  s     ##I.. 	&C9CCC   !!),,#'F    2  D111 	 $$Y555	jIIIJJrP   flow_idr   r   c                Z    | j                             t          |          |z              dS )z
        Send a datagram for the specified flow.

        :param flow_id: The flow ID.
        :param data: The HTTP/3 datagram payload.
        N)r  send_datagram_framer   )r   rD  r   s      rQ   send_datagramzH3Connection.send_datagram  s-     	
&&w'?'?$'FGGGGGrP   r   r   c                   | j         r
J d            | j        | j        | j        k    rt          | j        }| xj        dz  c_        | j                            |t          t          j        t          |          | 
                    ||          z                        |                     t          j        |          }| j                            |t          |                     |S )a  
        Send a push promise related to the specified stream.

        Returns the stream ID on which headers and data can be sent.

        :param stream_id: The stream ID on which to send the data.
        :param headers: The HTTP request headers for this push.
        z%Only servers may send a push promise.Nr   )r   )r  r  r  r$   r  r)  r   rS   r\   r   _encode_headersr(  rt   rw   )r   r   r   r   push_stream_ids        rQ   send_push_promisezH3Connection.send_push_promise  s     ?KK$KKK"$(:d>O(O(O(( $a
##&((4+?+?	7+S+SS 	
 	
 	
 00'0RR
##NOG4L4LMMMrP   
end_streamc           	        |                      |          }|j        t          j        k    rt	          d          |r|                                 |                     |           | j        D| j                            dd| j        	                    t          |          |                     | j                            |t          t          j        |          |           dS )a  
        Send data on the given stream.

        To retrieve datagram which need to be sent over the network call the QUIC
        connection's :meth:`~qh3.connection.QuicConnection.datagrams_to_send`
        method.

        :param stream_id: The stream ID on which to send the data.
        :param data: The data to send.
        :param end_stream: Whether to end the stream.
        'DATA frame is not allowed in this stateNhttpframe_createdlengthr   categoryr-  r   )_get_or_create_streamr   rb   rd   r   r   _maybe_cleanup_streamr  	log_eventencode_http3_data_framer   r  r)  r   rS   rW   )r   r   r   rL  rA  s        rQ   	send_datazH3Connection.send_data$  s     ++I66$(BBB!"KLLL 	$!!###""6*** (''%&>>t99	 ?   (    	
##|IND99:	
 	
 	
 	
 	
rP   c           	        |                      |          }|j        t          j        k    rt	          d          |r|                                 |                     ||          }| j        E| j                            dd| j        	                    t          |          ||                     |j        t          j        k    r\d}| j        s?|s=|D ]:\  }}|dk    rt          |          d	k     rd
} n#|                    d          s n;|st          j        |_        nt          j        |_        | j                            |t%          t&          j        |          |           |                     |           dS )a  
        Send headers on the given stream.

        To retrieve datagram which need to be sent over the network call the QUIC
        connection's :meth:`~qh3.connection.QuicConnection.datagrams_to_send`
        method.

        :param stream_id: The stream ID on which to send the headers.
        :param headers: The HTTP headers to send.
        :param end_stream: Whether to end the stream.
        *HEADERS frame is not allowed in this stateNrO  rP  rR  r   r   rS  Fr*      T   :)rU  r   rb   re   r   r   rI  r  rW  encode_http3_headers_framer   rc   r  r   
startswithrd   r  r)  r   rS   rX   rV  )	r   r   r   rL  rA  r   is_informational_headerskvs	            rQ   send_headerszH3Connection.send_headersH  s    ++I66$(CCC!"NOOO 	$!!###)))W==
 (''%&AAz??Gy B   (    $(<<<',$? : #  DAqJq66C<<7;4!E ( \\$//  , G,8,F)(4(CF%
##|I$5zBBJ	
 	
 	
 	""6*****rP   dict[int, int] | Nonec                    | j         S )z>
        Return the received SETTINGS frame, or None.
        )r!  r   s    rQ   received_settingszH3Connection.received_settings  s    
 &&rP   c                    | j         S )z:
        Return the sent SETTINGS frame, or None.
        )r"  r   s    rQ   sent_settingszH3Connection.sent_settings  s    
 ""rP   Nr   r   r   c                    | j                             d          }|                     |||           | j                             |t	          |                     |S )zD
        Create an unidirectional stream of the given type.
        T)r%  r   r   r   )r  r*  r+  r)  r   )r   r   r   r   s       rQ   r(  zH3Connection._create_uni_stream  sh     J;;d;SS	yk 	 	
 	
 	
 	
##I{/K/KLLLrP   r   r   c                l   	 |#| j         |         j        \  }}| j         |         `n.|st                      | j                            ||          \  }}| xj        t          |          z  c_        | j                            | j	        |           n!# t          $ r}t                      |d}~ww xY w|S )z
        Decode a HEADERS block and send decoder updates on the decoder stream.

        This is called with frame_data=None when a stream becomes unblocked.
        N)r#  _pendingr   r  feed_headerr  r   r  r)  r  r   )r   r   r   decoderr   r6  s         rQ   _decode_headerszH3Connection._decode_headers  s    	6!#'#;I#F#O ,Y7@@ " 0-///#'=#<#<Y
#S#S $$G4$$J''(EwOOOO" 	6 	6 	6*,,#5	6 s   BB 
B1B,,B1c                   	 | j                             ||          \  }}n!# t          $ r}t                      |d}~ww xY w| xj        t          |          z  c_        | j                            | j        |           |S )zX
        Encode a HEADERS block and send encoder updates on the encoder stream.
        N)	r  encoder   r   r  r   r  r)  r  )r   r   r   encoderr   r6  s         rQ   rI  zH3Connection._encode_headers  s    	5"&-"6"6y'"J"JGZZ! 	5 	5 	5)++4	5 	  CLL0  
##D$A7KKKs   ! 
?:?r   c                p    | j                             |          }|t          |          }|| j         |<   |S r   )r  r=  r   )r   r   rA  s      rQ   rU  z"H3Connection._get_or_create_stream  s:    !!),,>i((F&,DL#rP   rA  c                    |                                 rB| j                            |j        d            | j                            |j        d            d S d S r   )r   r  r?  r   r#  )r   rA  s     rQ   rV  z"H3Connection._maybe_cleanup_stream  s`    ?? 	ALV-t444 $(()94@@@@@		A 	ArP   r   c           
         t           j        | j        t           j        dt           j        | j        t           j        dt           j        di}| j        rd|t           j	        <   |S )z3
        Return the local HTTP/3 settings.
        i   r   )
rg   rk   r  rl   rm   r	  ro   rr   r
  rq   )r   r   s     rQ   _get_local_settingsz H3Connection._get_local_settings  sW    
 ,d.F*F)4+@M1$
 $ 	645HW01rP   r   c                   |t           j        k    r| j        st          |t           j        k    r| j        rt	          d          t          |          }|                     |           || _        | j        	                    |
                    t          j        d          |
                    t          j        d          |
                    t          j        d                    }| j                            | j        |           d| _        n|t           j        k    rXt%          |          }|                                }|                                st+          d          t-          |          gS |t           j        k    r+| j        rt	          d          t3          |          | _        n?|t           j        t           j        t           j        t           j        fv rt	          d	          g S )
zG
        Handle a frame received on the peer's control stream.
        z#SETTINGS have already been receivedr   )max_table_capacitydyn_table_capacityblocked_streamsTr   z%GOAWAY frame has extra trailing bytes)r   z!Servers must not send MAX_PUSH_IDz$Invalid frame type on control stream)rS   r[   r  r   r   r   _validate_settingsr!  r  apply_settingsr=  rg   rk   rm   r  r)  r  r]   r   r   r   r   r   r^   r  r   r  rW   rX   r\   r_   )r   r   r   r   rs  r   	goaway_ids          rQ   _handle_control_framez"H3Connection._handle_control_frame  s    +++D4K+&&+++& M%&KLLL%j11H##H---&.D#m22#+<<0PRS#T#T#+<<0PRS#T#T (W-JA N N 3  G
 J''(EwOOO&*D##9+++j)))C))++I7799 J !HIII"Y777889000 K%&IJJJ 1* = =DN"$	
 
 
 ""HIII	rP   stream_endedc           
        |t           j        k    rF|j        t          j        urt          d          |s|rt          ||j        ||j                  gS g S g }|t           j	        k    r|j        t          j
        u rt          d          |                     |j        |          }d}|j        t          j        u r'| j        rt          |          }nt          |           nt!          |           | j        S| j                            dd| j                            ||j        nt+          |          ||j                             |j        t          j        u r||d	k    s|rt          j        |_        nt          j
        |_        |j        rd
}|j        t          j        u r3|1|d	k     r+|                    t1          ||j                             n|                    t3          ||j        |j        |                     n||t           j        k    r|j        | j        st          d          t7          |          }|                                }	|                     |j        ||                                d                   }t=          |           | j        K| j                            dd| j                            t+          |          ||	|j                             |                    tA          ||	|j                             ni|t           j!        t           j"        t           j#        t           j        t           j$        t           j%        t           j&        fv rt          |j        dnd          |S )zF
        Handle a frame received on a request or push stream.
        rN  )r   r   r  r   r[  NrO  frame_parsedr\  rS  r]  T)r   r   )r   r   r   r  z"Clients must not send PUSH_PROMISEr   )rR  r   r   r   )r   r   r   z$Invalid frame type on request streamz!Invalid frame type on push stream)'rS   rW   r   rb   rd   r   r   r   r   rX   re   rp  rc   r  r   r   r   r  rW  r_  r   r   r   appendr    r   r\   r   r   tellr   encode_http3_push_promise_framer!   rY   rZ   r[   r]   r^   r_   )
r   r   r   rA  r  http_eventsr   r   	frame_bufr   s
             rQ   _handle_request_or_push_framez*H3Connection._handle_request_or_push_frame  s    ''(0JJJ%&OPPP z  ' &%1"("2	    I%'***(L,GGG%&RSSS **6+;ZHHG&*K (L,@@@? 6";G"D"DKK,W5555!'***  ,!++#(*EE  *1 #55!$Z '"("2 F   ,    (L,@@@ &+*<*<*<0<0JF-,8,G) ) (#'L )\-AAA+#%%""0 '"("2      ""# ' &"("2%1	      9111fn6L? L%&JKKKJ///I--//G** *Y^^-=-=-?-?"@ G
 *'222  ,!++#(*JJ": ' '"("2	 K   , 	 	 	 ##W@P     
 !"!$
 
 
 ">) 768   rP   c           	     T   |                      t          j                  | _        |                                 | _        | j                            | j        t          t          j
        t          | j                                       | j        rQ| j        J| j                            | j        t          t          j        t          | j                                       |                      t          j                  | _        |                      t          j                  | _        d S r   )r(  rt   rv   r  rw  r"  r  r)  r   rS   r[   r   r  r  r^   r   rx   r  ry   r  r   s    rQ   r$  zH3Connection._init_connection  s    (,(?(?
@R(S(S%"6688
##)+_T=P-Q-QRR	
 	
 	
 ? 	t0<J''-Y2ODDU4V4VWW   )-(?(?$)
 )
% )-(?(?$)
 )
%%%rP   c                    | j         Gdddddd                    |d          }||d}|||d	<   | j                             d
d|           d S d S )Ncontrolpushqpack_encoderqpack_decoderwebtransport)r   r   r   r'   ru   unknown)newr   associated_push_idrO  stream_type_setrS  )r  r=  rW  )r   r   r   r   	type_namer   s         rQ   r+  zH3Connection._log_stream_type  s     (""$  c+y))  %9==D"-4)*''' (      )(rP   c                    t          |          }	 |                                }n# t          $ r t          d          w xY wt	          ||                                d         |          gS )z$
        Handle a datagram.
        r   zCould not parse flow IDN)r   rD  )r   r   r	   r|   r   r  )r   r   r   rD  s       rQ   r2  zH3Connection._receive_datagram  s}     $	;''))GG 	; 	; 	; 9:::	; d388::<<&8'JJJKKs	   ' Ar   c                   |j         }|                     |          }t          |          r"|                     ||j        |j                  }n!|                     ||j        |j                  }|                     |           |S r   )r   rU  r   _receive_stream_data_unir   rL  _receive_request_or_push_datarV  )r   r-  r   rA  results        rQ   r1  z!H3Connection._receive_stream_data  s    O	++I66#I.. 	2265:uGWXXFF77
E$4 F 	""6***rP   c           	     
   g }|j         }|rd|_        |j        r|                    |           |S |j        }|j        t          j        k    r|j        |rb|                    |           |	                    t          t          |          |j        ||                     |                                 n+|	                    t          ||j        ||                     |S |j        t          j        k    r|j        |sit          |          }||j        k     rN|rt!          d          |	                    t#          ||j        |d                     |xj        |z  c_        |S n|                    |           t          |          }||j        k     ro|rt!          d          |	                    t#          t          |          |j        |d                     |xj        |z  c_        |                                 |S d}|r2|s0|s.|j        t(          j        urt#          d|j        |d          gS g S |r|                    |           t-          t          |                    }	d	}
|	j        }|	j        }|	j        }|	j        }| j        } |            sS|j        8	  |            |_         |            |_        n# t8          $ r Y nw xY w |            }
|j        t          j        k    r|j        |_        d|_        t          ||
d                   }|                                 |                     |t<          j        
           |s|r+|	                    t          ||j        ||                     |S | j         Q|j        t          j        k    r<| j         !                    dd| j         "                    |j        |                     |j        }tG          ||	j$        |
z
            }|j        t          j        k    r||k     rn ||          }|j        } |            }
||z
  |_        |j        sd|_        d|_        	 |                     |||||j        o	 |                                 n5# tJ          $ r( d|_        t          |          |_&        || j'        |<   Y n9w xY w|j        t(          j(        u r|j        rt          |          }
n |            S|
r|d|
= |r`|s^|j        sW|j        t(          j)        u rD|rtU          |d         dd          s+|	                    t#          d|j        |d                     |S )zC
        Handle data received on a request or push stream.
        TN)r   r   r   r  z"DATA frame truncated by stream endF)r   r   r   r  rP   r   r   r'  rO  r  rQ  rS  r   r   rA  r  r  )+r   r   r   extendr   r   rS   r`   r   r  r"   r   clearrW   r   r   r   r   r   r   rb   rc   r   r  r   r   
pull_bytesr  r	   r+  rt   rz   r  rW  rX  minr   r   r   r#  re   rd   getattr)r   rA  r   r  r  s_buffers_stream_iddata_lenbuf_lenr   consumedbuf_tellbuf_eofbuf_pull_uint_varbuf_pull_byteshandle_framer   s_frame_size
chunk_sizer   s                       rQ   r  z*H3Connection._receive_request_or_push_data  s    &(= 	*%)F"> 	OOD!!!& !>>>!- %%%""2"8__#)#4"-%1	         ""2!#)#4"-%1	      	..63D3P "t99f///# O()MNNN&&$!%$*N&1).	     %%1%%&& 0 %%%h--V...# O()MNNN&&$!&x$*N&1).	     %%0%%NN$$$&&  
	 
	 
	(0DDD   &"-%)	    I 	"OOD!!!%//***8'-9')) U	 ((9(9(;(;F%(9(9(;(;F%%&   E#8:: $	(EEE(.(9F%(,F%!&x		':!;!;JNN$$$))"-:;R *    " \ #**:%/+1+<*5-9	     '& %1)Y^;;%//!',!.FF#)#4 G   0    ",L\3<(+BCCJ IN22zL7P7P (
33J*JxzzH !-z 9F$ )$(!$(!"" L#-#-%%+%;%I			      !   !%,/
OO)8>(5	 )\-HHH* I x==k ')) U	p  	$(#  	 	 	(L,FFF" 
'O^U+ + 
  &&$!$$*N&1)-	     s$   /K 
KK1R /S Sc           	        g }|j                             |           |rd|_        t          t	          |j                             }d}t                      }|j        t          j        t          j	        t          j
        fv s|                                s|j        	 |                                |_        n# t          $ r Y n[w xY w|                                }|j        t          j	        k    r#| j        t!          d          |j        | _        no|j        t          j        k    r#| j        t!          d          |j        | _        n7|j        t          j        k    r"| j        t!          d          |j        | _        |j        t          j        k    r!|                     |j        |j                   |j        t          j	        k    r|rt/          d          	 |                                }|                                }	|                    |	          }
n# t          $ r Y nw xY w|                                }|                    |                     ||
                     nq|j        t          j        k    r|j        g	 |                                |_        n# t          $ r Y nmw xY w|                                }|                     |j        |j        |j        	           |j         d |= |                     |d
|          S |j        t          j
        k    r|j        @	 |                                |_        n# t          $ r Y nw xY w|                                }t	          |j         |d                    }
|j                                          |
s|r5|                    t?          |
|j        |j        |j                             |S |j        t          j        k    r|                    |j         |                                z
            }|                                }	 | j!        "                    |           n!# tF          $ r}tI                      |d }~ww xY w| xj%        tM          |          z  c_%        nM|j        t          j        k    r	|                    |j         |                                z
            }|                                }	 | j'        (                    |           n!# tR          $ r}tU                      |d }~ww xY w| j+        ,                                D ]Q\  }}	 | j'        -                    |          \  }}||f|_.        |/                    |           B# t`          $ r Y Nw xY w| xj1        tM          |          z  c_1        n.|2                    |j                    |                                }|j        t          j        t          j	        t          j
        fv v|                                |r
|j         d |= |D ]}| j3        |         }|                    | 4                    tj          j6        d ||j        o|j                               d|_7        d |_8        | j+        |= |j         r/|                    |                     |d
|j                             |S )NTr   r   z"Only one control stream is allowedz(Only one QPACK decoder stream is allowedz(Only one QPACK encoder stream is allowedr'  z%Closing control stream is not allowedrk  rP   )r   r   r  r   r  F)9r   r  r   r   r   r   r   rt   rw   rv   rz   r   r   r	   r  r  r   r   ry   r  rx   r   r+  r   r  r  r   r  r   r  r  r"   r   r  feed_decoderr
   r   r  r   r  feed_encoderr   r   r#  r   resume_headerrm  r   r   r  seekr  r  rS   rX   r   r   )r   rA  r   r  r  r   r  unblocked_streamsr   r   r   r6  
blocked_idblocked_streamstream_datar   r   s                    rQ   r  z%H3Connection._receive_stream_data_uni  sF    &(T""" 	*%)F"%..///&)ee !3Z5LMN N7799N
 !)),):):)<)<F&&&   E88:: %);;;3?12VWWW393CD00':+CCC3?1F   4:3CD00':+CCC3?1F   4:3CD0 %88))"("2@R *    !Z%777 X./VWWW!$!2!2!4!4J#&#4#4#6#6L!$!=!=JJ&   E88::""4#=#=j*#U#UVVVV#z66>)),):):)<)<*   "xxzzH)) &"("2$*$6 *    M)8),99&#|TTT#z'>>>$,,/,=,=,?,?))*   "xxzzH"6=#;<<
##%%%  &&6!+'-'8)/)?&,&6	     #"#z'???~~clSXXZZ&?@@88::=M..t4444) = = =133<=,,D		9,,,#z'???~~clSXXZZ&?@@88::=M..t4444) = = =133<= 372J2P2P2R2R 	! 	!.J!/3}/J/J:/V/V,W'#3/ *--j9999( ! ! ! ! ,,D		9,,, &&&88::y !3Z5LMN N7799N~  	)ixi( + 	 	I\),F 22(0#!!'!7!M<M	 3     #FN(,F%(3 } ""66.    s    B: :
CC#=H! !
H/.H/J( (
J65J62M 
MM:Q 
Q3Q..Q3/T
 

T(T##T(
;V
VVr   c                   t           j        t           j        t           j        t           j        fD ]'}||v r!||         dvrt          |j         d          (|                    t           j                  }||                    t           j                  }|dk    r| j        j	        t          d          |                    t           j                  dk    r|dk    rt          d          d S d S )N)r   r   z setting must be 0 or 1r   z@H3_DATAGRAM requires max_datagram_frame_size transport parameterz(ENABLE_WEBTRANSPORT requires H3_DATAGRAM)
rg   rn   rq   ro   rp   r   namer=  r  _remote_max_datagram_frame_size)r   r   r   h3_datagrams       rQ   r|  zH3Connection._validate_settings`  s    +''	
 	N 	NG (""x'8'F'F#w|$L$L$LMMM
 ll7#677",,w'BCCK!
 J RR   <<34499kQ>N>N JKKK :9>N>NrP   )F)r  r   r  r   r   r   )r   r   r%  r   r   r   )r-  r   r   r.  )r   r   r   r   )r   r   r   r   r   r.  )rD  r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   rL  r   r   r   )r   r   r   r   rL  r   r   r   )r   re  r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   )rA  r   r   r   )r   r   )r   r   r   r   r   r.  )
r   r   r   r   rA  r   r  r   r   r.  r  )r   r   r   r   r   r   r   r   )r   r   r   r.  )r-  r   r   r.  )rA  r   r   r   r  r   r   r.  )r   r   r   r   ) r7   r8   r9   r   r   r,  r7  r9  r3  r4  rG  rK  rY  rd  propertyrg  ri  r(  rp  rI  rU  rV  rw  r  r  r$  r+  r2  r1  r  r  r|  rO   rP   rQ   r  r  i  s        "  "  "  "  " J :?    0   2
 
 
 
K K K K*K K K K(H H H H   <"
 "
 "
 "
J DI7+ 7+ 7+ 7+ 7+r ' ' ' X' # # # X#	 	 	 	 	   .      A A A A   ' ' ' 'RO O O Ob
 
 
 
. GK    ,	L 	L 	L 	L   X X X Xtk k k kZL L L L L LrP   r  )r   r   r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   r   )
r   r   r   r/   r   r/   r   r   r   r   )r   r   r   r   )r   r   r   r   )X
__future__r   loggingenumr   r   _compatr   _hazmatr   r	   r
   r   r   r   r   r   r   quic.connectionr   r   quic.eventsr   r   r   r   r   quic.loggerr   eventsr   r   r   r   r   r   r    r!   r"   r#   rC  r>  
exceptionsr$   	getLoggerloggerH3_ALPNr   	frozensetr   r   r   r   r   r0   __annotations__r   r   range_ir5   rS   rb   rg   rt   	Exceptionr|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  rO   rP   rQ   <module>r     s   " " " " " " "          ' ' ' ' ' '
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 G F F F F F F F              * ) ) ) ) )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
           / . . . . .		7	#	#&-  %9]33 %Im44 #)C   %9%@AA  y!RSS %.Y[[  0 0 0 0 3
%B--  BN2' ' ' ' ' ' ' '0
 
 
 
 
 
 
 
    4       g   (       + + + + +I + + +6 6 6 6 6} 6 6 66 6 6 6 6m 6 6 66 6 6 6 6m 6 6 65 5 5 5 5= 5 5 5* * * * * * * */ / / / /m / / /, , , , ,= , , ,/ / / / /= / / /- - - - -M - - -4 4 4 4 4- 4 4 4            $ $(	:" :" :" :" :"z      O O O O"   " " " " " " " "6NL NL NL NL NL NL NL NL NL NLrP   