§
    …ßj“  ã                   óB   — d Z ddlmZ ddlmZmZ  G d„ de¦  «        ZdS )z€Async uWSGI protocol parser for ASGI workers.

Reuses the parsing logic from gunicorn/uwsgi/message.py, only async I/O differs.
é    )ÚUWSGIRequest)ÚInvalidUWSGIHeaderÚUnsupportedModifierc                   óX   — e Zd ZdZdd„Zedd„¦   «         Zd„ Zd„ Zd„ Z	dd	„Z
d
„ Zd„ ZdS )ÚAsyncUWSGIRequestaR  Async version of UWSGIRequest.

    Reuses all parsing logic from the sync version, only async I/O differs.
    The following methods are reused from the parent class:
    - _parse_vars() - pure parsing, no I/O
    - _extract_request_info() - pure transformation
    - _check_allowed_ip() - no I/O
    - should_close() - simple logic
    é   c                 óZ  — || _         || _        || _        || _        || _        d | _        d | _        d | _        d | _        d| _	        d| _
        g | _        g | _        d | _        |j        rdnd| _        d| _        i | _        d| _        d| _        d | _        d| _        d| _        d| _        d S )NÚ )r   r   ÚhttpsÚhttpFr   )ÚcfgÚunreaderÚ	peer_addrÚremote_addrÚ
req_numberÚmethodÚuriÚpathÚqueryÚfragmentÚversionÚheadersÚtrailersÚbodyÚis_sslÚschemeÚ
must_closeÚ
uwsgi_varsÚ	modifier1Ú	modifier2Úproxy_protocol_infoÚcontent_lengthÚchunkedÚ_body_remaining)Úselfr   r   r   r   s        úF/var/www/html/venv/lib/python3.11/site-packages/gunicorn/asgi/uwsgi.pyÚ__init__zAsyncUWSGIRequest.__init__   s¾   € ð ˆŒØ ˆŒØ"ˆŒØ$ˆÔØ$ˆŒð ˆŒØˆŒØˆŒ	ØˆŒ
ØˆŒØˆŒØˆŒØˆŒØˆŒ	Ø!$¤Ð7�g�g°ˆŒØˆŒØˆŒØˆŒØˆŒØ#'ˆÔ ð  ˆÔØˆŒØ ˆÔÐÐó    c              ƒ   ó‚   K  —  | ||||¦  «        }|                      ¦   «          |                     ¦   «         ƒ d{V —† |S )a  Parse a uWSGI request asynchronously.

        Args:
            cfg: gunicorn config object
            unreader: AsyncUnreader instance
            peer_addr: client address tuple
            req_number: request number on this connection (for keepalive)

        Returns:
            AsyncUWSGIRequest: Parsed request object

        Raises:
            InvalidUWSGIHeader: If the uWSGI header is malformed
            UnsupportedModifier: If modifier1 is not 0
            ForbiddenUWSGIRequest: If source IP is not allowed
        N)Ú_check_allowed_ipÚ_async_parse)Úclsr   r   r   r   Úreqs         r&   ÚparsezAsyncUWSGIRequest.parse@   sX   è è € ð$ ˆc�#�x ¨JÑ7Ô7ˆØ×ÒÑÔÐØ×ÒÑ Ô Ð Ð Ð Ð Ð Ð Ð Øˆ
r(   c              ƒ   ó<  K  — |                       d¦  «        ƒ d{V —†}t          |¦  «        dk     rt          d¦  «        ‚|d         | _        t                               |dd…         d¦  «        }|d         | _        | j        dk    rt          | j        ¦  «        ‚|dk    rR|                       |¦  «        ƒ d{V —†}t          |¦  «        |k     rt          d¦  «        ‚|                      |¦  «         |  	                    ¦   «          |  
                    ¦   «          dS )	z=Async version of parse() - reads data then uses sync parsing.é   Nzincomplete headerr   r   é   Úlittlezincomplete vars block)Ú_async_read_exactÚlenr   r   ÚintÚ
