o
    /h                     @  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  s0   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    r   H/var/www/html/govbot/env/lib/python3.10/site-packages/h2/frame_buffer.py__init__    s
   
zFrameBuffer.__init__r   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'   r.   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
   r6   __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&   r6   r7   r=   r   r   r   r   r      s    



1r   N)rC   
__future__r   hyperframe.exceptionsr   r   hyperframe.framer   r   r   r   
exceptionsr
   r   r   r1   r   r   r   r   r   <module>   s    
