o
    .jZ                     @  s  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,dZ-dgZ.dZ/e0dZ1e0dZ2e0dZ3e0dZ4e0dZ5e0 Z6de7d< e8dZ9e:ddD ]Z;d
e9e;< q[;G dd deZ<G dd deZ=G dd  d eZ>G d!d" d"eZ?G d#d$ d$eZ@G d%d& d&eAZBG d'd( d(eBZCG d)d* d*eBZDG d+d, d,eBZEG d-d. d.eBZFG d/d0 d0eBZGG d1d2 d2eBZHG d3d4 d4eBZIG d5d6 d6eBZJG d7d8 d8eBZKG d9d: d:eBZLdad@dAZMdbdDdEZNdcdGdHZOdddIdJZP	dedfdQdRZQdgdTdUZRdgdVdWZSdhdYdZZTdgd[d\ZUG d]d^ d^ZVG d_d` d`ZWdS )i    )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                   @  s`   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   r0   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 rM   rM   F/home/thesage/.local/lib/python3.10/site-packages/qh3/h3/connection.pyr3   D   s,    r3   c                   @  s4   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(            r1   N)r5   r6   r7   DATAHEADERSPRIORITYCANCEL_PUSHSETTINGSPUSH_PROMISEGOAWAYMAX_PUSH_IDDUPLICATE_PUSHWEBTRANSPORT_STREAMrM   rM   rM   rN   rO   \   s    rO   c                   @  s   e Zd ZdZdZdZdS )HeadersStater   r   r   N)r5   r6   r7   INITIALAFTER_HEADERSAFTER_TRAILERSrM   rM   rM   rN   r]   i   s    r]   c                   @  s,   e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
Settingr      rP      r4   iw iB7`+!   N)r5   r6   r7   QPACK_MAX_TABLE_CAPACITYMAX_FIELD_SECTION_SIZEQPACK_BLOCKED_STREAMSENABLE_CONNECT_PROTOCOLH3_DATAGRAMH3_DATAGRAM_DRAFT05ENABLE_WEBTRANSPORTDUMMYrM   rM   rM   rN   ra   o   s    ra   c                   @  s    e Zd ZdZdZdZdZdZdS )
StreamTyper   r   r   r&   T   N)r5   r6   r7   CONTROLPUSHQPACK_ENCODERQPACK_DECODERWEBTRANSPORTrM   rM   rM   rN   rm      s    rm   c                   @  s"   e Zd ZdZejZd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                 C  s
   || _ d S N)rv   )selfrv   rM   rM   rN   __init__   s   
zProtocolError.__init__N)ru   )rv   rw   )r5   r6   r7   __doc__r3   r:   
error_coderz   rM   rM   rM   rN   rt      s    rt   c                   @     e Zd ZejZdS )QpackDecompressionFailedN)r5   r6   r7   r3   rJ   r|   rM   rM   rM   rN   r~          
r~   c                   @  r}   )QpackDecoderStreamErrorN)r5   r6   r7   r3   rL   r|   rM   rM   rM   rN   r      r   r   c                   @  r}   )QpackEncoderStreamErrorN)r5   r6   r7   r3   rK   r|   rM   rM   rM   rN   r      r   r   c                   @  r}   )ClosedCriticalStreamN)r5   r6   r7   r3   r=   r|   rM   rM   rM   rN   r      r   r   c                   @  r}   )
FrameErrorN)r5   r6   r7   r3   r?   r|   rM   rM   rM   rN   r      r   r   c                   @  r}   )FrameUnexpectedN)r5   r6   r7   r3   r>   r|   rM   rM   rM   rN   r      r   r   c                   @  r}   )MessageErrorN)r5   r6   r7   r3   rG   r|   rM   rM   rM   rN   r      r   r   c                   @  r}   )MissingSettingsErrorN)r5   r6   r7   r3   rC   r|   rM   rM   rM   rN   r      r   r   c                   @  r}   )SettingsErrorN)r5   r6   r7   r3   rB   r|   rM   rM   rM   rN   r      r   r   c                   @  r}   )StreamCreationErrorN)r5   r6   r7   r3   r<   r|   rM   rM   rM   rN   r      r   r   
frame_typeint
frame_databytesreturnc                 C  s>   t |}t|dt  d}||  || || |jS )Nr   capacity)lenr   r   push_uint_var
push_bytesdata)r   r   frame_lengthbufrM   rM   rN   encode_frame   s   


r   settingsdict[int, int]c                 C  s6   t dd}|  D ]\}}|| || q	|jS )Ni   r   )r   itemsr   r   )r   r   settingvaluerM   rM   rN   encode_settings   s
   

r   r   c                 C  s&   t | d}| }| std|S )Nr   z*MAX_PUSH_ID frame has extra trailing bytes)r   pull_uint_vareofr   )r   r   max_push_idrM   rM   rN   parse_max_push_id   s
   
r   c                 C  sr   t | d}i }| s5| }| }|tv r td|dd||v r-td|dd|||< | rt|S )Nr   zSetting identifier 0xxz is reserved is included twice)r   r   r   RESERVED_SETTINGSr   dict)r   r   r   r   r   rM   rM   rN   parse_settings   s   
r   headersr   allowed_pseudo_headersrequired_pseudo_headersextract_headerbytes | Nonec                 C  s:  d}d }d }d }t  }d }	t}
| D ]e\}}|D ]}|
| r%td|dq|d ur0|	d u r0|}	|rt|d dkrt|rBtd|d||vrNtd|d||v rZtd|d	|| |d
krf|}q|dkrm|}q|dkrs|}qd}q||s||}tdt| d|dv r|std|st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missingrM   rM   rN   validate_headers   sR   



r   Nonec                 C     t | ttd d S N)r   r   )r   _PUSH_PROMISE_PSEUDOr   rM   rM   rN   validate_push_promise_headers%  
   
r   c                 C  s   t | ttd d S r   )r   _REQUEST_ALLOWED_PSEUDO_REQUEST_REQUIRED_PSEUDOr   rM   rM   rN   validate_request_headers-  r   r   
int | Nonec                 C  sF   t | ttdd}|d u rd S zt|W S  ty"   td|d w )Nr)   )r   r   r   zInvalid :status value )r   _RESPONSE_ALLOWED_PSEUDO_RESPONSE_REQUIRED_PSEUDOr   
ValueErrorr   )r   status_coderM   rM   rN   validate_response_headers5  s   
r   c                 C  r   r   )r   r/   r   rM   rM   rN   validate_trailersF  r   r   c                   @  s*   e Zd ZdddZddd	Zdd
dZdS )H3Stream	stream_idr   r   r   c                 C  s^   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   r]   r^   headers_recv_stateheaders_send_statepush_id
session_idr   stream_typereceiving_endedsending_endedry   r   rM   rM   rN   rz   O  s   
zH3Stream.__init__boolc                 C  s   | j o	| jo	| j S rx   )r   r   r   ry   rM   rM   rN   is_ended_  s   zH3Stream.is_endedc                 C  s   | j rtdd| _ d S )Nzstream was already endedT)r   r   r   rM   rM   rN   finish_sendingb  s   
zH3Stream.finish_sendingN)r   r   r   r   )r   r   r   r   )r5   r6   r7   rz   r   r   rM   rM   rM   rN   r   N  s    

r   c                   @  s6  e Zd ZdZd[d\d	d
Z	d[d]ddZd^ddZd_ddZd`ddZd`ddZ	dad d!Z
dbd$d%Zdcd'd(Z	d[ddd)d*Zeded,d-Zeded.d/Zdfdgd4d5Zdhd8d9Zdid:d;Zdjd=d>Zdkd@dAZdldCdDZdmdFdGZdndIdJZdodKdLZ	0dfdpdMdNZdqdOdPZdrdRdSZdsdTdUZdsdVdWZdtdYdZZd0S )uH3Connectionzu
    A low-level HTTP/3 connection object.

    :param quic: A :class:`~qh3.connection.QuicConnection` instance.
    Fquicr   enable_webtransportr   r   r   c                 C  s   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   rc   )_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)ry   r   r   rM   rM   rN   rz   p  s6   
zH3Connection.__init__r   r   is_unidirectionalc                 C  s`   |r|  tj}| j|t| |S | j }| j|tjd | j|ttj	t|  |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_streamrm   rs   r   send_stream_datar   get_next_available_stream_id_log_stream_typerO   r\   )ry   r   r  r   rM   rM   rN   create_webtransport_stream  s   	
z'H3Connection.create_webtransport_streameventr   list[H3Event]c              
   C  s   | j sZz6t|tr| |W S t|tr| |jW S t|tr)| |j	|j
