§
    ±eîi™  ã                  óp   — 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d
S )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                  óD   — 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	dS )ÚFrameBufferza
    A buffer data structure for HTTP/2 data that allows iteraton in terms of
    H2 frames.
    FÚserverÚboolÚreturnÚNonec                ó�   — t          ¦   «         | _        d| _        |rdnd| _        t	          | j        ¦  «        | _        g | _        d S )Nr   s   PRI * HTTP/2.0

SM

ó    )Ú	bytearrayÚ_dataÚmax_frame_sizeÚ	_preambleÚlenÚ_preamble_lenÚ_headers_buffer)Úselfr   s     úS/home/div/.hermes/hermes-agent/venv/lib/python3.11/site-packages/h2/frame_buffer.pyÚ__init__zFrameBuffer.__init__    sG   € Ý‘[”[ˆŒ
ØˆÔØ@FÐOÐ<Ð<ÈCˆŒÝ  ¤Ñ0Ô0ˆÔØZ\ˆÔÐÐr   ÚdataÚbytesc                ó0  — | j         r~t          |¦  «        }t          | j         |¦  «        }| j        d|…         |d|…         k    rd}t	          |¦  «        ‚||d…         }| xj         |z  c_         | j        |d…         | _        | xj        |z  c_        dS )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   r!   Údata_lenÚof_which_preambleÚmsgs        r   Úadd_datazFrameBuffer.add_data'   sµ   € ð Ôð 
	@Ý˜4‘y”yˆHÝ # DÔ$6¸Ñ AÔ AÐàŒ~Ð0Ð0Ð0Ô1°TÐ:LÐ;LÐ:LÔ5MÒMÐMØ0�Ý# CÑ(Ô(Ð(àÐ)Ð*Ð*Ô+ˆDØÐÔÐ"3Ñ3ÐÔØ!œ^Ð,=Ð,>Ð,>Ô?ˆDŒNàˆ
Œ
�dÑˆ
Œ
ˆ
ˆ
r   ÚlengthÚintc                óT   — || j         k    rd|› d| j         › �}t          |¦  «        ‚dS )zB
        Confirm that the frame is an appropriate length.
        z Received overlong frame: length z, max N)r   r   )r   r)   r'   s      r   Ú_validate_frame_lengthz"FrameBuffer._validate_frame_length;   s@   € ð �DÔ'Ò'Ð'ØX°VÐXÐXÀ4ÔCVÐXÐXˆCÝ$ SÑ)Ô)Ð)ð (Ð'r   ÚfúFrame | Nonec                ó°  — | j         �r| j         d         j        }|duot          |t          ¦  «        o
|j        |k    }|sd}t	          |¦  «        ‚t          |t          ¦  «        sJ ‚| j                              |¦  «         t          | j         ¦  «        t          k    rd}t	          |¦  «        ‚d|j        v rX| j         d         }|j         	                    d¦  «         d 
                    d„ | j         D ¦   «         ¦  «        |_        g | _         nDd}nAt          |t          t          f¦  «        r%d|j        vr| 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  ó$   K  — | ]}|j         V — Œd S ©N)r!   )Ú.0Úxs     r   ú	<genexpr>z4FrameBuffer._update_header_buffer.<locals>.<genexpr>f   s$   è è € Ð!GÐ!G¨Q !¤&Ð!GÐ!GÐ!GÐ!GÐ!GÐ!Gr   )r   Ú	stream_idÚ
