
    ^i                    h    S r SSKJr  SSKJrJr  SSKJrJrJ	r	J
r
  SSKJrJrJr  Sr " S S	5      rg
)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                  X    \ rS rSrSrSSS jjrSS jrSS jrSS jrSS jr	SS jr
S	rg
)FrameBuffer   zU
A buffer data structure for HTTP/2 data that allows iteraton in terms of
H2 frames.
c                    [        5       U l        SU l        U(       a  SOSU l        [	        U R                  5      U l        / U l        g )Nr   s   PRI * HTTP/2.0

SM

    )	bytearray_datamax_frame_size	_preamblelen_preamble_len_headers_buffer)selfservers     I/home/james-whalen/.local/lib/python3.13/site-packages/h2/frame_buffer.py__init__FrameBuffer.__init__    s8    [
@F<C 0Z\r   c                2   U R                   (       aq  [        U5      n[        U R                   U5      nU R                  SU USU :w  a  Sn[	        U5      eXS nU =R                   U-  sl         U R                  US U l        U =R
                  U-  sl        g)z[
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   datadata_lenof_which_preamblemsgs        r   add_dataFrameBuffer.add_data'   s     4yH #D$6$6 A~~001T:L;L5MM0#C((*+D"33!^^,=,>?DN

d
r   c                \    XR                   :  a  SU SU R                    3n[        U5      eg)z2
Confirm that the frame is an appropriate length.
z Received overlong frame: length z, max N)r   r   )r   lengthr%   s      r   _validate_frame_length"FrameBuffer._validate_frame_length;   s9     '''4VHF4CVCVBWXC$S)) (r   c                   U R                   (       Ga)  U R                   S   R                  nUSL=(       a&    [        U[        5      =(       a    UR                  U:H  nU(       d  Sn[	        U5      e[        U[        5      (       d   eU R                   R                  U5        [        U R                   5      [        :  a  Sn[	        U5      eSUR                  ;   aZ  U R                   S   nUR                  R                  S5        SR                  S U R                    5       5      Ul        / U l         U$ Sn U$ [        U[        [        45      (       a-  SUR                  ;  a  U R                   R                  U5        SnU$ )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  8   #    U  H  oR                   v   M     g 7fN)r"   ).0xs     r   	<genexpr>4FrameBuffer._update_header_buffer.<locals>.<genexpr>f   s     !G2FQ&&2Fs   )r   	stream_id
isinstancer   r   appendr   CONTINUATION_BACKLOGflagsaddjoinr"   r   r	   )r   fr4   valid_framer%   s        r   _update_header_buffer!FrameBuffer._update_header_bufferC   s^    ,,Q/99I )1/0)y( 
 :#C((a!23333   ''*4''(+??>#C(( '((+M*!G$2F2F!GG')$    \+;<==QWW,   ''*Ar   c                    U $ r/    )r   s    r   __iter__FrameBuffer.__iter__t   s    r   c                   [        U R                  5      S:  a  [        e [        R                  " [        U R                  S S 5      5      u  p[        U R                  5      US-   :  a  [        eU R                  U5         UR                  [        U R                  SSU-    5      5        U R                  SU-   S  U l        U R                  U5      nUb  U$ U R                  5       $ ! [        [        4 a  nSU< 3n[        U5      UeS nAff = f! [         a  nSn[        U5      UeS nAf[         a  nSn[        U5      UeS nAff = f)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   r=   __next__)r   r;   r)   errr%   	new_frames         r   rI   FrameBuffer.__next__w   sC    tzz?Q	.00DJJrN1KLIA tzz?VaZ' 	##F+	6LLDJJq6$:;< ZZ&	*
 ..q1	 &1yFt}}FE !"34 	.8@C$#-	.   	.:C$#-  	61C',#5	6s;   .C* *D *D:DD
ED,,E9EE)r   r   r   r   r   N)F)r   boolreturnNone)r"   bytesrN   rO   )r)   intrN   rO   )r;   Frame | NonerN   rR   )rN   r   )rN   r   )__name__
__module____qualname____firstlineno____doc__r   r&   r*   r=   rA   rI   __static_attributes__r@   r   r   r   r      s(    
](*.b*Gr   r   N)rW   
__future__r   hyperframe.exceptionsr   r   hyperframe.framer   r   r   r	   
exceptionsr   r   r   r7   r   r@   r   r   <module>r]      s4    # E U U P P  GG GGr   