Ë
    Û�ði1W  ã                   ó|   — d Z ddl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 dadadadadad„ Z G d	„ d
«      Zd
gZy)zc
HTTP/2 server connection implementation.

Uses the hyper-h2 library for HTTP/2 protocol handling.
é    )ÚBytesIOé   )Ú
HTTP2ErrorÚHTTP2ProtocolErrorÚHTTP2ConnectionErrorÚHTTP2NotAvailableÚHTTP2ErrorCode)ÚHTTP2Stream)ÚHTTP2RequestNc                  ó~   — t         �y	 ddlma  ddlma ddlma ddl	m
a ddlma y# t        $ r t!        «       ‚w xY w)z$Lazily import h2 library components.Nr   )Ú_h2Úh2.connectionÚ
connectionÚ	h2.configÚconfigÚ
_h2_configÚ	h2.eventsÚeventsÚ
_h2_eventsÚh2.exceptionsÚ
exceptionsÚ_h2_exceptionsÚh2.settingsÚsettingsÚ_h2_settingsÚImportErrorr   © ó    úT/var/www/html/Extract/venv/lib/python3.12/site-packages/gunicorn/http2/connection.pyÚ
_import_h2r       s8   € ô €Øð"Ý#Ý&Ý&Ý.Þ*øÜò "ÜÓ!Ð!ð"ús   ‰( ¨<c                   ó´   — e Zd ZdZdZd„ Zd„ Zdd„Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Zdd„Zd„ Zdd„Zdd„Zdd„Zd„ Zed„ «       Zd„ Zd„ Zy)ÚHTTP2ServerConnectionzÑHTTP/2 server-side connection handler.

    Manages the HTTP/2 connection state and multiplexed streams.
    This class wraps the h2 library and provides a higher-level
    interface for gunicorn workers.
    i   c                 ó„  — t        «        || _        || _        || _        i | _        g | _        |j                  | _        |j                  | _	        |j                  | _        |j                  | _        t        j                  dd¬«      }t         j#                  |¬«      | _        t'        «       | _        d| _        d| _        y)a.  Initialize an HTTP/2 server connection.

        Args:
            cfg: Gunicorn configuration object
            sock: SSL socket with completed handshake
            client_addr: Client address tuple (host, port)

        Raises:
            HTTP2NotAvailable: If h2 library is not installed
        Fzutf-8)Úclient_sideÚheader_encoding)r   N)r    ÚcfgÚsockÚclient_addrÚstreamsÚ_pending_requestsÚhttp2_initial_window_sizeÚinitial_window_sizeÚhttp2_max_concurrent_streamsÚmax_concurrent_streamsÚhttp2_max_frame_sizeÚmax_frame_sizeÚhttp2_max_header_list_sizeÚmax_header_list_sizer   ÚH2Configurationr   ÚH2ConnectionÚh2_connr   Ú_read_bufferÚ_closedÚ_initialized)Úselfr&   r'   r(   r   s        r   Ú__init__zHTTP2ServerConnection.__init__:   s½   € ô 	ŒàˆŒØˆŒ	Ø&ˆÔð ˆŒð "$ˆÔð $'×#@Ñ#@ˆÔ Ø&)×&FÑ&FˆÔ#Ø!×6Ñ6ˆÔØ$'×$BÑ$BˆÔ!ô ×+Ñ+ØØ#ð ,ó 
ˆô ×'Ñ'¨vÐ'Ó6ˆŒô $›IˆÔð ˆŒØ!ˆÕr   c           
      óÖ  — | j                   ry| j                  j                  t        j                  j
                  | j                  t        j                  j                  | j                  t        j                  j                  | j                  t        j                  j                  | j                  i«       | j                  j                  «        | j                  «        d| _         y)z”Send initial HTTP/2 settings to client.

        Should be called after the SSL handshake completes and
        before processing any data.
        NT)r8   r5   Úupdate_settingsr   ÚSettingCodesÚMAX_CONCURRENT_STREAMSr.   ÚINITIAL_WINDOW_SIZEr,   ÚMAX_FRAME_SIZEr0   ÚMAX_HEADER_LIST_SIZEr2   Úinitiate_connectionÚ_send_pending_data©r9   s    r   rB   z)HTTP2ServerConnection.initiate_connectione   s«   € ð ×ÒØð 	�‰×$Ñ$Ü×%Ñ%×<Ñ<¸d×>YÑ>YÜ×%Ñ%×9Ñ9¸4×;SÑ;SÜ×%Ñ%×4Ñ4°d×6IÑ6IÜ×%Ñ%×:Ñ:¸D×<UÑ<Uð	&
