§
    …ßj  ã                   ó,   — d Z ddlZ G d„ d¦  «        ZdS )zt
Async version of gunicorn/http/unreader.py for ASGI workers.

Provides async reading with pushback buffer support.
é    Nc                   óF   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zdd„Zd	„ Z	d
„ Z
d„ ZdS )ÚAsyncUnreadera8  Async socket reader with pushback buffer support.

    This class wraps an asyncio StreamReader and provides the ability
    to "unread" data back into a buffer for re-parsing.

    Performance optimization: Reuses BytesIO buffer with truncate/seek
    instead of creating new objects to reduce GC pressure.
    é    c                 ó`   — || _         t          j        ¦   «         | _        || _        d| _        dS )z�Initialize the async unreader.

        Args:
            reader: asyncio.StreamReader instance
            max_chunk: Maximum bytes to read at once
        r   N)ÚreaderÚioÚBytesIOÚbufÚ	max_chunkÚ
_buf_start)Úselfr   r   s      úI/var/www/html/venv/lib/python3.11/site-packages/gunicorn/asgi/unreader.pyÚ__init__zAsyncUnreader.__init__   s*   € ð ˆŒÝ”:‘<”<ˆŒØ"ˆŒØˆŒˆˆó    c                 ó|   — | j                              d¦  «         | j                              d¦  «         d| _        dS )z7Reset buffer for reuse instead of creating new BytesIO.r   N)r
   ÚseekÚtruncater   ©r   s    r   Ú_reset_bufferzAsyncUnreader._reset_buffer$   s7   € àŒ�Š�aÑÔÐØŒ×Ò˜!ÑÔÐØˆŒˆˆr   c                 óž   — | j                              | j        ¦  «         | j                              ¦   «         }|                      ¦   «          |S )z'Get all buffered data and reset buffer.)r
   r   r   Úreadr   )r   Údatas     r   Ú_get_buffered_dataz AsyncUnreader._get_buffered_data*   s>   € àŒ�Š�d”oÑ&Ô&Ð&ØŒx�}Š}‰ŒˆØ×ÒÑÔÐØˆr   c                 ó`   — | j                              dt          j        ¦  «        }|| j        z
  S )zGet size of buffered data.r   )r
   r   r   ÚSEEK_ENDr   )r   Úends     r   Ú_buffer_sizezAsyncUnreader._buffer_size1   s&   € àŒh�mŠm˜A�rœ{Ñ+Ô+ˆØ�T”_Ñ$Ð$r   Nc              ƒ   ój  K  — |�$t          |t          ¦  «        st          d¦  «        ‚|�|dk    rdS |dk     rd}|                      ¦   «         }|€|dk    r|                      ¦   «         S |€|                      ¦   «         ƒ d{V —†}|S ||k     r‡|                      ¦   «         ƒ d{V —†}|s|                      ¦   «         S | j                             dt          j	        ¦  «         | j         
                    |¦  «         |t          |¦  «        z  }||k     °‡| j                             | j        ¦  «         | j                             |¦  «        }| xj        |z  c_        | j        dk    rI| j                             ¦   «         }|                      ¦   «          |r| j         
                    |¦  «         |S )a  Read data from the stream, using buffered data first.

        Args:
            size: Number of bytes to read. If None, returns all buffered
                  data or reads a single chunk.

        Returns:
            bytes: Data read from buffer or stream
        Nz&size parameter must be an int or long.r   r   r   )Ú
isinstanceÚintÚ	TypeErrorr   r   Ú_read_chunkr
   r   r   r   ÚwriteÚlenr   r   r   )r   ÚsizeÚbuf_sizeÚchunkr   Ú	remainings         r   r   zAsyncUnreader.read6   sÊ  è è € ð Ð¥J¨tµSÑ$9Ô$9ÐÝÐDÑEÔEÐEàÐØ�qŠyˆyØ�sØ�aŠxˆxØ�à×$Ò$Ñ&Ô&ˆð ˆ<˜H qšL˜LØ×*Ò*Ñ,Ô,Ð,Øˆ<Ø×*Ò*Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,ˆEØˆLð ˜ŠoˆoØ×*Ò*Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,ˆEØð 1Ø×.Ò.Ñ0Ô0Ð0ØŒH�MŠM˜!�Rœ[Ñ)Ô)Ð)ØŒH�NŠN˜5Ñ!Ô!Ð!Ø�˜E™
œ
Ñ"ˆHð ˜Šoˆoð 	Œ�Š�d”oÑ&Ô&Ð&ØŒx�}Š}˜TÑ"Ô"ˆð 	ˆŒ˜4ÑˆŒð Œ?˜TÒ!Ð!ØœŸš™œˆIØ×ÒÑ Ô Ð Øð *Ø”—’˜yÑ)Ô)Ð)àˆr   c              ƒ   ót   K  — 	 | j                              | j        ¦  «        ƒ d{V —†S # t          $ r Y dS w xY w)z0Read a chunk of data from the underlying stream.Nr   )r   r   r   Ú	Exceptionr   s    r   r"   zAsyncUnreader._read_chunkk   sW   è è € ð	Øœ×)Ò)¨$¬.Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9øÝð 	ð 	ð 	Ø�3�3ð	øøøs   „$) ©
7¶7c                 ó  — |r„| j                              | j        ¦  «         | j                              ¦   «         }|                      ¦   «          | j                              |¦  «         |r| j                              |¦  «         dS dS dS )zµPush data back into the buffer for re-reading.

        Args:
            data: bytes to push back

        Note: This prepends data to the buffer so it will be read first.
        N)r
   r   r   r   r   r#   )r   r   Úexistings      r   ÚunreadzAsyncUnreader.unreadr   s�   € ð ð 		)àŒH�MŠM˜$œ/Ñ*Ô*Ð*Ø”x—}’}‘”ˆHð ×ÒÑ Ô Ð ØŒH�NŠN˜4Ñ Ô Ð Øð )Ø”—’˜xÑ(Ô(Ð(Ð(Ð(ð		)ð 		)ð)ð )r   c                 ó2   — |                       ¦   «         dk    S )z-Check if there's data in the pushback buffer.r   )r   r   s    r   Úhas_buffered_datazAsyncUnreader.has_buffered_data…   s   € à× Ò Ñ"Ô" QÒ&Ð&r   )r   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r"   r-   r/   © r   r   r   r      s¡   € € € € € ðð ð
ð 
ð 
ð 
ðð ð ðð ð ð%ð %ð %ð
3ð 3ð 3ð 3ðjð ð ð)ð )ð )ð&'ð 'ð 'ð 'ð 'r   r   )r3   r   r   r4   r   r   ú<module>r5      sV   ðð
ð ð 
€	€	€	ðy'ð y'ð y'ð y'ð y'ñ y'ô y'ð y'ð y'ð y'r   