W S t|tr7| |j	|j
W S W g S  tyY } zd| _ | jj|j
|jd W Y d}~g S d}~ww g S )zx
        Handle a QUIC event and return a list of HTTP events.

        :param event: The QUIC event to handle.
        T)r|   rv   N)r   
isinstancer   _receive_stream_datar   _receive_datagramr   r   _receive_stream_resetr   r|   r   _receive_stop_sendingrt   r   closerv   )ry   r  excrM   rM   rN   handle_event  s*   



zH3Connection.handle_eventr   c                 C  s    || 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   rM   rM   rN   _is_critical_stream  s   z H3Connection._is_critical_streamr|   c                 C  st   |  |rtd| d| j|}|d u rt||dgS d|_| r,| j|d  | j|d  t||dgS )NCritical stream z reset by peerr   r|   T)	r  r   r   getH3StreamResetr   r   popr  ry   r   r|   streamrM   rM   rN   r    s   
z"H3Connection._receive_stream_resetc                 C  sf   |  |rtd| d| j|}|d ur%d|_| r%| j|d  | j|d  t||dgS )Nr  z stop-sending by peerTr  )	r  r   r   r  r   r   r  r  H3StopSendingr  rM   rM   rN   r    s   

z"H3Connection._receive_stop_sendingflow_idr   r   c                 C  s   | j t||  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   )ry   r  r   rM   rM   rN   send_datagram  s   zH3Connection.send_datagramr   r   c              
   C  s   | j rJ d| jdu s| j| jkrt| j}|  jd7  _| j|ttjt	|| 
