o
    '=j™  ã                   @  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   úYC:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\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_lenZ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.Z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.   Zvalid_framer#   r   r   r   Ú_update_header_bufferC   s:   
ÿý


øùÿ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   Zparse_frame_headerÚ
memoryviewr   r   r   r'   Z
parse_bodyr
   r5   Ú__next__)r   r(   r%   Úerrr#   Z	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'   r5   r6   r:   r   r   r   r   r      s    



1r   N)r?   Ú
__future__r   Zhyperframe.exceptionsr   r   Zhyperframe.framer   r   r   r   Ú
exceptionsr
   r   r   r1   r   r   r   r   r   Ú<module>   s    