ô 	ð 	�‰×(Ñ(Ô*Ø×ÑÔ!Ø ˆÕr   Nc                 óœ  — |€&	 | j                   j                  | j                  «      }|s	d| _        g S 	 | j                  j                  |«      }g }|D ]'  }| j1                  |«      }|€Œ|j3                  |«       Œ) | j5                  «        |S # t        t        f$ r}t        d|› �«      ‚d}~ww xY w# t        j                  $ r9}| j                  t        j                  ¬«       t        t        |«      «      ‚d}~wt        j                   $ r9}| j                  t        j"                  ¬«       t        t        |«      «      ‚d}~wt        j$                  $ r[}t'        |dd«      }|�| j                  |¬«       n | j                  t        j(                  ¬«       t        t        |«      «      ‚d}~wt        j*                  $ r9}| j                  t        j,                  ¬«       t        t        |«      «      ‚d}~wt        j.                  $ r9}| j                  t        j(                  ¬«       t        t        |«      «      ‚d}~ww xY w)aA  Process received data and return completed requests.

        Args:
            data: Optional bytes to process. If None, reads from socket.

        Returns:
            list: List of HTTP2Request objects for completed requests

        Raises:
            HTTP2ConnectionError: On protocol or connection errors
        NzSocket read error: T©Ú
error_coderG   )r'   ÚrecvÚREAD_BUFFER_SIZEÚOSErrorÚIOErrorr   r7   r5   Úreceive_datar   ÚFlowControlErrorÚcloser	   ÚFLOW_CONTROL_ERRORr   ÚstrÚFrameTooLargeErrorÚFRAME_SIZE_ERRORÚInvalidSettingsValueErrorÚgetattrÚPROTOCOL_ERRORÚTooManyStreamsErrorÚREFUSED_STREAMÚProtocolErrorÚ_handle_eventÚappendrC   )r9   ÚdataÚer   rG   Úcompleted_requestsÚeventÚrequests           r   rL   z"HTTP2ServerConnection.receive_dataz   só  € ð ˆ<ðFØ—y‘y—~‘~ d×&;Ñ&;Ó<�ñ àˆDŒLØˆIð	-Ø—\‘\×.Ñ.¨tÓ4ˆFð:  ÐØò 	3ˆEØ×(Ñ(¨Ó/ˆGØÑ"Ø"×)Ñ)¨'Õ2ð	3ð 	×ÑÔ!à!Ð!øôc œWÐ%ò FÜ*Ð-@ÀÀÐ+DÓEÐEûðFûô ×.Ñ.ò 	-à�J‰J¤.×"CÑ"CˆJÔDÜ$¤S¨£VÓ,Ð,ûÜ×0Ñ0ò 	-à�J‰J¤.×"AÑ"AˆJÔBÜ$¤S¨£VÓ,Ð,ûÜ×7Ñ7ò 		-ô !  L°$Ó7ˆJØÐ%Ø—
‘
 j�
Õ1à—
‘
¤n×&CÑ&C�
ÔDÜ$¤S¨£VÓ,Ð,ûÜ×1Ñ1ò 	-à�J‰J¤.×"?Ñ"?ˆJÔ@Ü$¤S¨£VÓ,Ð,ûÜ×+Ñ+ò 	-à�J‰J¤.×"?Ñ"?ˆJÔ@Ü$¤S¨£VÓ,Ð,ûð	-ús_   „%B µB5 ÂB2ÂB-Â-B2Â5IÃ4C<Ã<IÄ4EÅIÅAF2Æ2IÇ4G<Ç<IÈ4IÉIc                 óÔ  — t        |t        j                  «      r| j                  |«      S t        |t        j                  «      r| j                  |«      S t        |t        j                  «      r| j                  |«      S t        |t        j                  «      r| j                  |«       yt        |t        j                  «      r	 yt        |t        j                  «      r| j                  |«       yt        |t        j                  «      r	 yt        |t        j                  «      r| j                  |«       yt        |t        j                   «      r| j#                  |«      S y)z¨Handle a single h2 event.

        Args:
            event: h2 event object

        Returns:
            HTTP2Request if a request is complete, None otherwise
        N)Ú
