
    Wh                    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     U/var/www/html/movieo_spanner_bot/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      
	@4yyH #D$6 A A~0001T:L;L:L5MMM0#C((()**+D"33!^,=,>,>?DN

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'''XVXX4CVXXC$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!GQ!&!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/9I )1/00)y( 
  ):#C(((a!233333  ''***4'((+???>#C((( ''(+M***!G!G$2F!G!G!GGG')$$\+;<== 	QW,,  ''***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    tz??Q	.0DJrrN1K1KLLIAvv "34 	. 	. 	.@@@C$$#-	. tz??VaZ'' 	##F+++	6LLDJq6z$:;;<<<< 	. 	. 	.:C$$#-  	6 	6 	61C',,#5	6 Z&		*
 ..q11	 &1yyt}}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   