o
    hs                     @   sT   d Z ddl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eZd	S )
zy
h2/frame_buffer
~~~~~~~~~~~~~~~

A data structure that provides a way to iterate over a byte buffer in terms of
frames.
    )InvalidFrameError)FrameHeadersFrameContinuationFramePushPromiseFrame   )ProtocolErrorFrameTooLargeErrorFrameDataMissingError@   c                   @   sR   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d Z
dd ZdS )FrameBufferz
    This is a data structure that expects to act as a buffer for HTTP/2 data
    that allows iteraton in terms of H2 frames.
    Fc                 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)selfserver r   W/var/www/html/magazine_api/magazine_env/lib/python3.10/site-packages/h2/frame_buffer.py__init__"   s
   
zFrameBuffer.__init__c                 C   sx   | j r3t|}t| j |}| jd| |d| krtd||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   Zdata_lenZof_which_preambler   r   r   add_data)   s   zFrameBuffer.add_datac              
   C   sJ   zt |dd \}}W ||fS  ty$ } ztdt| d}~ww )z
        Parses the frame header from the data. Either returns a tuple of
        (frame, length), or throws an exception. The returned frame may be None
        if the frame is of unknown type.
        N	   z!Invalid frame header received: %s)r   Zparse_frame_header
ValueErrorr   str)r   r   framelengther   r   r   _parse_frame_header<   s   zFrameBuffer._parse_frame_headerc                 C   s    || j krtd|| j f dS )zB
        Confirm that the frame is an appropriate length.
        z*Received overlong frame: length %d, max %dN)r   r	   )r   r   r   r   r   _validate_frame_lengthJ   s   
z"FrameBuffer._validate_frame_lengthc                 C   s   | j rS| j d j}|duot|to|j|k}|std| j | t| j tkr.tdd|jv rO| j d }|j	d d
dd | j D |_g | _ |S d}|S t|ttfrgd|jvrg| 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.ZEND_HEADERSr   c                 s   s    | ]}|j V  qd S N)r   ).0xr   r   r   	<genexpr>t   s    z4FrameBuffer._update_header_buffer.<locals>.<genexpr>)r   	stream_id
isinstancer   r   appendr   CONTINUATION_BACKLOGflagsaddjoinr   r   r   )r   fr'   Zvalid_framer   r   r   _update_header_bufferT   s2   




z!FrameBuffer._update_header_bufferc                 C   s   | S r#   r   r   r   r   r   __iter__   s   zFrameBuffer.__iter__c                 C   s   t | jdk r
t z
| | j\}}W n ty   tdw t | j|d k r,t | | |d urQz|t| jdd|   W n tyP   t	dw | jd| d  | _| 
|}|d urf|S |  S )Nr   z)Received frame with invalid frame header.zFrame data missing or invalid)r   r   StopIterationr!   r   r   r"   Z
parse_body
memoryviewr
   r/   next)r   r.   r   r   r   r   r4      s&   
 
zFrameBuffer.nextc                 C   s   |   S r#   )r4   r0   r   r   r   __next__   s   zFrameBuffer.__next__N)F)__name__
__module____qualname____doc__r   r   r!   r"   r/   r1   r4   r5   r   r   r   r   r      s    

.)r   N)r9   Zhyperframe.exceptionsr   Zhyperframe.framer   r   r   r   
exceptionsr   r	   r
   r*   objectr   r   r   r   r   <module>   s   