isinstancer   ÚRequestReceivedÚ_handle_request_receivedÚDataReceivedÚ_handle_data_receivedÚStreamEndedÚ_handle_stream_endedÚStreamResetÚ_handle_stream_resetÚWindowUpdatedÚPriorityUpdatedÚ_handle_priority_updatedÚSettingsAcknowledgedÚConnectionTerminatedÚ_handle_connection_terminatedÚTrailersReceivedÚ_handle_trailers_received©r9   r^   s     r   rY   z#HTTP2ServerConnection._handle_event¼   s.  € ô �eœZ×7Ñ7Ô8Ø×0Ñ0°Ó7Ð7ä˜œz×6Ñ6Ô7Ø×-Ñ-¨eÓ4Ð4ä˜œz×5Ñ5Ô6Ø×,Ñ,¨UÓ3Ð3ä˜œz×5Ñ5Ô6Ø×%Ñ% eÔ,ð" ô ˜œz×7Ñ7Ô8Øð ô ˜œz×9Ñ9Ô:Ø×)Ñ)¨%Ô0ð ô ˜œz×>Ñ>Ô?Øð ô ˜œz×>Ñ>Ô?Ø×.Ñ.¨uÔ5ð
 ô ˜œz×:Ñ:Ô;Ø×1Ñ1°%Ó8Ð8àr   c                 ó�   — |j                   }|j                  }t        || «      }|| j                  |<   |j	                  |d¬«       y)z{Handle RequestReceived event (HEADERS frame).

        Args:
            event: RequestReceived event with headers
        F©Ú
end_streamN)Ú	stream_idÚheadersr
   r)   Úreceive_headers)r9   r^   rv   rw   Ústreams        r   rc   z.HTTP2ServerConnection._handle_request_receivedâ   sG   € ð —O‘Oˆ	Ø—-‘-ˆô ˜Y¨Ó-ˆØ"(ˆ�‰�YÑð 	×Ñ˜w°5ÐÕ9r   c                 óì  — |j                   }|j                  }| j                  j                  |«      }|€y|j	                  |d¬«       t        |«      dkD  r^	 | j                  j                  t        |«      |¬«       | j                  j                  t        |«      d¬«       | j                  «        yy# t        t        j                  f$ r# | j                  t        j                  ¬«       Y yw xY w)z¶Handle DataReceived event.

        Args:
            event: DataReceived event with body data

        Returns:
            None (request completion handled by StreamEnded)
        NFrt   r   )rv   rF   )rv   r[   r)   ÚgetrL   Úlenr5   Úincrement_flow_control_windowrC   Ú
ValueErrorr   rM   rN   r	   rO   )r9   r^   rv   r[   ry   s        r   re   z+HTTP2ServerConnection._handle_data_receivedó   sÖ   € ð —O‘Oˆ	Ø�z‰zˆà—‘×!Ñ! )Ó,ˆØˆ>àà×Ñ˜D¨UÐÔ3ô ˆt‹9�qŠ=ð	Ià—‘×:Ñ:¼3¸t»9ÐPYÐ:ÔZà—‘×:Ñ:¼3¸t»9ÐPTÐ:ÔUà×'Ñ'Ô)ñ
 øô	 ¤× ?Ñ ?Ð@ò Ià—
