§
    …ßjßQ  ã                   ó€   — d Z ddl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dS )
zœ
Async HTTP/2 server connection implementation for ASGI workers.

Uses the hyper-h2 library for HTTP/2 protocol handling with
asyncio for non-blocking I/O.
é    Né   )Ú
HTTP2ErrorÚHTTP2ProtocolErrorÚHTTP2ConnectionErrorÚHTTP2NotAvailableÚHTTP2ErrorCode)ÚHTTP2Stream)ÚHTTP2Requestc                  óŽ   — t           �dS 	 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 dS # 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   © ó    úR/var/www/html/venv/lib/python3.11/site-packages/gunicorn/http2/async_connection.pyÚ
_import_h2r      sš   € õ €Øˆð"Ø#Ð#Ð#Ð#Ð#Ð#Ø&Ð&Ð&Ð&Ð&Ð&Ø&Ð&Ð&Ð&Ð&Ð&Ø.Ð.Ð.Ð.Ð.Ð.Ø*Ð*Ð*Ð*Ð*Ð*Ð*Ð*øÝð "ð "ð "ÝÑ!Ô!Ð!ð"øøøs	   ‹+ «A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dS )"ÚAsyncHTTP2Connectionz®Async HTTP/2 server-side connection handler for ASGI.

    Manages the HTTP/2 connection state and multiplexed streams
    using asyncio for non-blocking I/O operations.
    i   c                 óš  — t          ¦   «          || _        || _        || _        || _        i | _        t          j        ¦   «         | _        |j	        | _
        |j        | _        |j        | _        |j        | _        t"                               dd¬¦  «        }t&                               |¬¦  «        | _        d| _        d| _        d| _        dS )aP  Initialize an async HTTP/2 server connection.

        Args:
            cfg: Gunicorn configuration object
            reader: asyncio StreamReader
            writer: asyncio StreamWriter
            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ÚreaderÚwriterÚclient_addrÚstreamsÚasyncioÚQueueÚ_request_queueÚ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_connÚ_closedÚ_initializedÚ_receive_task)Úselfr%   r&   r'   r(   r   s         r   Ú__init__zAsyncHTTP2Connection.__init__:   sÌ   € õ 	‰ŒˆàˆŒØˆŒØˆŒØ&ˆÔð ˆŒõ &œm™oœoˆÔð $'Ô#@ˆÔ Ø&)Ô&FˆÔ#Ø!Ô6ˆÔØ$'Ô$BˆÔ!õ ×+Ò+ØØ#ð ,ñ 
ô 
ˆõ ×'Ò'¨vÐ'Ñ6Ô6ˆŒð ˆŒØ!ˆÔØ!ˆÔÐÐr   c           
   ƒ   ót  K  — | j         rdS | j                             t          j        j        | j        t          j        j        | j        t          j        j	        | j
        t          j        j        | j        i¦  «         | j                             ¦   «          |                      ¦   «         ƒ d{V —† d| _         dS )z”Send initial HTTP/2 settings to client.

        Should be called after the SSL handshake completes and
        before processing any data.
        NT)r9   r7   Úupdate_settingsr   ÚSettingCodesÚMAX_CONCURRENT_STREAMSr0   ÚINITIAL_WINDOW_SIZEr.   ÚMAX_FRAME_SIZEr2   ÚMAX_HEADER_LIST_SIZEr4   Úinitiate_connectionÚ_send_pending_data©r;   s    r   rD   z(AsyncHTTP2Connection.initiate_connectione   s¹   è è € ð Ôð 	ØˆFð 	Œ×$Ò$ÝÔ%Ô<¸dÔ>YÝÔ%Ô9¸4Ô;SÝÔ%Ô4°dÔ6IÝÔ%Ô:¸DÔ<Uð	&
ñ 	ô 	ð 	ð 	Œ×(Ò(Ñ*Ô*Ð*Ø×%Ò%Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ø ˆÔÐÐr   Nc              ƒ   óÂ  K  — 	 |�:t          j        | j                             | j        ¦  «        |¬¦  «        ƒ d{V —†}n%| j                             | j        ¦  «        ƒ d{V —†}n+# t
          t          f$ r}t          d|› �¦  «        ‚d}~ww xY w|s	d| _        g S 	 | j	         
                    |¦  «        }�nÙ# t          j        $ rG}|                      t          j        ¬¦  «        ƒ d{V —† t!          t#          |¦  «        ¦  «        ‚d}~wt          j        $ rG}|                      t          j        ¬¦  «        ƒ d{V —† t!          t#          |¦  «        ¦  «        ‚d}~wt          j        $ rw}t+          |dd¦  «        }|�|                      |¬¦  «        ƒ d{V —† n&|                      t          j        ¬¦  «        ƒ d{V —† t!          t#          |¦  «        ¦  «        ‚d}~wt          j        $ rG}|                      t          j        ¬¦  «        ƒ d{V —† t!          t#          |¦  «        ¦  «        ‚d}~wt          j        $ rG}|                      t          j        ¬¦  «        ƒ d{V —† t!          t#          |¦  «        ¦  «        ‚d}~ww xY wg }|D ].}|                      |¦  «        }|�|                     |¦  «         Œ/|                      ¦   «         ƒ d{V —† |S )ah  Receive data and return completed requests.

        Args:
            timeout: Optional timeout in seconds for read operation

        Returns:
            list: List of HTTP2Request objects for completed requests

        Raises:
            HTTP2ConnectionError: On protocol or connection errors
            asyncio.TimeoutError: If timeout expires
        N©ÚtimeoutzSocket read error: T©Ú
