§
    ŸjI  ã            	       ó”   — d Z ddlZddlZ G d„ de¦  «        Z G d„ d¦  «        Zddeded	ed
e	fd„Z
ddede	d
e	fd„Zdeded
e	fd„ZdS )a°  
Control Socket Protocol

JSON-based protocol with length-prefixed framing for the control interface.

Message Format:
    +----------------+------------------+
    | Length (4B BE) |  JSON Payload    |
    +----------------+------------------+

Request Format:
    {"id": 1, "command": "show", "args": ["workers"]}

Response Format:
    {"id": 1, "status": "ok", "data": {...}}
    {"id": 1, "status": "error", "error": "message"}
é    Nc                   ó   — e Zd ZdZdS )ÚProtocolErrorzProtocol-level error.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úb/var/www/finuniver-perm.ru/html/student/venv/lib/python3.11/site-packages/gunicorn/ctl/protocol.pyr   r      s   € € € € € ØÐÐÐr
   r   c                   óÆ   — e Zd ZdZdZededefd„¦   «         Zededefd„¦   «         Z	edefd„¦   «         Z
edefd„¦   «         Zedefd	„¦   «         Zedefd
„¦   «         ZdS )ÚControlProtocolz‡
    Protocol implementation for control socket communication.

    Uses 4-byte big-endian length prefix followed by JSON payload.
    i   ÚdataÚreturnc                 óž   — t          j        | ¦  «                             d¦  «        }t          j        dt          |¦  «        ¦  «        }||z   S )z£
        Encode a message for transmission.

        Args:
            data: Dictionary to encode

        Returns:
            Length-prefixed JSON bytes
        úutf-8ú>I)ÚjsonÚdumpsÚencodeÚstructÚpackÚlen)r   ÚpayloadÚlengths      r   Úencode_messagezControlProtocol.encode_message)   sC   € õ ”*˜TÑ"Ô"×)Ò)¨'Ñ2Ô2ˆÝ”˜T¥3 w¡<¤<Ñ0Ô0ˆØ˜ÑÐr
   c                 ó>  — t          | ¦  «        dk     rt          d¦  «        ‚t          j        d| dd…         ¦  «        d         }t          | ¦  «        d|z   k     rt          d¦  «        ‚| dd|z   …         }t	          j        |                     d¦  «        ¦  «        S )z©
        Decode a message from bytes.

        Args:
            data: Raw bytes (length prefix + JSON payload)

        Returns:
            Decoded dictionary
        é   zMessage too shortr   Nr   zIncomplete messager   )r   r   r   Úunpackr   ÚloadsÚdecode)r   r   r   s      r   Údecode_messagezControlProtocol.decode_message8   s’   € õ ˆt‰9Œ9�qŠ=ˆ=ÝÐ 3Ñ4Ô4Ð4å”˜t T¨"¨1¨"¤XÑ.Ô.¨qÔ1ˆÝˆt‰9Œ9�q˜6‘zÒ!Ð!ÝÐ 4Ñ5Ô5Ð5à�q˜˜V™�|Ô$ˆÝŒz˜'Ÿ.š.¨Ñ1Ô1Ñ2Ô2Ð2r
   c                 óè  — d}t          |¦  «        dk     r_|                      dt          |¦  «        z
  ¦  «        }|s |st          d¦  «        ‚t          d¦  «        ‚||z  }t          |¦  «        dk     °_t	          j        d|¦  «        d         }|t          j        k    rt          d|› �¦  «        ‚d}t          |¦  «        |k     r\|                      t          |t          |¦  «        z
  d¦  «        ¦  «        }|st          d	¦  «        ‚||z  }t          |¦  «        |k     °\	 t          j
        |                     d
¦  «        ¦  «        S # t          j        $ r}t          d|› �¦  «        ‚d}~ww xY w)a  
        Read one message from a socket.

        Args:
            sock: Socket to read from

        Returns:
            Decoded message dictionary

        Raises:
            ProtocolError: If message is malformed
            ConnectionError: If connection is closed
        r
   r   zConnection closedzIncomplete length prefixr   r   úMessage too large: i   zIncomplete payloadr   úInvalid JSON: N)r   ÚrecvÚConnectionErrorr   r   r   r   ÚMAX_MESSAGE_SIZEÚminr   r   r    ÚJSONDecodeError)ÚsockÚlength_dataÚchunkr   Úpayload_dataÚes         r   Úread_messagezControlProtocol.read_messageM   s™  € ð  ˆÝ�+ÑÔ Ò"Ð"Ø—I’I˜a¥# kÑ"2Ô"2Ñ2Ñ3Ô3ˆEØð @Ø"ð ?Ý)Ð*=Ñ>Ô>Ð>Ý#Ð$>Ñ?Ô?Ð?Ø˜5Ñ ˆKõ �+ÑÔ Ò"Ð"õ ”˜t [Ñ1Ô1°!Ô4ˆà•OÔ4Ò4Ð4ÝÐ >°fÐ >Ð >Ñ?Ô?Ð?ð ˆÝ�,ÑÔ &Ò(Ð(Ø—I’I�c &­3¨|Ñ+<Ô+<Ñ"<¸eÑDÔDÑEÔEˆEØð :Ý#Ð$8Ñ9Ô9Ð9Ø˜EÑ!ˆLõ	 �,ÑÔ &Ò(Ð(ð	6Ý”:˜l×1Ò1°'Ñ:Ô:Ñ;Ô;Ð;øÝÔ#ð 	6ð 	6ð 	6ÝÐ 4°Ð 4Ð 4Ñ5Ô5Ð5øøøøð	6øøøs   Ä$&E ÅE1ÅE,Å,E1c                 ód   — t                                |¦  «        }|                      |¦  «         dS )z‘
        Write one message to a socket.

        Args:
            sock: Socket to write to
            data: Message dictionary to send
        N)r   r   Úsendall)r*   r   Úmessages      r   Úwrite_messagezControlProtocol.write_messagex   s/   € õ "×0Ò0°Ñ6Ô6ˆØ�Š�WÑÔÐÐÐr
   c              ƒ   óŽ  K  — |                       d¦  «        ƒ d{V —†}t          j        d|¦  «        d         }|t          j        k    rt          d|› �¦  «        ‚|                       |¦  «        ƒ d{V —†}	 t          j        |                     d¦  «        ¦  «        S # t          j	        $ r}t          d|› �¦  «        ‚d}~ww xY w)z©
        Read one message from an async reader.

        Args:
            reader: asyncio StreamReader

        Returns:
            Decoded message dictionary
        r   Nr   r   r#   r   r$   )