||  | jtj|d}| 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   rO   rX   r   _encode_headersr  rm   rp   )ry   r   r   r   push_stream_idrM   rM   rN   send_push_promise  s   		zH3Connection.send_push_promise
end_streamc                 C  s|   |  |}|jtjkrtd|r|  | | | jdur0| jjdd| jj	t
||dd | 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   r]   r_   r   r   _maybe_cleanup_streamr   	log_eventencode_http3_data_framer   r   r  r   rO   rS   )ry   r   r   r%  r  rM   rM   rN   	send_data$  s"   


zH3Connection.send_datac           	      C  s   |  |}|jtjkrtd|r|  | ||}| jdur2| jjdd| jj	t
|||dd |jtjkrcd}| js\|s\|D ]\}}|dkrTt|d	k rSd
} n	qA|ds[ nqA|sbt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 stateNr'  r(  r*  r   r   r+  Fr)      T   :)r-  r   r]   r`   r   r   r"  r   r/  encode_http3_headers_framer   r^   r   r   
startswithr_   r   r  r   rO   rT   r.  )	ry   r   r   r%  r  r   is_informational_headerskvrM   rM   rN   send_headersH  sD   


	

zH3Connection.send_headersdict[int, int] | Nonec                 C     | j S )z>
        Return the received SETTINGS frame, or None.
        )r  r   rM   rM   rN   received_settings     zH3Connection.received_settingsc                 C  r=  )z:
        Return the sent SETTINGS frame, or None.
        )r  r   rM   rM   rN   sent_settings  r?  zH3Connection.sent_settingsNr   r   r   c                 C  s4   | j jdd}| j|||d | j |t| |S )zD
        Create an unidirectional stream of the given type.
        T)r  r   r   r   )r   r	  r
  r  r   )ry   r   r   r   rM   rM   rN   r    s   zH3Connection._create_uni_streamr   r   c              
   C  s   z4|du r| j | j\}}| j | `n|st | j||\}}|  jt|7  _| j| j	| W |S  tyD } zt
 |d}~ww )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~   )ry   r   r   decoderr   r  rM   rM   rN   _decode_headers  s   zH3Connection._decode_headersc              
   C  s^   z| j ||\}}W n ty } zt |d}~ww |  jt|7  _| 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   )ry   r   r   encoderr   r  rM   rM   rN   r"    s   zH3Connection._encode_headersr   c                 C  s*   | j |}|d u rt|}|| j |< |S rx   )r   r  r   )ry   r   r  rM   rM   rN   r-    s
   
z"H3Connection._get_or_create_streamr  c                 C  s0   |  r| j|jd  | j|jd  d S d S rx   )r   r   r  r   r  )ry   r  rM   rM   rN   r.    s   z"H3Connection._maybe_cleanup_streamr   c              
   C  s:   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   )
ra   re   r   rf   rg   r   ri   rl   r   rk   )ry   r   rM   rM   rN   _get_local_settings  s   
z H3Connection._get_local_settingsr   c                 C  s  |t jkr
| js
t|t jkrG| jrtdt|}| | || _| jj	|
tjd|
tjd|
tjdd}| j| j| d| _g S |t jkrct|d}| }| s]tdt|dgS |t jkrv| jrotdt|| _g S |t jt jt jt jfv rt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)rO   rW   r   r   r   r   _validate_settingsr  r   apply_settingsr  ra   re   rg   r   r  r   rY   r   r   r   r   r   rZ   r   r   r   rS   rT   rX   r[   )ry   r   r   r   rG  r   	goaway_idrM   rM   rN   _handle_control_frame  sF   





z"H3Connection._handle_control_framestream_endedc           
   	   C  sX  |t jkr |jtjurtd|s|rt||j||jdgS g S g }|t j	kr|jtj
u r1td| |j|}d}|jtju rM| jrHt|}n	t| nt| | jdurp| jjdd| jj|du re|jnt|||jdd |jtju r|du s|d	ks|rtj|_n	tj
|_|jrd
}|jtju r|dur|d	k r|t||jd |S |t||j|j|d |S |t jkr
|jdu r
| jstdt|d}| }	| |j|| d }t| | jdur| jjdd| jjt|||	|jdd |t ||	|jd |S |t j!t j"t j#t jt j$t j%t j&fv r*t|jdu r'dd|S )zF
        Handle a frame received on a request or push stream.
        r&  )r   r   rP  r   r2  Nr'  frame_parsedr3  r+  r4  T)r   r   )r   r   r   rP  z"Clients must not send PUSH_PROMISEr   )r*  r   r   r   )r   r   r   z$Invalid frame type on request streamz!Invalid frame type on push stream)'rO   rS   r   r]   r_   r   r   r   r   rT   r`   rE  r^   r   r   r   r   r   r/  r6  r   r   r   appendr   r   rX   r   r   tellr   encode_http3_push_promise_framer    rU   rV   rW   rY   rZ   r[   )
