
    %g                    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                    SU l         SU l        U(       a  SOSU l        [        U R                  5      U l        / U l        g )N    r   s   PRI * HTTP/2.0

SM

)datamax_frame_size	_preamblelen_preamble_len_headers_buffer)selfservers     1/usr/lib/python3/dist-packages/h2/frame_buffer.py__init__FrameBuffer.__init__    s6    	@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   r   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		T	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   fr2   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   r9   r'   errr#   	new_frames         r   rG   FrameBuffer.__next__w   sC    tyy>A	.00DIIbqM1JKIA tyy>FQJ& 	##F+	6LLDIIa&$9:; IIahi(	 ..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   bytesrL   rM   )r'   intrL   rM   )r9   Frame | NonerL   rP   )rL   r   )rL   r   )__name__
__module____qualname____firstlineno____doc__r   r$   r(   r;   r?   rG   __static_attributes__r>   r   r   r   r      s(    
](*.b*Gr   r   N)rU   
__future__r   hyperframe.exceptionsr   r   hyperframe.framer   r   r   r	   
exceptionsr   r   r   r5   r   r>   r   r   <module>r[      s4    # E U U P P  GG GGr   