‘
¤n×&GÑ&G�
ÕHàð	Iús   ÁAB7 Â79C3Ã2C3c                 ó¦   — |j                   }| j                  j                  |«      }|€yd|_        t	        || j
                  | j                  «      S )z›Handle StreamEnded event.

        Args:
            event: StreamEnded event

        Returns:
            HTTP2Request for the completed request
        NT)rv   r)   r{   Úrequest_completer   r&   r(   ©r9   r^   rv   ry   s       r   rg   z*HTTP2ServerConnection._handle_stream_ended  sN   € ð —O‘Oˆ	Ø—‘×!Ñ! )Ó,ˆàˆ>Øð #'ˆÔô ˜F D§H¡H¨d×.>Ñ.>Ó?Ð?r   c                 óŽ   — |j                   }| j                  j                  |«      }|�|j                  |j                  «       yy)ziHandle StreamReset event (RST_STREAM frame).

        Args:
            event: StreamReset event
        N)rv   r)   r{   ÚresetrG   r�   s       r   ri   z*HTTP2ServerConnection._handle_stream_reset*  s>   € ð —O‘Oˆ	Ø—‘×!Ñ! )Ó,ˆàÐØ�L‰L˜×)Ñ)Õ*ð r   c                 ó   — d| _         y)zwHandle ConnectionTerminated event (GOAWAY frame).

        Args:
            event: ConnectionTerminated event
        TN©r7   rr   s     r   ro   z3HTTP2ServerConnection._handle_connection_terminated7  s   € ð ˆ�r   c                 óÎ   — |j                   }| j                  j                  |«      }|€y|j                  |j                  «       t        || j                  | j                  «      S )z¾Handle TrailersReceived event.

        Args:
            event: TrailersReceived event with trailer headers

        Returns:
            HTTP2Request if this completes the request
        N)rv   r)   r{   Úreceive_trailersrw   r   r&   r(   r�   s       r   rq   z/HTTP2ServerConnection._handle_trailers_received@  sV   € ð —O‘Oˆ	Ø—‘×!Ñ! )Ó,ˆàˆ>Øà×Ñ §¡Ô.ô ˜F D§H¡H¨d×.>Ñ.>Ó?Ð?r   c                 ó¸   — | j                   j                  |j                  «      }|�3|j                  |j                  |j
                  |j                  ¬«       yy)z‚Handle PriorityUpdated event (PRIORITY frame).

        Args:
            event: PriorityUpdated event with priority info
        N)ÚweightÚ
depends_onÚ	exclusive)r)   r{   rv   Úupdate_priorityr‰   rŠ   r‹   )r9   r^   ry   s      r   rl   z.HTTP2ServerConnection._handle_priority_updatedT  sQ   € ð —‘×!Ñ! %§/¡/Ó2ˆØÐØ×"Ñ"Ø—|‘|Ø ×+Ñ+ØŸ/™/ð #õ ð r   c                 ól  — |dk  s|dk\  rt        d|› �«      ‚| j                  j                  |«      }|€t        d|› d�«      ‚dt        |«      fg}|D ]/  \  }}|j	                  |j                  «       t        |«      f«       Œ1 | j                  j                  ||d¬	«       | j                  «        y)
aÆ  Send an informational response (1xx) on a stream.

        This is used for 103 Early Hints and other 1xx responses.
        Informational responses are sent before the final response
        and do not end the stream.

        Args:
            stream_id: The stream ID
            status: HTTP status code (100-199)
            headers: List of (name, value) header tuples

        Raises:
            HTTP2Error: If status is not in 1xx range
        éd   éÈ   zInvalid informational status: NzStream z
 not foundú:statusFrt   )	r   r)   r{   rP   rZ   Úlowerr5   Úsend_headersrC   )r9   rv   Ústatusrw   ry   Úresponse_headersÚnameÚvalues           r   Úsend_informationalz(HTTP2ServerConnection.send_informationalb  s¿   € ð �CŠ<˜6 Sš=ÜÐ=¸f¸XÐFÓGÐGà—‘×!Ñ! )Ó,ˆØˆ>Ü˜w y k°Ð<Ó=Ð=ð '¬¨F«Ð4Ð5ÐØ"ò 	@‰KˆD�%à×#Ñ# T§Z¡Z£\´3°u³:Ð$>Õ?ð	@ð
 	�‰×!Ñ! )Ð-=È%Ð!ÔPØ×ÑÕ!r   c                 ó,  — | j                   j                  |«      }|€ydt        |«      fg}|D ]/  \  }}|j                  |j	                  «       t        |«      f«       Œ1 |du xs t        |«      dk(  }		 | j                  j                  |||	¬«       |j                  ||	¬«       | j                  «        |r"t        |«      dkD  r| j                  ||d¬«       y# t        j                  $ r$ |j                  «        | j                  |«       Y yw xY w)a©  Send a response on a stream.

        Args:
            stream_id: The stream ID to respond on
            status: HTTP status code (int)
            headers: List of (name, value) header tuples
            body: Optional response body bytes

        Raises:
            HTTP2Error: If stream not found or in invalid state

        Returns:
            bool: True if response sent, False if stream was already closed
        NFr�   r   rt   T)r)   r{   rP   rZ   r‘   r|   r5   r’   rC   Ú	send_datar   ÚStreamClosedErrorrN   Úcleanup_stream)