error_coderK   )r*   Úwait_forr&   ÚreadÚREAD_BUFFER_SIZEÚOSErrorÚIOErrorr   r8   r7   Úreceive_datar   ÚFlowControlErrorÚcloser   ÚFLOW_CONTROL_ERRORr   ÚstrÚFrameTooLargeErrorÚFRAME_SIZE_ERRORÚInvalidSettingsValueErrorÚgetattrÚPROTOCOL_ERRORÚTooManyStreamsErrorÚREFUSED_STREAMÚProtocolErrorÚ_handle_eventÚappendrE   )	r;   rI   ÚdataÚer   rK   Úcompleted_requestsÚeventÚrequests	            r   rQ   z!AsyncHTTP2Connection.receive_dataz   sj  è è € ð		BØÐ"Ý$Ô-Ø”K×$Ò$ TÔ%:Ñ;Ô;Ø#ðñ ô ð ð ð ð ð ð ��ð
 "œ[×-Ò-¨dÔ.CÑDÔDÐDÐDÐDÐDÐDÐD�øøÝ�Ð!ð 	Bð 	Bð 	BÝ&Ð'@¸QÐ'@Ð'@ÑAÔAÐAøøøøð	Bøøøð ð 	àˆDŒLØˆIð	-Ø”\×.Ò.¨tÑ4Ô4ˆF‰FøÝÔ.ð 	-ð 	-ð 	-à—*’*­Ô(I�*ÑJÔJÐJÐJÐJÐJÐJÐJÐJÝ$¥S¨¡V¤VÑ,Ô,Ð,øøøøÝÔ0ð 	-ð 	-ð 	-à—*’*­Ô(G�*ÑHÔHÐHÐHÐHÐHÐHÐHÐHÝ$¥S¨¡V¤VÑ,Ô,Ð,øøøøÝÔ7ð 		-ð 		-ð 		-õ !  L°$Ñ7Ô7ˆJØÐ%Ø—j’j¨J�jÑ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7à—j’j­NÔ,I�jÑJÔJÐJÐJÐJÐJÐJÐJÐJÝ$¥S¨¡V¤VÑ,Ô,Ð,øøøøÝÔ1ð 	-ð 	-ð 	-à—*’*­Ô(E�*ÑFÔFÐFÐFÐFÐFÐFÐFÐFÝ$¥S¨¡V¤VÑ,Ô,Ð,øøøøÝÔ+ð 	-ð 	-ð 	-à—*’*­Ô(E�*ÑFÔFÐFÐFÐFÐFÐFÐFÐFÝ$¥S¨¡V¤VÑ,Ô,Ð,øøøøð	-øøøð  ÐØð 	3ð 	3ˆEØ×(Ò(¨Ñ/Ô/ˆGØÐ"Ø"×)Ò)¨'Ñ2Ô2Ð2øð ×%Ò%Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'à!Ð!se   „A!A& Á&BÁ7B	Â	BÂB9 Â9JÃAD