from_bytesr    r   Ú_parse_varsÚ_extract_request_infoÚ_set_body_reader)r%   ÚheaderÚdatasizeÚ	vars_datas       r&   r+   zAsyncUWSGIRequest._async_parseW   s'  è è € ð ×-Ò-¨aÑ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0ˆÝˆv‰;Œ;˜Š?ˆ?Ý$Ð%8Ñ9Ô9Ð9à œˆŒÝ—>’> &¨¨1¨¤+¨xÑ8Ô8ˆØ œˆŒàŒ>˜QÒÐÝ% d¤nÑ5Ô5Ð5ð �aŠ<ˆ<Ø"×4Ò4°XÑ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>ˆIÝ�9‰~Œ~ Ò(Ð(Ý(Ð)@ÑAÔAÐAØ×Ò˜YÑ'Ô'Ð'à×"Ò"Ñ$Ô$Ð$Ø×ÒÑÔÐÐÐr(   c              ƒ   ó  K  — t          ¦   «         }t          |¦  «        |k     r[| j                             |t          |¦  «        z
  ¦  «        ƒ d{V —†}|sn(|                     |¦  «         t          |¦  «        |k     °[t          |¦  «        S )z'Read exactly size bytes asynchronously.N)Ú	bytearrayr4   r   ÚreadÚextendÚbytes)r%   ÚsizeÚbufÚchunks       r&   r3   z#AsyncUWSGIRequest._async_read_exacto   s‹   è è € å‰kŒkˆÝ�#‰hŒh˜ŠoˆoØœ-×,Ò,¨TµC¸±H´H©_Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=ˆEØð ØØ�JŠJ�uÑÔÐõ	 �#‰hŒh˜Šoˆoõ
 �S‰zŒzÐr(   c                 ó°   — d}d| j         v r<	 t          t          | j         d         ¦  «        d¦  «        }n# t          $ r d}Y nw xY w|| _        || _        dS )z$Set up body state for async reading.r   ÚCONTENT_LENGTHN)r   Úmaxr5   Ú
ValueErrorr"   r$   )r%   r"   s     r&   r9   z"AsyncUWSGIRequest._set_body_readery   st   € àˆØ˜tœÐ.Ð.ð#Ý!$¥S¨¬Ð9IÔ)JÑ%KÔ%KÈQÑ!OÔ!O��øÝð #ð #ð #Ø!"���ð#øøøà,ˆÔØ-ˆÔÐÐs   �(6 ¶AÁAé    c              ƒ   óÌ   K  — | j         dk    rdS t          || j         ¦  «        }| j                             |¦  «        ƒ d{V —†}|r| xj         t	          |¦  «        z  c_         |S )z²Read body chunk asynchronously.

        Args:
            size: Maximum bytes to read

        Returns:
            bytes: Body data, empty bytes when body is exhausted
        r   r(   N)r$   Úminr   r?   r4   )r%   rB   Úto_readÚdatas       r&   Ú	read_bodyzAsyncUWSGIRequest.read_body„   s{   è è € ð Ô 1Ò$Ð$Ø�3Ý�d˜DÔ0Ñ1Ô1ˆØ”]×'Ò'¨Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0ˆØð 	.ØÐ Ô ¥C¨¡I¤IÑ-Ð Ô Øˆr(   c              ƒ   óx   K  — | j         dk    r,|                      d¦  «        ƒ d{V —†}|sdS | j         dk    °*dS dS )zcDrain unread body data.

        Should be called before reusing connection for keepalive.
        r   rI   N)r$   rN   )r%   rM   s     r&   Ú
drain_bodyzAsyncUWSGIRequest.drain_body•   sb   è è € ð
 Ô" QÒ&Ð&ØŸš¨Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-ˆDØð Ø�ð Ô" QÒ&Ð&Ð&Ð&Ð&Ð&r(   c                 ó\   — |                      ¦   «         }| j        D ]\  }}||k    r|c S ŒdS )z«Get header by name (case-insensitive).

        Args:
            name: Header name to look up

        Returns:
            Header value if found, None otherwise
        N)Úupperr   )r%   ÚnameÚhÚvs       r&   Ú
get_headerzAsyncUWSGIRequest.get_headerŸ   sB   € ð �zŠz‰|Œ|ˆØ”Lð 	ð 	‰DˆAˆqØ�DŠyˆyØ���ð àˆtr(   N)r   )rI   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r'   Úclassmethodr.   r+   r3   r9   rN   rP   rV   © r(   r&   r   r      s²   € € € € € ðð ð!ð !ð !ð !ðF ðð ð ñ „[ðð, ð  ð  ð0ð ð ð	.ð 	.ð 	.ðð ð ð ð"ð ð ðð ð ð ð r(   r   N)rZ   Úgunicorn.uwsgi.messager   Úgunicorn.uwsgi.errorsr   r   r   r\   r(   r&   ú<module>r_      s‰   ðð
ð ð
 0Ð /Ð /Ð /Ð /Ð /ðð ð ð ð ð ð ð ð[ð [ð [ð [ð [˜ñ [ô [ð [ð [ð [r(   