r9   rv   r“   rw   Úbodyry   r”   r•   r–   ru   s
             r   Úsend_responsez#HTTP2ServerConnection.send_response‚  s  € ð —‘×!Ñ! )Ó,ˆØˆ>àð '¬¨F«Ð4Ð5ÐØ"ò 	@‰KˆD�%à×#Ñ# T§Z¡Z£\´3°u³:Ð$>Õ?ð	@ð ˜T�\Ò3¤S¨£Y°!¡^ˆ
ð	à�L‰L×%Ñ% iÐ1AÈjÐ%ÔYØ×ÑÐ 0¸ZÐÔHØ×#Ñ#Ô%ñ œ˜D›	 AšØ—‘˜y¨$¸4�Ô@ØøÜ×/Ñ/ò 	à�L‰LŒNØ×Ñ 	Ô*Ùð		ús   Á6A%C Ã4DÄDc                 ó²  — ddl }d}	 |j                  «       }|j                  | j                  |j                  «       d}	 t        |«      D ]ô  }| j                  j                  |«      }|dkD  r|} në|j                  d¬«      }|sŒ<	 | j                  j                  | j                  «      }	|	s	d| _         n¥	 | j                  j%                  |	«      }
|
D ]U  }t'        |t(        j*                  «      r|j,                  |k(  sŒ-d} n8t'        |t(        j.                  «      sŒLd| _        d} n | j1                  «        Œô n | j                  j                  |«      }|j3                  «        |S # t
        t        f$ r Y yw xY w# t        t        t        j                   f$ r Y  ŒHw xY w# t        j                   $ r Y  Œbw xY w# |j3                  «        w xY w)z‹Wait for flow control window to become positive.

        Returns:
            int: Available window size, or -1 if waiting failed
        r   Né2   éÿÿÿÿgš™™™™™¹?)ÚtimeoutT)Ú	selectorsÚDefaultSelectorÚregisterr'   Ú
EVENT_READÚ	TypeErrorr~   Úranger5   Úlocal_flow_control_windowÚselectrH   rI   rJ   rK   r   rX   r7   rL   ra   r   rh   rv   rn   rC   rN   )r9   rv   r¢   Úmax_wait_attemptsÚselÚresultÚ_Ú	availableÚreadyÚincomingr   r^   s               r   Ú_wait_for_flow_control_windowz3HTTP2ServerConnection._wait_for_flow_control_window®  sÂ  € ó 	àÐð	Ø×+Ñ+Ó-ˆCØ�L‰L˜Ÿ™ I×$8Ñ$8Ô9ð
 ˆð%	ÜÐ,Ó-ò "K�Ø ŸL™L×BÑBÀ9ÓM�	Ø˜q’=Ø&�FÙàŸ
™
¨3˜
Ó/�ÚðØ#'§9¡9§>¡>°$×2GÑ2GÓ#H˜ñ $Ø'+˜œÙðØ!%§¡×!:Ñ!:¸8Ó!D˜ð "(ò !˜Ü% e¬Z×-CÑ-CÔDØ$Ÿ™°)Ó;Ø)+ Ù %Ü'¨¬z×/NÑ/NÕOØ+/˜DœLØ%'˜FÙ!ð!ð ×/Ñ/Ô1Ø Ùð?"KðD Ÿ™×?Ñ?À	ÓJ�à�I‰IŒKàˆøôY œ:Ð&ò 	áð	ûô  $¤W¬n×.JÑ.JÐKò Úðûô *×7Ñ7ò Úðûð& �I‰I�Kúsr   ˆ6E0 ÁAG Â	%FÂ.G Â:F*Ã.G ÄG Ä#;G Å0FÆFÆF'Æ#G Æ&F'Æ'G Æ*GÆ=G Ç GÇG ÇGc                 ó¬  — | j                   j                  |«      }|€y|}	 |rÔ| j                  j                  |«      }t	        || j
                  t        |«      «      }|dk  rG| j                  «        | j                  |«      }|dk  ryt	        || j
                  t        |«      «      }|d| }||d }|xr t        |«      dk(  }	| j                  j                  |||	¬«       | j                  «        |rŒÔ|j                  ||¬«       y# t        j                  t        j                  f$ r$ |j                  «        | j                  |«       Y yw xY w)a  Send data on a stream.

        Args:
            stream_id: The stream ID
            data: Body data bytes
            end_stream: Whether this ends the stream

        Returns:
            bool: True if data sent, False if stream was already closed
        NFr   rt   T)r)   r{   r5   r¨   Úminr0   r|   rC   r±   r™   r   rš   rM   rN   r›   )
