§
    Ÿjñ*  ã                   óp   — d Z ddlmZmZ ddlmZ ddlmZ  G d„ de¦  «        Z G d„ d	¦  «        Z	d	dgZ
d
S )zd
HTTP/2 stream state management.

Each HTTP/2 stream represents a single request/response exchange.
é    )ÚEnumÚauto)ÚBytesIOé   )ÚHTTP2StreamErrorc                   óž   — e Zd ZdZ e¦   «         Z e¦   «         Z e¦   «         Z e¦   «         Z e¦   «         Z	 e¦   «         Z
 e¦   «         ZdS )ÚStreamStatez8HTTP/2 stream states as defined in RFC 7540 Section 5.1.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚIDLEÚRESERVED_LOCALÚRESERVED_REMOTEÚOPENÚHALF_CLOSED_LOCALÚHALF_CLOSED_REMOTEÚCLOSED© ó    úb/var/www/finuniver-perm.ru/html/student/venv/lib/python3.11/site-packages/gunicorn/http2/stream.pyr	   r	      sc   € € € € € ØBÐBàˆ4‰6Œ6€DØ�T‘V”V€NØ�d‘f”f€OØˆ4‰6Œ6€DØ˜™œÐØ˜™œÐØˆT‰VŒV€F€F€Fr   r	   c                   óÜ   — e Zd ZdZd„ Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Z	dd„Z
dd	„Zd
„ Zdd„Zdd„Zd„ Zdd„Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚHTTP2Streamz¡Represents a single HTTP/2 stream.

    Manages stream state, headers, and body data for a single
    request/response exchange within an HTTP/2 connection.
    c                 ó8  — || _         || _        t          j        | _        g | _        t          ¦   «         | _        d| _        d| _	        d| _
        d| _        |j        | _        d| _        d| _        d| _        d| _        d| _        g | _        d| _        d| _        dS )z¼Initialize an HTTP/2 stream.

        Args:
            stream_id: The unique stream identifier (odd for client-initiated)
            connection: The parent HTTP2ServerConnection
        FNé   r   )Ú	stream_idÚ
connectionr	   r   ÚstateÚrequest_headersr   Úrequest_bodyÚrequest_completeÚresponse_startedÚresponse_headers_sentÚresponse_completeÚinitial_window_sizeÚwindow_sizeÚtrailersÚresponse_trailersÚpriority_weightÚpriority_depends_onÚpriority_exclusiveÚ_body_chunksÚ_body_eventÚ_body_complete)Úselfr   r   s      r   Ú__init__zHTTP2Stream.__init__%   s°   € ð #ˆŒØ$ˆŒõ !Ô%ˆŒ
ð  "ˆÔÝ#™IœIˆÔØ %ˆÔð !&ˆÔØ%*ˆÔ"Ø!&ˆÔð &Ô9ˆÔð ˆŒð "&ˆÔð  "ˆÔØ#$ˆÔ Ø"'ˆÔð ˆÔØˆÔØ#ˆÔÐÐr   c                 ó   — | j         dz  dk    S )z;Check if this is a client-initiated stream (odd stream ID).é   r   ©r   ©r/   s    r   Úis_client_streamzHTTP2Stream.is_client_streamO   ó   € ð Œ~ Ñ! QÒ&Ð&r   c                 ó   — | j         dz  dk    S )z<Check if this is a server-initiated stream (even stream ID).r2   r   r3   r4   s    r   Úis_server_streamzHTTP2Stream.is_server_streamT   r6   r   c                 ó@   — | j         t          j        t          j        fv S )z&Check if this stream can receive data.)r   r	   r   r   r4   s    r   Úcan_receivezHTTP2Stream.can_receiveY   s$   € ð ŒzÝÔÝÔ)ð
ð 
ð 	
r   c                 ó@   — | j         t          j        t          j        fv S )z#Check if this stream can send data.)r   r	   r   r   r4   s    r   Úcan_sendzHTTP2Stream.can_senda   s$   € ð ŒzÝÔÝÔ*ð
ð 
ð 	
r   Fc                 óH  — | j         t          j        k    rt          j        | _         nA| j         t          j        t          j        fvr"t          | j        d| j         j        › �¦  «        ‚| j         	                    |¦  «         |r|  
                    ¦   «          d| _        dS dS )zôProcess received HEADERS frame.

        Args:
            headers: List of (name, value) tuples
            end_stream: True if END_STREAM flag is set

        Raises:
            HTTP2StreamError: If headers received in invalid state
        z Cannot receive headers in state TN)r   r	   r   r   r   r   r   Únamer   ÚextendÚ_half_close_remoter!   ©r/   ÚheadersÚ
