§
    îŽ’jô  ã                  óŒ   — d Z ddlm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 erddl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)ÚTYPE_CHECKING)ÚInvalidDataErrorÚInvalidFrameError)ÚContinuationFrameÚFrameÚHeadersFrameÚPushPromiseFrameé   )ÚFrameDataMissingErrorÚFrameTooLargeErrorÚProtocolError)ÚBufferé@   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 )ÚFrameBufferzb
    A buffer data structure for HTTP/2 data that allows iteration in terms of
    H2 frames.
    FÚserverÚboolÚreturnÚNonec                ó�   — 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   s     ú=C:\Projects\DSCons\.venv\Lib\site-packages\h2\frame_buffer.pyÚ__init__zFrameBuffer.__init__%   sG   € Ý‘[”[ˆŒ
ØˆÔØ@FÐOÐ<Ð<ÈCˆŒÝ  ¤Ñ0Ô0ˆÔØZ\ˆÔÐÐr   Údatar   c                óN  — t          |¦  «        }| 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.)Ú
memoryviewr   r   Úminr   r   r   )r    r#   Ú	data_viewÚdata_lenÚof_which_preambleÚmsgs         r!   Úadd_datazFrameBuffer.add_data,   sÂ   € õ ˜tÑ$Ô$ˆ	àÔð 
	@Ý˜9‘~”~ˆHÝ # DÔ$6¸Ñ AÔ AÐàŒ~Ð0Ð0Ð0Ô1°YÐ?QÐ@QÐ?QÔ5RÒRÐRØ0�Ý# CÑ(Ô(Ð(à!Ð"3Ð"4Ð"4Ô5ˆIØÐÔÐ"3Ñ3ÐÔØ!œ^Ð,=Ð,>Ð,>Ô?ˆDŒNàˆ
Œ
�iÑˆ
Œ
ˆ
ˆ
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_lengthB   s@   € ð �DÔ'Ò'Ð'ØX°VÐXÐXÀ4ÔCVÐXÐXˆCÝ$ 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>m   s$   è è € Ð!GÐ!G¨Q !¤&Ð!GÐ!GÐ!GÐ!GÐ!GÐ!Gr   )r   Ú	stream_idÚ
isinstancer   r   Úappendr   ÚCONTINUATION_BACKLOGÚflagsÚaddÚjoinr#   r	   r
   )r    r0   r9   Úvalid_framer*   s        r!   Ú_update_header_bufferz!FrameBuffer._update_header_bufferJ   ss  € ð Ôñ "	ØÔ,¨QÔ/Ô9ˆIà˜�ð )Ý˜1Õ/Ñ0Ô0ð)à”˜yÒ(ð ð
 ð )Ø:�Ý# CÑ(Ô(Ð(Ý˜aÕ!2Ñ3Ô3Ð3Ð3Ð3ð Ô ×'Ò'¨Ñ*Ô*Ð*Ý�4Ô'Ñ(Ô(Õ+?Ò?Ð?Ø>�Ý# CÑ(Ô(Ð(ð  ¤Ð'Ð'ØÔ(¨Ô+�Ø”—’˜MÑ*Ô*Ð*ØŸšÐ!GÐ!G°$Ô2FÐ!GÑ!GÔ!GÑGÔG�”Ø')�Ô$Ð$à��Ý˜�\Õ+;Ð<Ñ=Ô=ð 	Ø Q¤WÐ,Ð,ð Ô ×'Ò'¨Ñ*Ô*Ð*ØˆAàˆr   c                ó   — | S r5   © )r    s    r!   Ú__iter__zFrameBuffer.__iter__{   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 d|z   …= |                      |¦  «        }|�|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_headerr%   r   r   r   r/   Ú
parse_bodyr   rA   Ú__next__)r    r0   r,   Úerrr*   Ú	new_frames         r!   rJ   zFrameBuffer.__next__~   s“  € õ ˆtŒz‰?Œ?˜QÒÐÝÐð	.ÝÔ0µ¸D¼JÀrÈÀr¼NÑ1KÔ1KÑLÔL‰IˆAˆvˆvøÝ Õ"3Ð4ð 	.ð 	.ð 	.Ø@¸Ð@Ð@ˆCÝ Ñ$Ô$¨#Ð-øøøøð	.øøøõ ˆtŒz‰?Œ?˜V a™ZÒ'Ð'ÝÐð 	×#Ò# FÑ+Ô+Ð+ð	6Ø�LŠL� D¤J¨q°°6±¨zÔ$:Ñ;Ô;Ñ<Ô<Ð<Ð<øÝð 	.ð 	.ð 	.Ø:ˆCÝ Ñ$Ô$¨#Ð-øøøøÝ ð 	6ð 	6ð 	6Ø1ˆCÝ'¨Ñ,Ô,°#Ð5øøøøð	6øøøð ŒJ�y˜˜&™�yÐ!ð ×.Ò.¨qÑ1Ô1ˆ	ð &Ð1ˆyˆy°t·}²}±´Ð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   )r0   r1   r   r1   )r   r   )r   r   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   r+   r/   rA   rD   rJ   rC   r   r!   r   r      s§   € € € € € ðð ð
]ð ]ð ]ð ]ð ]ð ð  ð  ð  ð,*ð *ð *ð *ð.ð .ð .ð .ðbð ð ð ð1Gð 1Gð 1Gð 1Gð 1Gð 1Gr   r   N)rP   Ú
__future__r   Útypingr   Úhyperframe.exceptionsr   r   Úhyperframe.framer   r   r	   r
   Ú
exceptionsr   r   r   Ú_typingr   r<   r   rC   r   r!   ú<module>rW      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àð  ØÐÐÐÐÐð Ð ðPGð PGð PGð PGð PGñ PGô PGð PGð PGð PGr   