
    h                    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                x    d| _         d| _        |rdnd| _        t          | j                  | _        g | _        d S )N    r   s   PRI * HTTP/2.0

SM

)datamax_frame_size	_preamblelen_preamble_len_headers_buffer)selfr   s     S/var/www/html/e360mart/e360mart_env/lib/python3.11/site-packages/h2/frame_buffer.py__init__zFrameBuffer.__init__    sC    	@FO<<C 00Z\r   r   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		T				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+   r4   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 r0    )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   rF   zFrameBuffer.__next__w   s    ty>>A	.0DIbqbM1J1JKKIAvv "34 	. 	. 	.@@@C$$#-	. ty>>FQJ&& 	##F+++	6LLDIa&j$9::;;;; 	. 	. 	.:C$$#-  	6 	6 	61C',,#5	6 Iahii(	 ..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<   r?   rF   r>   r   r   r   r      s         
] ] ] ] ]   (* * * *. . . .b   *G *G *G *G *G *Gr   r   N)rL   
__future__r   hyperframe.exceptionsr   r   hyperframe.framer   r   r   r	   
exceptionsr   r   r   r7   r   r>   r   r   <module>rQ      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   