
    @OOf.                         d dl mZ ddlmZ ddlmZmZmZmZ ddl	m
Z
 ddlmZ  G d de      Z G d	 d
e      Z G d d      Z G d d      Z G d d      Zy)    )Optional   )events)QuicErrorCodeQuicResetStreamFrameQuicStopSendingFrameQuicStreamFrame)QuicDeliveryState)RangeSetc                       e Zd Zy)FinalSizeErrorN__name__
__module____qualname__     T/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/aioquic/quic/stream.pyr   r          r   r   c                       e Zd Zy)StreamFinishedErrorNr   r   r   r   r   r      r   r   r   c                       e Zd ZdZdee   deddfdZdefdZ	de
deej                     fd	Zej                  d
dededeej                      fdZdeddfdZej                  fdeddfdZdefdZy)QuicStreamReceiverz
    The receive part of a QUIC stream.

    It finishes:
    - immediately for a send-only stream
    - upon reception of a STREAM_RESET frame
    - upon reception of a data frame with the FIN bit set
    	stream_idreadablereturnNc                     d| _         d| _        d| _        t               | _        d| _        d | _        t               | _        || _	        d | _
        y )Nr   F)highest_offsetis_finishedstop_pending	bytearray_buffer_buffer_start_final_sizer   _ranges
_stream_id_stop_error_code)selfr   r   s      r   __init__zQuicStreamReceiver.__init__    sK     ! {*.z#/3r   c                 R    d| _         t        | j                  | j                        S )NF
error_coder   )r    r   r'   r&   r(   s    r   get_stop_framez!QuicStreamReceiver.get_stop_frame,   s'    !#,,oo
 	
r   framec                    |j                   | j                  z
  }t        |j                        }|j                   |z   }| j                  @|| j                  kD  rt        d      |j                  r|| j                  k7  rt        d      |j                  r|| _        || j                  kD  r|| _        |dk(  rl|rj| j                  s^| xj                  |z  c_        |j                  rd| _	        t        j                  |j                  |j                  | j                        S |dk  rA|j                  | d |_        |xj                   |z  c_         d}t        |j                        }||j                   kD  r&| j                  j                  |j                   |       |t        | j                        z
  }|dkD  r| xj                  t        |      z  c_        |j                  | j                  |||z    | j!                         }| j                  | j                  k(  }|rd| _	        |s|r"t        j                  ||| j                        S y)z2
        Handle a frame of received data.
        NzData received beyond final sizeCannot change final sizer   T)data
end_streamr   )offsetr#   lenr2   r$   r   finr   r"   r   r   StreamDataReceivedr&   r%   addr!   
_pull_data)r(   r/   poscount	frame_endgapr2   r3   s           r   handle_framezQuicStreamReceiver.handle_frame3   s    llT///EJJLL5(	 '4+++$%FGGyD,<,<<$%?@@99(Dt***"+D !8dll%'yy#' ,,ZZEII 
 7SDE*EJLLCLC

OE u||#LLU\\95 C%%7LLIcN*L*/**S3;'  ''4+;+;;
#D:,,jDOO  r   )r,   
final_sizer,   c                    | j                   || j                   k7  rt        d      || _         d| _        t        j                  || j
                        S )zX
        Handle an abrupt termination of the receiving part of the QUIC stream.
        r1   Tr+   )r$   r   r   r   StreamResetr&   )r(   r?   r,   s      r   handle_resetzQuicStreamReceiver.handle_resetp   sR     'J$:J:J,J !;<< &!!Z4??SSr   deliveryc                 :    |t         j                  k7  rd| _        yy)z8
        Callback when a STOP_SENDING is ACK'd.
        TN)r
   ACKEDr    r(   rC   s     r   on_stop_sending_deliveryz+QuicStreamReceiver.on_stop_sending_delivery~   s      (... $D /r   c                      || _         d| _        y)zH
        Request the peer stop sending data on the QUIC stream.
        TN)r'   r    r(   r,   s     r   stopzQuicStreamReceiver.stop   s     !+ r   c                 R   	 | j                   d   j                  | j                  k(  }|sy| j                   j	                         }|j
                  |j                  z
  }t        | j                  d|       }| j                  d|= |j
                  | _        |S # t        $ r d}Y }w xY w)z;
        Remove data from the front of the buffer.
        r   Fr   N)r%   startr#   
IndexErrorshiftrJ   bytesr"   )r(   has_data_to_readrr:   r2   s        r   r9   zQuicStreamReceiver._pull_data   s    	%#||A448J8JJ  LL ffqwwT\\$3'(LL#VV  	%$	%s   &B B&%B&)r   r   r   __doc__r   intboolr)   r   r.   r	   r   r7   r>   r   NO_ERRORrA   rB   r
   rG   rJ   rO   r9   r   r   r   r   r      s    
4(3- 
44 
4D 
4
 4 
;$;	&++	,;| 5B4J4JT T.1T	&$$	%T%1B %t % &3%;%; !s ! !E r   r   c            
           e Zd ZdZdee   deddfdZedefd       Z		 dded	ee   dee
   fd
ZdefdZdededededdf
dZdeddfdZdeddfdZddededdfdZy)QuicStreamSenderz
    The send part of a QUIC stream.

    It finishes:
    - immediately for a receive-only stream
    - upon acknowledgement of a STREAM_RESET frame
    - upon acknowledgement of a data frame with the FIN bit set
    r   writabler   Nc                     d| _         d| _        | | _        d| _        t	               | _        d| _        t               | _        d | _	        d| _
        d| _        t	               | _        d| _        d | _        || _        y )NTr   F)buffer_is_emptyr   r   reset_pendingr   _acked