ry   r   r   r  rP  http_eventsr   r   	frame_bufr   rM   rM   rN   _handle_request_or_push_frame  s   





=6

	z*H3Connection._handle_request_or_push_framec                 C  s   |  tj| _|  | _| j| jtt	j
t| j | jr2| jd ur2| j| jtt	jt| j |  tj| _|  tj| _d S rx   )r  rm   ro   r   rH  r  r   r  r   rO   rW   r   r   r   rZ   r   rq   r   rr   r   r   rM   rM   rN   r    s"   

zH3Connection._init_connectionc                 C  sV   | j d ur)dddddd|d}||d}|d ur||d	< | j jd
d|d d S d S )Ncontrolpushqpack_encoderqpack_decoderwebtransport)r   r   r   r&   rn   unknown)newr   associated_push_idr'  stream_type_setr+  )r   r  r/  )ry   r   r   r   	type_namer   rM   rM   rN   r
    s$   


zH3Connection._log_stream_typec                 C  sH   t |d}z| }W n ty   tdw t|| d |dgS )z$
        Handle a datagram.
        r   zCould not parse flow IDN)r   r  )r   r   r   rt   r   rS  )ry   r   r   r  rM   rM   rN   r    s   
zH3Connection._receive_datagramr   c                 C  sL   |j }| |}t|r| ||j|j}n	| ||j|j}| | |S rx   )r   r-  r   _receive_stream_data_unir   r%  _receive_request_or_push_datar.  )ry   r  r   r  resultrM   rM   rN   r    s   


z!H3Connection._receive_stream_datac                 C  s  g }|j }|r
d|_|jr|| |S |j}|jtjkrK|jdurK|r=|| |	t
t||j||d |  |S |	t
||j||d |S |jtjkr|jdur|s}t|}||jk r||rgtd|	t||j|dd | j|8  _|S n1|| t|}||jk r|rtd|	tt||j|dd | j|8  _|  |S d}|r|s|s|jtjurtd|j|ddgS g S |r|| tt|d}	d	}
|	j}|	j}|	j}|	j}| j}| s|jdu rZz
| |_| |_W n
 ty   Y nw | }
