o
    }jh                     @  sb   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	 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                   @  sN   e Zd ZdZddddZdddZdddZdddZd ddZd!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                 C  s2   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    r   E/var/www/html/bot/env/lib/python3.10/site-packages/h2/frame_buffer.py__init__    s
   
zFrameBuffer.__init__databytesc                 C  s|   | j r5t|}t| j |}| jd| |d| kr d}t|||d }|  j |8  _ | j|d | _|  j|7  _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msgr   r   r   add_data'   s   zFrameBuffer.add_datalengthintc                 C  s(   || 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$   r   r   r   _validate_frame_length;   s   
z"FrameBuffer._validate_frame_lengthfFrame | Nonec                 C  s   | 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r9d}t|d|jv rZ| j d }|j	d d
dd | j D |_g | _ |S d}|S t|ttfrrd|jvrr| 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                 s  s    | ]}|j V  qd S N)r   ).0xr   r   r   	<genexpr>f   s    z4FrameBuffer._update_header_buffer.<locals>.<genexpr>)r   	stream_id
isinstancer   r   appendr   CONTINUATION_BACKLOGflagsaddjoinr   r   r   )r   r)   r0   valid_framer$   r   r   r   _update_header_bufferC   s8   




z!FrameBuffer._update_header_bufferc                 C  s   | S r,   r   )r   r   r   r   __iter__t   s   zFrameBuffer.__iter__r   c              
   C  s"  t | jdk r	tztt| jd d \}}W n ttfy1 } z
d|}t||d }~ww t | j|d k r=t| 	| z|
t| jdd|   W n% tye } zd}t||d }~w tyw } zd}t||d }~ww | jd| d  | _| |}|d ur|S |  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
   r8   __next__)r   r)   r&   errr$   	new_framer   r   r   r?   w   s4    


 


zFrameBuffer.__next__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(   r8   r9   r?   r   r   r   r   r      s    



1r   N)rE   
__future__r   hyperframe.exceptionsr   r   hyperframe.framer   r   r   r   
exceptionsr
   r   r   r3   r   r   r   r   r   <module>   s    
