Ë
    êñi™  ã                  óh   — d Z ddlmZ ddlmZmZ ddlmZmZm	Z	m
Z
 ddlmZmZmZ dZ G d„ d	«      Zy
)zy
h2/frame_buffer
~~~~~~~~~~~~~~~

A data structure that provides a way to iterate over a byte buffer in terms of
frames.
é    )Úannotations)ÚInvalidDataErrorÚInvalidFrameError)ÚContinuationFrameÚFrameÚHeadersFrameÚPushPromiseFrameé   )ÚFrameDataMissingErrorÚFrameTooLargeErrorÚProtocolErroré@   c                  óB   — e Zd ZdZd	d
d„Zdd„Zdd„Zdd„Zdd„Zdd„Z	y)ÚFrameBufferza
    A buffer data structure for HTTP/2 data that allows iteraton in terms of
    H2 frames.
    c                óˆ   — t        «       | _        d| _        |rdnd| _        t	        | j                  «      | _        g | _        y )Nr   s   PRI * HTTP/2.0

SM

ó    )Ú	bytearrayÚ_dataÚmax_frame_sizeÚ	_preambleÚlenÚ_preamble_lenÚ_headers_buffer)ÚselfÚservers     úQ/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/h2/frame_buffer.pyÚ__init__zFrameBuffer.__init__    s8   € Ü“[ˆŒ
ØˆÔÙ@FÑ<ÈCˆŒÜ  §¡Ó0ˆÔØZ\ˆÕr   c                ó(  — | j                   rqt        |«      }t        | j                   |«      }| j                  d| |d| k7  rd}t	        |«      ‚||d }| xj                   |z  c_         | j                  |d | _        | xj
                  |z  c_        y)zs
        Add more data to the frame buffer.

        :param data: A bytestring containing the byte buffer.
        NzInvalid HTTP/2 preamble.)r   r   Úminr   r   r   )r   ÚdataÚdata_lenÚof_which_preambleÚmsgs        r   Úadd_datazFrameBuffer.add_data'   s™   € ð ×ÒÜ˜4“yˆHÜ # D×$6Ñ$6¸Ó AÐà�~‰~Ð0Ð0Ð1°TÐ:LÐ;LÐ5MÒMØ0�Ü# CÓ(Ð(àÐ)Ð*Ð+ˆDØ×ÒÐ"3Ñ3ÕØ!Ÿ^™^Ð,=Ð,>Ð?ˆDŒNà�
Š
�dÑŽ
r   c                ó\   — || j                   kD  rd|› d| j                   › �}t        |«      ‚y)zB
        Confirm that the frame is an appropriate length.
        z Received overlong frame: length z, max N)r   r   )r   Úlengthr#   s      r   Ú_validate_frame_lengthz"FrameBuffer._validate_frame_length;   s;   € ð �D×'Ñ'Ò'Ø4°V°H¸FÀ4×CVÑCVÐBWÐXˆCÜ$ SÓ)Ð)ð (r   c                óÄ  — | j                   �r| j                   d   j                  }|duxr! t        |t        «      xr |j                  |k(  }|sd}t	        |«      ‚t        |t        «      sJ ‚| j                   j                  |«       t        | j                   «      t        kD  rd}t	        |«      ‚d|j                  v rZ| j                   d   }|j                  j                  d«       dj                  d„ | j                   D «       «      |_        g | _         |S d}|S t        |t        t        f«      r+d|j                  vr| j                   j                  |«       d}|S )z¡
        Updates the internal header buffer. Returns a frame that should replace
        the current one. May throw exceptions if this frame is invalid.
        r   Nz"Invalid frame during header block.z&Too many continuation frames received.ÚEND_HEADERSr   c              3  ó4   K  — | ]  }|j                   –— Œ y ­w©N)r    )Ú.0Úxs     r   ú	<genexpr>z4FrameBuffer._update_header_buffer.<locals>.<genexpr>f   s   è ø€ Ò!G¨Q !§&¥&Ñ!Gùs   ‚)r   Ú	stream_idÚ