|jtjkr=|j|_d|_t||
d }|  | j|tjd
 |s/|r;|	t
||j||d |S | j durZ|jtjkrZ| j j!dd| j j"|j|dd |j}t#||	j$|
 }|jtjkrr||k rrnV||}|j}| }
|| |_|jsd|_d|_z||||||jo| d W n t%y   d|_t||_&|| j'|< Y nw |jtj(u r|jrt|}
n| r|
r|d|
= |r|s|js|jtj)u r|rt*|d dds|	td|j|dd |S )zC
        Handle data received on a request or push stream.
        TN)r   r   r   rP  z"DATA frame truncated by stream endF)r   r   r   rP      r   r   r  r'  rQ  r)  r+  r   r   r  rP  rP  )+r   r   r   extendr   r   rO   r\   r   rR  r!   r   clearrS   r   r   r   r   r   r   r]   r^   r   rS  r   r   
pull_bytesrW  r   r
  rm   rs   r   r/  r0  minr   r   r   r  r`   r_   getattr)ry   r  r   rP  rU  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   rM   rM   rN   rc    sP  







	


	X

	z*H3Connection._receive_request_or_push_datac              
   C  sv  g }|j | |rd|_tt|j d}d}t }|jtjtj	tj
fv s*| s|jd u rz| |_W n
 ty@   Y nw | }|jtj	krY| jd urTtd|j| _n'|jtjkrm| jd urhtd|j| _n|jtjkr| jd ur|td|j| _|jtjkr| j|j|jd |jtj	kr|rtdz| }| }	||	}
W n
 ty   Y nEw | }|| ||
 n&|jtjkr|jd u rz| |_W n
 ty   Y nw | }| j|j|j|jd	 |j d |= | |d
|S |jtj
krD|jd u r z| |_W n
 ty   Y nw | }t|j |d  }
|j   |
s4|rB|t|
|j|j|jd |S |jtjkr}||j |  }| }z| j!"| W n t#yr } zt$ |d }~ww |  j%t&|7  _%nm|jtjkr||j |  }| }z| j'(| W n t)y } zt* |d }~ww | j+, D ]$\}}z| j'-|\}}||f|_.|/| W q t0y   Y qw |  j1t&|7  _1n
|2|j  | }|jtjtj	tj
fv s*| r*|r|j d |= |D ]4}| j3| }|| j4t5j6d ||jo|j  d d|_7d |_8| j+|= |j r7|| |d
|j q|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 allowedrA  re  )r   r   rP  r   rf  F)9r   rh  r   r   r   r   r   rm   rp   ro   rs   r   r   r   rS  r   r   r   rr   r   rq   r   r
  r   rj  rO  r   rc  r   ri  rR  r!   r   r   feed_decoderr	   r   r   r   r   feed_encoderr   r   r  r   resume_headerrB  r   r   r   seekr   rW  rO   rT   r   r   )ry   r  r   rP  rU  r   rq  unblocked_streamsr   r   r   r  
blocked_idblocked_streamstream_datar   r   rM   rM   rN   rb    s(  








z%H3Connection._receive_stream_data_unir   c                 C  s   t jt jt jt jfD ]}||v r|| dvrt|j dq
|t j}|d u r/|t j}|dkr=| jj	d u r=td|t jdkrM|dkrOt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)
ra   rh   rk   ri   rj   r   namer  r   _remote_max_datagram_frame_size)ry   r   r   h3_datagramrM   rM   rN   rL  `  s$   zH3Connection._validate_settings)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  )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<  rx   )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   r  r   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   rP  r   r   r  )r   r   r   r   ) r5   r6   r7   r{   rz   r  r  r  r  r  r!  r$  r1  r;  propertyr>  r@  r  rE  r"  r-  r.  rH  rO  rW  r  r
  r  r  rc  rb  rL  rM   rM   rM   rN   r   i  sJ    %





	
%9






) 



 
[ .r   )r   r   r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   rx   )
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"   r  r  
exceptionsr#   	getLoggerloggerH3_ALPNr   	frozensetr   r   r   r   r   r/   __annotations__r   r   range_ir3   rO   r]   ra   rm   	Exceptionrt   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rM   rM   rM   rN   <module>   sn    ,,



	


=