Úreadexactlyr   r   r   r'   r   r   r   r    r)   )Úreaderr+   r   r-   r.   s        r   Úread_message_asyncz"ControlProtocol.read_message_async„   së   è è € ð #×.Ò.¨qÑ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1ˆÝ”˜t [Ñ1Ô1°!Ô4ˆà•OÔ4Ò4Ð4ÝÐ >°fÐ >Ð >Ñ?Ô?Ð?ð $×/Ò/°Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7ˆð	6Ý”:˜l×1Ò1°'Ñ:Ô:Ñ;Ô;Ð;øÝÔ#ð 	6ð 	6ð 	6ÝÐ 4°Ð 4Ð 4Ñ5Ô5Ð5øøøøð	6øøøs   Á7&B ÂCÂ-B?Â?Cc              ƒ   óœ   K  — t                                |¦  «        }|                      |¦  «         |                      ¦   «         ƒ d{V —† dS )zœ
        Write one message to an async writer.

        Args:
            writer: asyncio StreamWriter
            data: Message dictionary to send
        N)r   r   ÚwriteÚdrain)Úwriterr   r2   s      r   Úwrite_message_asyncz#ControlProtocol.write_message_asyncž   sS   è è € õ "×0Ò0°Ñ6Ô6ˆØ�Š�WÑÔÐØ�lŠl‰nŒnÐÐÐÐÐÐÐÐÐr
   N)r   r   r   r   r'   ÚstaticmethodÚdictÚbytesr   r!   r/   r3   r7   r<   r	   r
   r   r   r      s  € € € € € ðð ð (Ðàð ˜Tð   eð  ð  ð  ñ „\ð ð ð3˜Uð 3 tð 3ð 3ð 3ñ „\ð3ð( ð(6˜dð (6ð (6ð (6ñ „\ð(6ðT ð	 $ð 	ð 	ð 	ñ „\ð	ð ð6¨Dð 6ð 6ð 6ñ „\ð6ð2 ð
°ð 
ð 
ð 
ñ „\ð
ð 
ð 
r
   r   Ú
request_idÚcommandÚargsr   c                 ó   — | ||pg dœS )zã
    Create a request message.

    Args:
        request_id: Unique request identifier
        command: Command name (e.g., "show workers")
        args: Optional list of arguments

    Returns:
        Request dictionary
    )ÚidrA   rB   r	   )r@   rA   rB   s      r   Úmake_requestrE   ¬   s    € ð ØØ�
˜ðð ð r
   r   c                 ó   — | d|pi dœS )z·
    Create a success response message.

    Args:
        request_id: Request identifier being responded to
        data: Response data

    Returns:
        Response dictionary
    Úok)rD   Ústatusr   r	   )r@   r   s     r   Úmake_responserI   ¿   s    € ð ØØ�
˜ðð ð r
   Úerrorc                 ó   — | d|dœS )z½
    Create an error response message.

    Args:
        request_id: Request identifier being responded to
        error: Error message

    Returns:
        Error response dictionary
    rJ   )rD   rH   rJ   r	   )r@   rJ   s     r   Úmake_error_responserL   Ñ   s   € ð ØØðð ð r
   )N)r   r   r   Ú	Exceptionr   r   ÚintÚstrÚlistr>   rE   rI   rL   r	   r
   r   ú<module>rQ      s  ðð
ð ð$ €€€Ø €€€ð ð  ð  ð  ð  �Iñ  ô  ð  ðJð Jð Jð Jð Jñ Jô Jð JðZð ˜Sð ¨3ð °dð Àdð ð ð ð ð&ð ˜cð ¨ð ¸ð ð ð ð ð$ Cð °ð ¸ð ð ð ð ð ð r
   