isinstancer   r   Úappendr   ÚCONTINUATION_BACKLOGÚflagsÚaddÚjoinr    r   r	   )r   Úfr/   Úvalid_framer#   s        r   Ú_update_header_bufferz!FrameBuffer._update_header_bufferC   sU  € ð ×ÓØ×,Ñ,¨QÑ/×9Ñ9ˆIà˜�ò )Ü˜1Ô/Ó0ò)à—‘˜yÑ(ð ñ
 Ø:�Ü# CÓ(Ð(Ü˜aÔ!2Ô3Ð3Ð3ð × Ñ ×'Ñ'¨Ô*Ü�4×'Ñ'Ó(Ô+?Ò?Ø>�Ü# CÓ(Ð(ð  §¡Ñ'Ø×(Ñ(¨Ñ+�Ø—‘—‘˜MÔ*ØŸ™Ñ!G°$×2FÑ2FÔ!GÓG�”Ø')�Ô$ð ˆð �ð ˆô ˜œ\Ô+;Ð<Ô=Ø Q§W¡WÑ,ð × Ñ ×'Ñ'¨Ô*ØˆAàˆr   c                ó   — | S r+   © )r   s    r   Ú__iter__zFrameBuffer.__iter__t   s   € Øˆr   c                ó�  — t        | j                  «      dk  rt        ‚	 t        j                  t        | j                  d d «      «      \  }}t        | j                  «      |dz   k  rt        ‚| j                  |«       	 |j                  t        | j                  dd|z    «      «       | j                  d|z   d  | _        | j                  |«      }|�|S | j                  «       S # t        t        f$ r}d|›�}t        |«      |‚d }~ww xY w# t        $ r}d}t        |«      |‚d }~wt        $ r}d}t        |«      |‚d }~ww xY w)Né	   z$Received frame with invalid header: z&Received frame with non-compliant datazFrame data missing or invalid)r   r   ÚStopIterationr   Úparse_frame_headerÚ
memoryviewr   r   r   r'   Ú
parse_bodyr   r8   Ú__next__)r   r6   r&   Úerrr#   Ú	new_frames         r   rB   zFrameBuffer.__next__w   sE  € ô ˆt�z‰z‹?˜QÒÜÐð	.Ü×0Ñ0´¸D¿J¹JÀrÈ¸NÓ1KÓL‰IˆAˆvô ˆt�z‰z‹?˜V a™ZÒ'ÜÐð 	×#Ñ# FÔ+ð	6Ø�L‰Lœ D§J¡J¨q°°6±Ð$:Ó;Ô<ð —Z‘Z  &¡ 	Ð*ˆŒ
ð ×.Ñ.¨qÓ1ˆ	ð &Ð1ˆyÐF°t·}±}³ÐFøôE !Ô"3Ð4ò 	.Ø8¸¸Ð@ˆCÜ Ó$¨#Ð-ûð	.ûô  ò 	.Ø:ˆCÜ Ó$¨#Ð-ûÜ ò 	6Ø1ˆCÜ'¨Ó,°#Ð5ûð	6ús;    .C' Â*D Ã'DÃ6DÄDÄ	EÄD&Ä&EÄ2E Å EN)F)r   ÚboolÚreturnÚNone)r    ÚbytesrF   rG   )r&   ÚintrF   rG   )r6   úFrame | NonerF   rJ   )rF   r   )rF   r   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r$   r'   r8   r;   rB   r:   r   r   r   r      s(   „ ñô
]óó(*ó.óbô*Gr   r   N)rN   Ú
__future__r   Úhyperframe.exceptionsr   r   Úhyperframe.framer   r   r   r	   Ú
exceptionsr   r   r   r2   r   r:   r   r   ú<module>rS      s4   ðñõ #ç Eß UÓ Uç PÑ Pð Ð ÷GGò GGr   