end_streams      r   Úreceive_headerszHTTP2Stream.receive_headersi   s©   € ð Œ:�Ô)Ò)Ð)Ý$Ô)ˆDŒJˆJØŒZ¥Ô 0µ+Ô2OÐPÐPÐPÝ"Ø”ØD°4´:´?ÐDÐDñô ð ð
 	Ô×#Ò# GÑ,Ô,Ð,àð 	)Ø×#Ò#Ñ%Ô%Ð%Ø$(ˆDÔ!Ð!Ð!ð	)ð 	)r   c                 ó”  — | j         s"t          | j        d| j        j        › �¦  «        ‚|r:| j                             |¦  «         | j        r| j                             ¦   «          | j	         
                    |¦  «         |rD|                      ¦   «          d| _        d| _        | j        r| j                             ¦   «          dS dS dS )zôProcess received DATA frame with streaming support.

        Args:
            data: Bytes received
            end_stream: True if END_STREAM flag is set

        Raises:
            HTTP2StreamError: If data received in invalid state
        zCannot receive data in state TN)r:   r   r   r   r>   r,   Úappendr-   Úsetr    Úwriter@   r!   r.   ©r/   ÚdatarC   s      r   Úreceive_datazHTTP2Stream.receive_data�   só   € ð Ôð 	Ý"Ø”ØA°´
´ÐAÐAñô ð ð ð 	'ØÔ×$Ò$ TÑ*Ô*Ð*ØÔð 'ØÔ ×$Ò$Ñ&Ô&Ð&ð 	Ô×Ò Ñ%Ô%Ð%àð 	'Ø×#Ò#Ñ%Ô%Ð%Ø$(ˆDÔ!Ø"&ˆDÔØÔð 'ØÔ ×$Ò$Ñ&Ô&Ð&Ð&Ð&ð	'ð 	'ð'ð 'r   c                 óœ   — | j         s"t          | j        d| j        j        › �¦  «        ‚|| _        |                      ¦   «          d| _        dS )zmProcess received trailing headers.

        Args:
            trailers: List of (name, value) tuples
        z!Cannot receive trailers in state TN)r:   r   r   r   r>   r'   r@   r!   ©r/   r'   s     r   Úreceive_trailerszHTTP2Stream.receive_trailers¡   s^   € ð Ôð 	Ý"Ø”ØE°D´J´OÐEÐEñô ð ð
 !ˆŒØ×ÒÑ!Ô!Ð!Ø $ˆÔÐÐr   c                 ó²   — | j         s"t          | j        d| j        j        › �¦  «        ‚d| _        d| _        |r|                      ¦   «          d| _        dS dS )zýMark headers as sent.

        Args:
            headers: List of (name, value) tuples to send
            end_stream: True if this completes the response

        Raises:
            HTTP2StreamError: If headers cannot be sent in current state
        zCannot send headers in state TN)	r<   r   r   r   r>   r"   r#   Ú_half_close_localr$   rA   s      r   Úsend_headerszHTTP2Stream.send_headers±   sx   € ð Œ}ð 	Ý"Ø”ØA°´