r9   rv   r[   ru   ry   Údata_to_sendr®   Ú
chunk_sizeÚchunkÚis_finals
             r   r™   zHTTP2ServerConnection.send_dataè  sH  € ð —‘×!Ñ! )Ó,ˆØˆ>Øàˆð	ÙØ ŸL™L×BÑBÀ9ÓM�	Ü  ¨D×,?Ñ,?ÄÀ\ÓARÓS�
à ’?à×+Ñ+Ô-Ø $× BÑ BÀ9Ó M�IØ  A’~Ø$Ü!$ Y°×0CÑ0CÄSÈÓEVÓ!W�Jà$ [ jÐ1�Ø+¨J¨KÐ8�Ø%Ò@¬#¨lÓ*;¸qÑ*@�à—‘×&Ñ& y°%ÀHÐ&ÔMØ×'Ñ'Ô)ò# ð& ×Ñ˜T¨jÐÔ9ØøÜ×0Ñ0´.×2QÑ2QÐRò 	à�L‰LŒNØ×Ñ 	Ô*Ùð		ús    ¢A(D ÂA,D Ã8D ÄAEÅEc                 óþ  — | j                   j                  |«      }|€y|j                  syg }|D ]Q  \  }}|j                  «       }|j	                  d«      rt        d|› d�«      ‚|j                  |t        |«      f«       ŒS 	 | j                  j                  ||d¬«       |j                  |«       | j                  «        y# t        j                  $ r$ |j                  «        | j                  |«       Y yw xY w)aë  Send trailing headers on a stream.

        Trailers are headers sent after the response body, commonly used
        for gRPC status codes, checksums, and timing information.

        Args:
            stream_id: The stream ID
            trailers: List of (name, value) trailer tuples

        Raises:
            HTTP2Error: If stream not found, headers not sent, or pseudo-headers used

        Returns:
            bool: True if trailers sent, False if stream was already closed
        Fú:zPseudo-header 'z' not allowed in trailersTrt   )r)   r{   Úresponse_headers_sentr‘   Ú
startswithr   rZ   rP   r5   r’   Úsend_trailersrC   r   rš   rN   r›   )r9   rv   Útrailersry   Útrailer_headersr•   r–   Úlnames           r   r¼   z#HTTP2ServerConnection.send_trailers  sõ   € ð  —‘×!Ñ! )Ó,ˆØˆ>àØ×+Ò+àð ˆØ#ò 	8‰KˆD�%Ø—J‘J“LˆEØ×Ñ Ô$Ü  ?°4°&Ð8QÐ!RÓSÐSØ×"Ñ" E¬3¨u«:Ð#6Õ7ð		8ð
	à�L‰L×%Ñ% i°ÈTÐ%ÔRØ× Ñ  Ô1Ø×#Ñ#Ô%ØøÜ×/Ñ/ò 	à�L‰LŒNØ×Ñ 	Ô*Ùð		ús   Â?C Ã4C<Ã;C<c                 ó¨   — |r|j                  «       nd}dt        t        |«      «      fg}|r|j                  d«       | j	                  ||||«       y)z»Send an error response on a stream.

        Args:
            stream_id: The stream ID
            status_code: HTTP status code
            message: Optional error message body
        r   zcontent-length)zcontent-typeztext/plain; charset=utf-8N)ÚencoderP   r|   rZ   r�   )r9   rv   Ústatus_codeÚmessagerœ   rw   s         r   Ú