isinstancer   r   Úappendr   ÚCONTINUATION_BACKLOGÚflagsÚaddÚjoinr!   r   r	   )r   r-   r6   Úvalid_framer'   s        r   Ú_update_header_bufferz!FrameBuffer._update_header_bufferC   ss  € ð Ôñ "	ØÔ,¨QÔ/Ô9ˆIà˜�ð )Ý˜1Õ/Ñ0Ô0ð)à”˜yÒ(ð ð
 ð )Ø:�Ý# CÑ(Ô(Ð(Ý˜aÕ!2Ñ3Ô3Ð3Ð3Ð3ð Ô ×'Ò'¨Ñ*Ô*Ð*Ý�4Ô'Ñ(Ô(Õ+?Ò?Ð?Ø>�Ý# CÑ(Ô(Ð(ð  ¤Ð'Ð'ØÔ(¨Ô+�Ø”—’˜MÑ*Ô*Ð*ØŸšÐ!GÐ!G°$Ô2FÐ!GÑ!GÔ!GÑGÔG�”Ø')�Ô$Ð$à��Ý˜�\Õ+;Ð<Ñ=Ô=ð 	Ø Q¤WÐ,Ð,ð Ô ×'Ò'¨Ñ*Ô*Ð*ØˆAàˆr   c                ó   — | S r2   © )r   s    r   Ú__iter__zFrameBuffer.__iter__t   s   € Øˆr   r   c                óæ  — t          | j        ¦  «        dk     rt          ‚	 t          j        t          | j        d d…         ¦  «        ¦  «        \  }}n.# t          t          f$ r}d|›�}t          |¦  «        |‚d }~ww xY wt          | j        ¦  «        |dz   k     rt          ‚|  	                    |¦  «         	 | 
                    t          | j        dd|z   …         ¦  «        ¦  «         nC# t          $ r}d}t          |¦  «        |‚d }~wt          $ r}d}t          |¦  «        |‚d }~ww xY w| j        d|z   d …         | _        |                      |¦  «        }|�|n|                      ¦   «         S )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   r>   Ú__next__)r   r-   r)   Úerrr'   Ú	new_frames         r   rH   zFrameBuffer.__next__w   s—  € õ ˆtŒz‰?Œ?˜QÒÐÝÐð	.ÝÔ0µ¸D¼JÀrÈÀr¼NÑ1KÔ1KÑLÔL‰IˆAˆvˆvøÝ Õ"3Ð4ð 	.ð 	.ð 	.Ø@¸Ð@Ð@ˆCÝ Ñ$Ô$¨#Ð-øøøøð	.øøøõ ˆtŒz‰?Œ?˜V a™ZÒ'Ð'ÝÐð 	×#Ò# FÑ+Ô+Ð+ð	6Ø�LŠL� D¤J¨q°°6±¨zÔ$:Ñ;Ô;Ñ<Ô<Ð<Ð<øÝð 	.ð 	.ð 	.Ø:ˆCÝ Ñ$Ô$¨#Ð-øøøøÝ ð 	6ð 	6ð 	6Ø1ˆCÝ'¨Ñ,Ô,°#Ð5øøøøð	6øøøð ”Z  &¡ 	 	Ô*ˆŒ
ð ×.Ò.¨qÑ1Ô1ˆ	ð &Ð1ˆyˆy°t·}²}±´ÐFs;   ¡1A ÁA>Á$A9Á9A>Â92C, Ã,
D,Ã6DÄD,ÄD'Ä'D,N)F)r   r   r   r   )r!   r"   r   r   )r)   r*   r   r   )r-   r.   r   r.   )r   r   )r   r   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r(   r,   r>   rA   rH   r@   r   r   r   r      s§   € € € € € ðð ð
]ð ]ð ]ð ]ð ]ðð ð ð ð(*ð *ð *ð *ð.ð .ð .ð .ðbð ð ð ð*Gð *Gð *Gð *Gð *Gð *Gr   r   N)rN   Ú
__future__r   Úhyperframe.exceptionsr   r   Úhyperframe.framer   r   r   r	   Ú
exceptionsr   r   r   r9   r   r@   r   r   ú<module>rS      sË   ððð ð #Ð "Ð "Ð "Ð "Ð "à EÐ EÐ EÐ EÐ EÐ EÐ EÐ EØ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ Uà PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ Pð Ð ðGGð GGð GGð GGð GGñ GGô GGð GGð GGð GGr   