Ä
JÄAEÅJÅ0A2G"Ç"JÇ4AH6È6JÉAJ
Ê
Jc                 ó
  — t          |t          j        ¦  «        r|                      |¦  «        S t          |t          j        ¦  «        r|                      |¦  «        S t          |t          j        ¦  «        r|                      |¦  «        S t          |t          j        ¦  «        r|  	                    |¦  «         nÅt          |t          j
        ¦  «        rnªt          |t          j        ¦  «        r|                      |¦  «         nzt          |t          j        ¦  «        rn_t          |t          j        ¦  «        r|                      |¦  «         n/t          |t          j        ¦  «        r|                      |¦  «        S dS )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©r;   rc   s     r   r^   z"AsyncHTTP2Connection._handle_eventÂ   sa  € õ �e�ZÔ7Ñ8Ô8ð 	9Ø×0Ò0°Ñ7Ô7Ð7å˜�zÔ6Ñ7Ô7ð 	9Ø×-Ò-¨eÑ4Ô4Ð4å˜�zÔ5Ñ6Ô6ð 	9Ø×,Ò,¨UÑ3Ô3Ð3å˜�zÔ5Ñ6Ô6ð 	9Ø×%Ò% eÑ,Ô,Ð,Ð,å˜�zÔ7Ñ8Ô8ð 	9Øå˜�zÔ9Ñ:Ô:ð 
	9Ø×)Ò)¨%Ñ0Ô0Ð0Ð0å˜�zÔ>Ñ?Ô?ð 	9Øå˜�zÔ>Ñ?Ô?ð 	9Ø×.Ò.¨uÑ5Ô5Ð5Ð5å˜�zÔ:Ñ;Ô;ð 	9Ø×1Ò1°%Ñ8Ô8Ð8àˆtr   c                 ó„   — |j         }|j        }t          || ¦  «        }|| j        |<   |                     |d¬¦  «         dS )z-Handle RequestReceived event (HEADERS frame).F©Ú