send_errorz HTTP2ServerConnection.send_error@  sM   € ñ $+ˆw�~‰~Ô°ˆØ$¤c¬#¨d«)£nÐ5Ð6ˆÙØ�N‰NÐHÔIà×Ñ˜9 k°7¸DÕAr   c                 óº   — | j                   j                  |«      }|�|j                  |«       | j                  j	                  ||¬«       | j                  «        y)z¡Reset a stream with RST_STREAM.

        Args:
            stream_id: The stream ID to reset
            error_code: HTTP/2 error code (default: CANCEL)
        NrF   )r)   r{   rƒ   r5   Úreset_streamrC   )r9   rv   rG   ry   s       r   rÆ   z"HTTP2ServerConnection.reset_streamO  sM   € ð —‘×!Ñ! )Ó,ˆØÐØ�L‰L˜Ô$à�‰×!Ñ! )¸
Ð!ÔCØ×ÑÕ!r   c                 ó
  — | j                   ryd| _         |€1| j                  r#t        | j                  j                  «       «      nd}	 | j                  j                  |¬«       | j                  «        y# t        $ r Y yw xY w)zÊClose the connection gracefully with GOAWAY.

        Args:
            error_code: HTTP/2 error code (default: NO_ERROR)
            last_stream_id: Last processed stream ID (default: highest)
        NTr   rF   )r7   r)   ÚmaxÚkeysr5   Úclose_connectionrC   Ú	Exception)r9   rG   Úlast_stream_ids      r   rN   zHTTP2ServerConnection.close]  sr   € ð �<Š<ØàˆŒàÐ!à9=¿ºœS §¡×!2Ñ!2Ó!4Ô5È1ˆNð	Ø�L‰L×)Ñ)°ZÐ)Ô@Ø×#Ñ#Õ%øÜò 	Ùð	ús   Á	,A6 Á6	BÂBc                 óÎ   — | j                   j                  «       }|r	 | j                  j                  |«       yy# t        t
        f$ r}d| _        t        d|› �«      ‚d}~ww xY w)z,Send any pending data from h2 to the socket.TzSocket write error: N)r5   r´   r'   ÚsendallrJ   rK   r7   r   )r9   r[   r\   s      r   rC   z(HTTP2ServerConnection._send_pending_datas  sg   € à�|‰|×(Ñ(Ó*ˆÙðGØ—	‘	×!Ñ! $Õ'ð øô œWÐ%ò GØ#�”Ü*Ð-AÀ!ÀÐ+EÓFÐFûðGús   ž; »A$Á
AÁA$c                 ó   — | j                   S )zCheck if connection is closed.r…   rD   s    r   Ú	is_closedzHTTP2ServerConnection.is_closed}  s   € ð �|‰|Ðr   c                 ó<   — | j                   j                  |d«       y)zvRemove a stream after processing is complete.

        Args:
            stream_id: The stream ID to clean up
        N)r)   Úpop)r9   rv   s     r   r›   z$HTTP2ServerConnection.cleanup_stream‚  s   € ð 	�‰×Ñ˜ DÕ)r   c                 óN   — dt        | j                  «      › d| j                  › d�S )Nz<HTTP2ServerConnection streams=z closed=ú>)r|   r)   r7   rD   s    r   Ú__repr__zHTTP2ServerConnection.__repr__Š  s0   € ðÜ˜4Ÿ<™<Ó(Ð)ð *Ø—l‘l�^ 1ð&ð	
r   )N)F)é   )r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rI   r:   rB   rL   rY   rc   re   rg   ri   ro   rq   rl   r—   r�   r±   r™   r¼   rÄ   rÆ   rN   rC   ÚpropertyrÐ   r›   rÕ   r   r   r   r"   r"   /   sŸ   „ ñð Ðò)"òV!ó*@"òD$òL:ò" òD@ò*
+òò@ò(ò"ó@*òX8ót*òX*óXBó"óò,Gð ñó ðò*ó
r   r"   )rÚ   Úior   Úerrorsr   r   r   r   r	   ry   r
   r_   r   r   r   r   r   r   r    r"   Ú__all__r   r   r   ú<module>rß      sX   ðñõ ÷õ õ  Ý !ð €Ø€
Ø€
Ø€Ø€ò"÷"`	
ñ `	
ðF #Ð
#�r   