´ÐAÐAñô ð ð
 !%ˆÔØ%)ˆÔ"àð 	*Ø×"Ò"Ñ$Ô$Ð$Ø%)ˆDÔ"Ð"Ð"ð	*ð 	*r   c                 ó–   — | j         s"t          | j        d| j        j        › �¦  «        ‚|r|                      ¦   «          d| _        dS dS )zÝMark data as sent.

        Args:
            data: Bytes to send
            end_stream: True if this completes the response

        Raises:
            HTTP2StreamError: If data cannot be sent in current state
        zCannot send data in state TN)r<   r   r   r   r>   rP   r$   rI   s      r   Ú	send_datazHTTP2Stream.send_dataÈ   sh   € ð Œ}ð 	Ý"Ø”Ø>¨T¬Z¬_Ð>Ð>ñô ð ð
 ð 	*Ø×"Ò"Ñ$Ô$Ð$Ø%)ˆDÔ"Ð"Ð"ð	*ð 	*r   c                 óœ   — | j         s"t          | j        d| j        j        › �¦  «        ‚|| _        |                      ¦   «          d| _        dS )zÙMark trailers as sent and close the stream.

        Args:
            trailers: List of (name, value) trailer tuples

        Raises:
            HTTP2StreamError: If trailers cannot be sent in current state
        zCannot send trailers in state TN)r<   r   r   r   r>   r(   rP   r$   rM   s     r   Úsend_trailerszHTTP2Stream.send_trailersÜ   s^   € ð Œ}ð 	Ý"Ø”ØB°´´ÐBÐBñô ð ð "*ˆÔØ×ÒÑ Ô Ð Ø!%ˆÔÐÐr   é   c                 óD   — t           j        | _        d| _        d| _        dS )zvReset this stream with RST_STREAM.

        Args:
            error_code: HTTP/2 error code (default: CANCEL)
        TN©r	   r   r   r$   r!   )r/   Ú
error_codes     r   ÚresetzHTTP2Stream.resetî   s$   € õ !Ô'ˆŒ
Ø!%ˆÔØ $ˆÔÐÐr   c                 óD   — t           j        | _        d| _        d| _        dS )zClose this stream normally.TNrX   r4   s    r   ÚclosezHTTP2Stream.closeø   s"   € å Ô'ˆŒ
Ø!%ˆÔØ $ˆÔÐÐr   Nc                 óx   — |�#t          dt          d|¦  «        ¦  «        | _        |�|| _        |�	|| _        dS dS )a   Update stream priority from PRIORITY frame.

        Args:
            weight: Priority weight (1-256), higher = more resources
            depends_on: Stream ID this stream depends on
            exclusive: Whether this is an exclusive dependency
        Nr   é   )ÚmaxÚminr)   r*   r+   )r/   ÚweightÚ
depends_onÚ	exclusives       r   Úupdate_priorityzHTTP2Stream.update_priorityþ   sP   € ð ÐÝ#& q­#¨c°6Ñ*:Ô*:Ñ#;Ô#;ˆDÔ ØÐ!Ø'1ˆDÔ$ØÐ Ø&/ˆDÔ#Ð#Ð#ð !Ð r   c                 óæ   — | j         t          j        k    rt          j        | _         dS | j         t          j        k    rt          j        | _         dS t          | j        d| j         j        › �¦  «        ‚)z(Transition to half-closed (local) state.z!Cannot half-close local in state N)	r   r	   r   r   r   r   r   r   r>   r4   s    r   rP   zHTTP2Stream._half_close_local  sd   € àŒ:�Ô)Ò)Ð)Ý$Ô6ˆDŒJˆJˆJØŒZ�;Ô9Ò9Ð9Ý$Ô+ˆDŒJˆJˆJå"Ø”ØE°D´J´OÐEÐEñô ð r   c                 óæ   — | j         t          j        k    rt          j        | _         dS | j         t          j        k    rt          j        | _         dS t          | j        d| j         j        › �¦  «        ‚)z)Transition to half-closed (remote) state.z"Cannot half-close remote in state N)	r   r	   r   r   r   r   r   r   r>   r4   s    r   r@   zHTTP2Stream._half_close_remote  sd   € àŒ:�Ô)Ò)Ð)Ý$Ô7ˆDŒJˆJˆJØŒZ�;Ô8Ò8Ð8Ý$Ô+ˆDŒJˆJˆJå"Ø”ØF°T´Z´_ÐFÐFñô ð r   c                 ó4   — | j                              ¦   «         S )zbGet the complete request body.

        Returns:
            bytes: The request body data
        )r    Úgetvaluer4   s    r   Úget_request_bodyzHTTP2Stream.get_request_body%  s   € ð Ô ×)Ò)Ñ+Ô+Ð+r   c              ƒ   ód  K  — ddl }| j        €@|                     ¦   «         | _        | j        s| j        r| j                             ¦   «          	 | j        r| j                             d¦  «        S | j        rdS | j                             ¦   «          | j                             ¦   «         ƒ d{V —† Œc)z–Read next body chunk asynchronously for streaming.

        Returns:
            bytes: Next chunk of body data, or None if body is complete.
        r   N)	Úasyncior-   ÚEventr,   r.   rG   ÚpopÚclearÚwait)r/   rk   s     r   Úread_body_chunkzHTTP2Stream.read_body_chunk-  sÔ   è è € ð 	ˆˆˆð ÔÐ#Ø&Ÿ}š}™œˆDÔð Ô ð ' DÔ$7ð 'ØÔ ×$Ò$Ñ&Ô&Ð&ð	*àÔ ð 0ØÔ(×,Ò,¨QÑ/Ô/Ð/ð Ô"ð Ø�tð Ô×"Ò"Ñ$Ô$Ð$ØÔ"×'Ò'Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)ð	*r   c                 óX   — i }| j         D ]\  }}|                     d¦  «        r|||<   Œ |S )zÄExtract HTTP/2 pseudo-headers from request headers.

        Returns:
            dict: Mapping of pseudo-header names to values
                  (e.g., {':method': 'GET', ':path': '/'})
        ú:)r   Ú