end_streamN)Ú	stream_idÚheadersr	   r)   Úreceive_headers)r;   rc   r{   r|   Ústreams        r   rh   z-AsyncHTTP2Connection._handle_request_receivedè   sN   € à”Oˆ	Ø”-ˆõ ˜Y¨Ñ-Ô-ˆØ"(ˆŒ�YÑð 	×Ò˜w°5ÐÑ9Ô9Ð9Ð9Ð9r   c                 ó  — |j         }|j        }| j                             |¦  «        }|€dS |                     |d¬¦  «         t          |¦  «        dk    r®	 | j                             t          |¦  «        |¬¦  «         | j                             t          |¦  «        d¬¦  «         nZ# t          t          j
        f$ rA d| _        	 | j                             t          j        ¬¦  «         n# t          $ r Y nw xY wY nw xY wdS )zHandle DataReceived event.NFry   r   )r{   TrJ   )r{   r`   r)   ÚgetrQ   Úlenr7   Úincrement_flow_control_windowÚ
ValueErrorr   rR   r8   Úclose_connectionr   rT   Ú	Exception)r;   rc   r{   r`   r~   s        r   rj   z*AsyncHTTP2Connection._handle_data_receivedô   s  € à”Oˆ	ØŒzˆà”×!Ò! )Ñ,Ô,ˆØˆ>Ø�4à×Ò˜D¨UÐÑ3Ô3Ð3õ ˆt‰9Œ9�qŠ=ˆ=ðà”×:Ò:½3¸t¹9¼9ÐPYÐ:ÑZÔZÐZà”×:Ò:½3¸t¹9¼9ÐPTÐ:ÑUÔUÐUÐUøÝ¥Ô ?Ð@ð ð ð ð  $�”ðØ”L×1Ò1½^Ô=^Ð1Ñ_Ô_Ð_Ð_øÝ ð ð ð Ø�Dðøøøøøðøøøð ˆts7   ÁAB+ Â+DÃ	%C/Ã.DÃ/
C<Ã9DÃ;C<Ã<DÄDc                 óÞ   — |j         }| j                             |¦  «        }|€dS d|_        d|_        |j        r|j                             ¦   «          t          || j        | j	        ¦  «        S )zHandle StreamEnded event.NT)
r{   r)   r€   Úrequest_completeÚ_body_completeÚ_body_eventÚsetr
   r%   r(   ©r;   rc   r{   r~   s       r   rl   z)AsyncHTTP2Connection._handle_stream_ended  sq   € à”Oˆ	Ø”×!Ò! )Ñ,Ô,ˆàˆ>Ø�4ð
 #'ˆÔØ $ˆÔØÔð 	%ØÔ×"Ò"Ñ$Ô$Ð$å˜F D¤H¨dÔ.>Ñ?Ô?Ð?r   c                 ó„   — |j         }| j                             |¦  «        }|�|                     |j        ¦  «         dS dS )zHandle StreamReset event.N)r{   r)   r€   ÚresetrK   r‹   s       r   rn   z)AsyncHTTP2Connection._handle_stream_reset#  sG   € à”Oˆ	Ø”×!Ò! )Ñ,Ô,ˆàÐØ�LŠL˜Ô)Ñ*Ô*Ð*Ð*Ð*ð Ðr   c                 ó   — d| _         dS )z"Handle ConnectionTerminated event.TN©r8   rw   s     r   rt   z2AsyncHTTP2Connection._handle_connection_terminated+  s   € àˆŒˆˆr   c                 ó¶   — |j         }| j                             |¦  «        }|€dS |                     |j        ¦  «         t          || j        | j        ¦  «        S )zHandle TrailersReceived event.N)r{   r)   r€   Úreceive_trailersr|   r
   r%   r(   r‹   s       r   rv   z.AsyncHTTP2Connection._handle_trailers_received/  sU   € à”Oˆ	Ø”×!Ò! )Ñ,Ô,ˆàˆ>Ø�4à×Ò ¤Ñ.Ô.Ð.Ý˜F D¤H¨dÔ.>Ñ?Ô?Ð?r   c                 óš   — | j                              |j        ¦  «        }|�)|                     |j        |j        |j        ¬¦  «         dS dS )z‚Handle PriorityUpdated event (PRIORITY frame).

        Args:
            event: PriorityUpdated event with priority info
        N)ÚweightÚ
depends_onÚ	exclusive)r)   r€   r{   Úupdate_priorityr“   r”   r•   )r;   rc   r~   s      r   rq   z-AsyncHTTP2Connection._handle_priority_updated:  s`   € ð ”×!Ò! %¤/Ñ2Ô2ˆØÐØ×"Ò"Ø”|Ø Ô+Øœ/ð #ñ ô ð ð ð ð Ðr   c              ƒ   ó²  K  — |dk     s|dk    rt          d|› �¦  «        ‚| j                             |¦  «        }|€t          d|› d�¦  «        ‚dt          |¦  «        fg}|D ];\  }}|                     |                     ¦   «         t          |¦  «        f¦  «         Œ<| j                             ||d¬	¦  «         |                      ¦   «         ƒ d{V —† dS )
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ú:statusFry   )	r   r)   r€   rU   r_   Úlowerr7   Úsend_headersrE   )r;   r{   Ústatusr|   r~   Úresponse_headersÚnameÚvalues           r   Úsend_informationalz'AsyncHTTP2Connection.send_informationalH  s  è è € ð �CŠ<ˆ<˜6 Sš=˜=ÝÐF¸fÐFÐFÑGÔGÐGà”×!Ò! )Ñ,Ô,ˆØˆ>ÝÐ< yÐ<Ð<Ð<Ñ=Ô=Ð=ð '­¨F©¬Ð4Ð5ÐØ"ð 	@ð 	@‰KˆD�%à×#Ò# T§Z¢Z¡\¤\µ3°u±:´:Ð$>Ñ?Ô?Ð?Ð?ð 	Œ×!Ò! )Ð-=È%Ð!ÑPÔPÐPØ×%Ò%Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'r   c              ƒ   ó–  K  — | j                              |¦  «        }|€dS dt          |¦  «        fg}|D ];\  }}|                     |                     ¦   «         t          |¦  «        f¦  «         Œ<|du pt          |¦  «        dk    }		 | j                             |||	¬¦  «         |                     ||	¬¦  «         |                      ¦   «         ƒ d{V —† |r1t          |¦  «        dk    r|  	                    ||d¬¦  «        ƒ d{V —† dS # t          j        $ r- |                     ¦   «          |                      |¦  «         Y dS w xY w)aX  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

        Returns:
            bool: True if response sent, False if stream was already closed
        NFrš   r   ry   T)r)   r€   rU   r_   r›   r�   r7   rœ   rE   Ú	send_datar   ÚStreamClosedErrorrS   Úcleanup_stream)