_acked_finr!   r"   _buffer_finr#   _buffer_stop_pending_pending_eof_reset_error_coder&   )r(   r   rX   s      r   r)   zQuicStreamSender.__init__   su    #'<"j {*. 
!04#r   c                 l    	 | j                   d   j                  S # t        $ r | j                  cY S w xY w)z
        The offset for the next frame to send.

        This is used to determine the space needed for the frame's `offset` field.
        r   )r`   rL   rM   r_   r-   s    r   next_offsetzQuicStreamSender.next_offset   s7    	%==#))) 	%$$$	%s    33max_size
max_offsetc                 P   | j                   J d       	 | j                  d   }|j                  }t        |j                  ||z         }|||kD  r|}||k  ryt	        t        | j                  || j                  z
  || j                  z
         |      }| j                  j                  ||       || j                  kD  r|| _        | j
                  |k(  rd|_        d| _        |S # t        $ r6 | j                  r d| _        t	        d| j
                        cY S d| _        Y yw xY w)z.
        Get a frame of data to send.
        Nz%cannot call get_frame() after reset()r   FT)r6   r4   )r2   r4   )rb   r`   rM   ra   r	   r^   rZ   rL   minrJ   rO   r"   r#   subtractr   r6   )r(   re   rf   rQ   rL   rJ   r/   s          r   	get_framezQuicStreamSender.get_frame   s;    %%-V/VV-		a A 16658+,!dZ&7D5=  UT%7%77$ASAS:ST 	
 	ud+ $%%%"&D t#EI %DG  	  $)!&48H8HII#'D 	s   C& &3D%D%$D%c                 h    d| _         t        | j                  | j                  | j                        S )NF)r,   r?   r   )r[   r   rb   r   r&   r-   s    r   get_reset_framez QuicStreamSender.get_reset_frame   s0    "#--**oo
 	
r   rC   rL   rJ   r6   c                    |r|| j                   k(  sJ d       | j                  y|t        j                  k(  r||kD  r| j                  j                  ||       | j                  d   }|j                  | j                  k(  rW|j                  |j                  z
  }| j                  j                          | xj                  |z  c_        | j                  d|= |rd| _        | j                  | j                   k(  r| j                  rd| _        yyy||kD  r#d| _        | j                  j                  ||       |rd| _        d| _        yy)z3
        Callback when sent data is ACK'd.
        z;on_data_delivered() was called with inconsistent fin / stopNr   TF)r^   rb   r
   rE   r\   r8   rL   r#   rJ   rN   r"   r]   r   rZ   r`   ra   )r(   rC   rL   rJ   r6   first_rangesizes          r   on_data_deliveryz!QuicStreamSender.on_data_delivery   s9    tt///	IH	I/ !!-(...e|t,"kk!n$$(:(::&++k.?.??DKK%%'&&$.&UdU+"&!!T%5%55$//#'  ;J5 e|',$!!%.',$$(! r   c                 H    |t         j                  k(  rd| _        yd| _        y)z1
        Callback when a reset is ACK'd.
        TN)r
   rE   r   r[   rF   s     r   on_reset_deliveryz"QuicStreamSender.on_reset_delivery-  s%     (...#D "&Dr   r,   c                 T    | j                   J d       || _         d| _        d| _        y)zI
        Abruptly terminate the sending part of the QUIC stream.
        Nz"cannot call reset() more than onceT)rb   r[   rZ   rI   s     r   resetzQuicStreamSender.reset8  s6     %%-S/SS-!+!  $r   r2   r3   c                 v   | j                   J d       | j                  J d       t        |      }|rdd| _        | j                  j                  | j                  | j                  |z          | xj                  |z  c_        | xj                  |z  c_        |r d| _        | j                  | _         d| _        yy)z;
        Write some data bytes to the QUIC stream.
        Nzcannot call write() after FINz!cannot call write() after reset()FT)	r^   rb   r5   rZ   r`   r8   r_   r"   ra   )r(   r2   r3   ro   s       r   writezQuicStreamSender.writeC  s     'H)HH'%%-R/RR-4y#(D MMd//1B1BT1IJLLD L%#(D #00D $D r   N)F)r   r   r   rR   r   rS   rT   r)   propertyrd   r	   rj   r   rl   r
   rp   rr   rt   rO   rv   r   r   r   rW   rW      s    $(3- $4 $D $" 	%S 	% 	% :>..)1#.	/	".`
!5 
-))-)25-)=@-)GK-)	-)^	&*; 	& 	&	$ 	$ 	$%% %T %d %r   rW   c                   T    e Zd Z	 	 	 	 	 d
dee   dededededdfdZedefd	       Zy)
QuicStreamNr   max_stream_data_localmax_stream_data_remoter   rX   r   c                     d| _         || _        || _        || _        t	        ||      | _        t        ||      | _        || _        y )NF)r   r   )r   rX   )	
is_blockedr{   max_stream_data_local_sentr|   r   receiverrW   senderr   )r(   r   r{   r|   r   rX   s         r   r)   zQuicStream.__init__W  sF      %:"*?'&<#*YR&XN"r   c                 ^    | j                   j                  xr | j                  j                  S rw   )r   r   r   r-   s    r   r   zQuicStream.is_finishedg  s!    }}((DT[[-D-DDr   )Nr   r   TT)	r   r   r   r   rS   rT   r)   rx   r   r   r   r   rz   rz   V  st     $(%&&'#C=#  ## !$	#
 # # 
#  ET E Er   rz   N)typingr    r   packetr   r   r   r	   packet_builderr
   rangesetr   	Exceptionr   r   r   rW   rz   r   r   r   <module>r      s[       . 	Y 		) 	F FRt% t%nE Er   