startswith)r/   Úpseudor>   Úvalues       r   Úget_pseudo_headerszHTTP2Stream.get_pseudo_headersJ  sB   € ð ˆØÔ/ð 	%ð 	%‰KˆD�%Ø�Š˜sÑ#Ô#ð %Ø$��t‘øØˆr   c                 ó$   — d„ | j         D ¦   «         S )zŒGet regular (non-pseudo) headers from request.

        Returns:
            list: List of (name, value) tuples for regular headers
        c                 óF   — g | ]\  }}|                      d ¦  «        °||f‘ŒS )rr   )rs   )Ú.0r>   ru   s      r   ú
<listcomp>z3HTTP2Stream.get_regular_headers.<locals>.<listcomp>]  sB   € ð 
ð 
ð 
á��eØ—?’? 3Ñ'Ô'ð
Ø�5ˆMð
ð 
ð 
r   )r   r4   s    r   Úget_regular_headerszHTTP2Stream.get_regular_headersW  s&   € ð
ð 
à#Ô3ð
ñ 
ô 
ð 	
r   c           	      óR   — d| j         › d| j        j        › d| j        › d| j        › d�	S )Nz<HTTP2Stream id=z state=z req_complete=z resp_complete=ú>)r   r   r>   r!   r$   r4   s    r   Ú__repr__zHTTP2Stream.__repr__c  sR   € ð7˜tœ~ð 7ð 7Ø”Z”_ð7ð 7à Ô1ð7ð 7ð "Ô3ð7ð 7ð 7ð	
r   )F)rV   )NNN)r
   r   r   r   r0   Úpropertyr5   r8   r:   r<   rD   rK   rN   rQ   rS   rU   rZ   r\   rd   rP   r@   ri   rp   rv   r{   r~   r   r   r   r   r      s©  € € € € € ðð ð($ð ($ð ($ðT ð'ð 'ñ „Xð'ð ð'ð 'ñ „Xð'ð ð
ð 
ñ „Xð
ð ð
ð 
ñ „Xð
ð)ð )ð )ð )ð0'ð 'ð 'ð 'ð@%ð %ð %ð *ð *ð *ð *ð.*ð *ð *ð *ð(&ð &ð &ð$%ð %ð %ð %ð%ð %ð %ð0ð 0ð 0ð 0ð
ð 
ð 
ð
ð 
ð 
ð,ð ,ð ,ð*ð *ð *ð:ð ð ð

ð 

ð 

ð
ð 
ð 
ð 
ð 
r   r   N)r   Úenumr   r   Úior   Úerrorsr   r	   r   Ú__all__r   r   r   ú<module>r„      s¸   ððð ð Ð Ð Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à $Ð $Ð $Ð $Ð $Ð $ð	ð 	ð 	ð 	ð 	�$ñ 	ô 	ð 	ðK
ð K
ð K
ð K
ð K
ñ K
ô K
ð K
ð\
 ˜-Ð
(€€€r   