r;   r{   r�   r|   Úbodyr~   rž   rŸ   r    rz   s
             r   Úsend_responsez"AsyncHTTP2Connection.send_responseh  sƒ  è è € ð ”×!Ò! )Ñ,Ô,ˆØˆ>à�5ð '­¨F©¬Ð4Ð5ÐØ"ð 	@ð 	@‰KˆD�%Ø×#Ò# T§Z¢Z¡\¤\µ3°u±:´:Ð$>Ñ?Ô?Ð?Ð?à˜T�\Ð3¥S¨¡Y¤Y°!¢^ˆ
ð	àŒL×%Ò% iÐ1AÈjÐ%ÑYÔYÐYØ×ÒÐ 0¸ZÐÑHÔHÐHØ×)Ò)Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ð ð G�˜D™	œ	 Aš˜Ø—n’n Y°À�nÑFÔFÐFÐFÐFÐFÐFÐFÐFØ�4øÝÔ/ð 	ð 	ð 	à�LŠL‰NŒNˆNØ×Ò 	Ñ*Ô*Ð*Ø�5�5ð		øøøs   Â	BD Ä8EÅEc              ƒ   óš  K  — d}t          |¦  «        D �]}| j                             |¦  «        }|dk    r|c S 	 t          j        | j                             | j        ¦  «        d¬¦  «        ƒ d{V —†}|r‰| j                             |¦  «        }|D ]Q}t          |t          j        ¦  «        r|j        |k    r  dS Œ,t          |t          j        ¦  «        rd| _          dS ŒR|                      ¦   «         ƒ d{V —† n
d| _         dS Œ÷# t          j        $ r Y �Œ	t"          j        $ r Y  dS w xY w| j                             |¦  «        S )z‹Wait for flow control window to become positive.

        Returns:
            int: Available window size, or -1 if waiting failed
        é2   r   gš™™™™™¹?rH   NéÿÿÿÿT)Úranger7   Úlocal_flow_control_windowr*   rL   r&   rM   rN   rQ   rf   r   rm   r{   rs   r8   rE   ÚTimeoutErrorr   r]   )r;   r{   Úmax_wait_attemptsÚ_Ú	availableÚincomingr   rc   s           r   Ú_wait_for_flow_control_windowz2AsyncHTTP2Connection._wait_for_flow_control_window�  sÄ  è è € ð ÐÝÐ(Ñ)Ô)ð 	ñ 	ˆAØœ×>Ò>¸yÑIÔIˆIØ˜1Š}ˆ}Ø Ð Ð Ð ðÝ!(Ô!1Ø”K×$Ò$ TÔ%:Ñ;Ô;Øð"ñ "ô "ð ð ð ð ð ð �ð ð Ø!œ\×6Ò6°xÑ@Ô@�Fà!'ð &ð &˜Ý% e­ZÔ-CÑDÔDð &Ø$œ°)Ò;Ð;Ø') r r rð  <å'¨­zÔ/NÑOÔOð &Ø+/˜DœLØ#% 2 2 2ð&ð ×1Ò1Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3ð $(�D”LØ˜2˜2ð	 4øõ
 Ô'ð ð ð Ø‘Ý!Ô/ð ð ð Ø�r�r�rðøøøð Œ|×5Ò5°iÑ@Ô@Ð@s$   ¼A?DÂ>#DÃ$#DÄD0ÄD0Ä/D0Fc              ƒ   ó"  K  — | j                              |¦  «        }|€dS |}	 |�r| j                             |¦  «        }t	          || j        t          |¦  «        ¦  «        }|dk    r`|                      ¦   «         ƒ d{V —† |                      |¦  «        ƒ d{V —†}|dk    rdS t	          || j        t          |¦  «        ¦  «        }|d|…         }||d…         }|ot          |¦  «        dk    }	| j         	                    |||	¬¦  «         |                      ¦   «         ƒ d{V —† |�°| 	                    ||¬¦  «         dS # t          j        t          j        f$ r- |                     ¦   «          |                      |¦  «         Y dS 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   ry   T)r)   r€   r7   r¬   Úminr2   r�   rE   r²   r£   r   r¤   rR   rS   r¥   )
r;   r{   r`   rz   r~   Údata_to_sendr°   Ú
chunk_sizeÚchunkÚis_finals
             r   r£   zAsyncHTTP2Connection.send_data¸  sÒ  è è € ð ”×!Ò! )Ñ,Ô,ˆØˆ>Ø�5àˆð	Øñ 0Ø œL×BÒBÀ9ÑMÔM�	Ý  ¨DÔ,?ÅÀ\ÑARÔARÑSÔS�
à ’?�?à×1Ò1Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ø&*×&HÒ&HÈÑ&SÔ&SÐ SÐ SÐ SÐ SÐ SÐ S�IØ  A’~�~Ø$˜uÝ!$ Y°Ô0CÅSÈÑEVÔEVÑ!WÔ!W�Jà$ [ j [Ô1�Ø+¨J¨K¨KÔ8�Ø%Ð@­#¨lÑ*;Ô*;¸qÒ*@�à”×&Ò& y°%ÀHÐ&ÑMÔMÐMØ×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ð# ñ 0ð& ×Ò˜T¨jÐÑ9Ô9Ð9Ø�4øÝÔ0µ.Ô2QÐRð 	ð 	ð 	Ø�LŠL‰NŒNˆNØ×Ò 	Ñ*Ô*Ð*Ø�5�5ð	øøøs   ¤BE Â'BE ÅAFÆFc              ƒ   óD  K  — | j                              |¦  «        }|€dS |j        sdS g }|D ]e\  }}|                     ¦   «         }|                     d¦  «        rt          d|› d�¦  «        ‚|                     |t          |¦  «        f¦  «         Œf	 | j         	                    ||d¬¦  «         | 
                    |¦  «         |                      ¦   «         ƒ d{V —† dS # t          j        $ r- |                     ¦   «          |                      |¦  «         Y dS 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
        NFú:zPseudo-header 'z' not allowed in trailersTry   )r)   r€   Úresponse_headers_sentr›   Ú
startswithr   r_   rU   r7   rœ   Úsend_trailersrE   r   r¤   rS   r¥   )r;   r{   Útrailersr~   Útrailer_headersrŸ   r    Úlnames           r   r½   z"AsyncHTTP2Connection.send_trailersã  sV  è è € ð  ”×!Ò! )Ñ,Ô,ˆØˆ>à�5ØÔ+ð 	à�5ð ˆØ#ð 	8ð 	8‰KˆD�%Ø—J’J‘L”LˆEØ×Ò Ñ$Ô$ð TÝ Ð!R°4Ð!RÐ!RÐ!RÑSÔSÐSØ×"Ò" E­3¨u©:¬:Ð#6Ñ7Ô7Ð7Ð7ð
	àŒL×%Ò% i°ÈTÐ%ÑRÔRÐRØ× Ò  Ñ1Ô1Ð1Ø×)Ò)Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø�4øÝÔ/ð 	ð 	ð 	à�LŠL‰NŒNˆNØ×Ò 	Ñ*Ô*Ð*Ø�5�5ð		øøøs   ÂAC# Ã#8DÄDc              ƒ   óâ   K  — |r|                      ¦   «         nd}dt          t          |¦  «        ¦  «        fg}|r|                     d¦  «         |                      ||||¦  «        ƒ d{V —† dS )z#Send an error response on a stream.r   zcontent-length)zcontent-typeztext/plain; charset=utf-8N)ÚencoderU   r�   r_   r§   )r;   r{   Ústatus_codeÚmessager¦   r|   s         r   Ú
send_errorzAsyncHTTP2Connection.send_error  s†   è è € à#*Ð3ˆw�~Š~ÑÔÐ°ˆØ$¥c­#¨d©)¬)¡n¤nÐ5Ð6ˆØð 	JØ�NŠNÐHÑIÔIÐIà× Ò  ¨K¸À$ÑGÔGÐGÐGÐGÐGÐGÐGÐGÐGÐGr   é   c              ƒ   óØ   K  — | j                              |¦  «        }|�|                     |¦  «         | j                             ||¬¦  «         |                      ¦   «         ƒ d{V —† dS )zReset a stream with RST_STREAM.NrJ   )r)   r€   r�   r7   Úreset_streamrE   )r;   r{   rK   r~   s       r   rÈ   z!AsyncHTTP2Connection.reset_stream  sx   è è € à”×!Ò! )Ñ,Ô,ˆØÐØ�LŠL˜Ñ$Ô$Ð$àŒ×!Ò! )¸
Ð!ÑCÔCÐCØ×%Ò%Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'r   r   c              ƒ   ó®  K  — | j         rdS d| _         |€/| j        r&t          | j                             ¦   «         ¦  «        nd}	 | j                             |¬¦  «         |                      ¦   «         ƒ d{V —† n# t          $ r Y nw xY w	 | j         	                    ¦   «          | j         
                    ¦   «         ƒ d{V —† dS # t          $ r Y dS w xY w)z,Close the connection gracefully with GOAWAY.NTr   rJ   )r8   r)   ÚmaxÚkeysr7   r„   rE   r…   r'   rS   Úwait_closed)r;   rK   Úlast_stream_ids      r   rS   zAsyncHTTP2Connection.close!  s  è è € àŒ<ð 	ØˆFàˆŒàÐ!Ø9=¼ÐL�S ¤×!2Ò!2Ñ!4Ô!4Ñ5Ô5Ð5È1ˆNð	ØŒL×)Ò)°ZÐ)Ñ@Ô@Ð@Ø×)Ò)Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+øÝð 	ð 	ð 	ØˆDð	øøøð	ØŒK×ÒÑÔÐØ”+×)Ò)Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+øÝð 	ð 	ð 	ØˆDˆDð	øøøs$   Á5A; Á;
BÂBÂ8C Ã
CÃCc              ƒ   ó  K  — | j                              ¦   «         }|rn	 | j                             |¦  «         | j                             ¦   «         ƒ d{V —† dS # t
          t          f$ r}d| _        t          d|› �¦  «        ‚d}~ww xY wdS )z,Send any pending data from h2 to the socket.NTzSocket write error: )	r7   rµ   r'   ÚwriteÚdrainrO   rP   r8   r   )r;   r`   ra   s      r   rE   z'AsyncHTTP2Connection._send_pending_data7  s¼   è è € àŒ|×(Ò(Ñ*Ô*ˆØð 	GðGØ”×!Ò! $Ñ'Ô'Ð'Ø”k×'Ò'Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)øÝ�WÐ%ð Gð Gð GØ#�”Ý*Ð+EÀ!Ð+EÐ+EÑFÔFÐFøøøøðGøøøð		Gð 	Gs   Ÿ9A ÁB	Á+BÂB	c                 ó   — | j         S )zCheck if connection is closed.r�   rF   s    r   Ú	is_closedzAsyncHTTP2Connection.is_closedB  s   € ð Œ|Ðr   c                 ó<   — | j                              |d¦  «         dS )z-Remove a stream after processing is complete.N)r)   Úpop)r;   r{   s     r   r¥   z#AsyncHTTP2Connection.cleanup_streamG  s    € àŒ×Ò˜ DÑ)Ô)Ð)Ð)Ð)r   c                 óB   — dt          | j        ¦  «        › d| j        › d�S )Nz<AsyncHTTP2Connection streams=z closed=ú>)r�   r)   r8   rF   s    r   Ú__repr__zAsyncHTTP2Connection.__repr__K  s7   € ð&Ý˜4œ<Ñ(Ô(ð&ð &à”lð&ð &ð &ð	
r   )N)F)rÆ   )r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rN   r<   rD   rQ   r^   rh   rj   rl   rn   rt   rv   rq   r¡   r§   r²   r£   r½   rÅ   rÈ   rS   rE   ÚpropertyrÒ   r¥   r×   r   r   r   r!   r!   0   sÅ  € € € € € ðð ð Ðð)"ð )"ð )"ðV!ð !ð !ð*F"ð F"ð F"ð F"ðP$ð $ð $ðL
:ð 
:ð 
:ðð ð ð:@ð @ð @ð$+ð +ð +ðð ð ð	@ð 	@ð 	@ðð ð ð(ð (ð (ð@&ð &ð &ð &ðP&Að &Að &AðP)ð )ð )ð )ðV*ð *ð *ðXHð Hð Hð Hð(ð (ð (ð (ðð ð ð ð,	Gð 	Gð 	Gð ðð ñ „Xðð*ð *ð *ð
ð 
ð 
ð 
ð 
r   r!   )rÛ   r*   Úerrorsr   r   r   r   r   r~   r	   rd   r
   r   r   r   r   r   r   r!   Ú__all__r   r   r   ú<module>rß      sï   ððð ð €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð  Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !ð €Ø€
Ø€
Ø€Ø€ð"ð "ð "ð"`
ð `
ð `
ð `
ð `
ñ `
ô `
ð `
ðF "Ð
"€€€r   