
    g&                         S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r
S SKr
S SKr
S SKJrJrJrJrJr   " S S\5      r " S S\5      r " S S\5      rg)	    N)QUIC_MAX_DATAGRAMAsyncQuicConnectionAsyncQuicManagerBaseQuicStreamUnexpectedEOFc                   f   ^  \ rS rSrU 4S jrS rS rS rSS jrSS jr	S r
S	 rS
 rS rSrU =r$ )AsyncioQuicStream   c                 X   > [         TU ]  X5        [        R                  " 5       U l        g N)super__init__asyncio	Condition_wake_up)self
connection	stream_id	__class__s      J/home/matz/Project1/venv/lib/python3.13/site-packages/dns/quic/_asyncio.pyr   AsyncioQuicStream.__init__   s     /))+    c                    #    U R                    IS h  vN   U R                   R                  5       I S h  vN   S S S 5      IS h  vN   g  N7 N N	! , IS h  vN  (       d  f       g = f7fr   )r   waitr   s    r   _wait_for_wake_up#AsyncioQuicStream._wait_for_wake_up   s;     ===--$$&&& !==& !===sS   A+AA+AAAA+AA+AA+A(AA($A+c                 >  #     U R                  U5      nU R                  R                  U5      (       a  g Xl         [        R
                  " U R                  5       U5      I S h  vN   SU l        Mo   N! [         a    [        R                  R                  ef = f7f)Nr   )_timeout_from_expiration_bufferhave
_expectingr   wait_forr   TimeoutErrordns	exceptionTimeout)r   amount
expirationtimeouts       r   r#   AsyncioQuicStream.wait_for"   s     33J?G||  (($O,&&t'='='?III  DO  J ,mm+++,s.   :B(A5 %A3&A5 *	B3A5 5%BBc                 "  #     U R                  U5      nU R                  R                  5       (       a  g  [        R                  " U R                  5       U5      I S h  vN   Ma   N! [         a    [        R                  R                  ef = f7fr   )
r   r    seen_endr   r#   r   r$   r%   r&   r'   )r   r)   r*   s      r   wait_for_endAsyncioQuicStream.wait_for_end.   s{     33J?G||$$&&,&&t'='='?III 
 J ,mm+++,s.   3B(A' A%A' #B%A' '%BBc                   #    U R                  U5      nU R                  R                  5       (       a3  U R                  U5      I S h  vN   U R                  R                  5       $ U R                  SU5      I S h  vN   [        R                  " SU R                  R                  S5      5      u  nU R                  X25      I S h  vN   U R                  R                  U5      $  N Nl N#7f)N   z!H)
_expiration_from_timeout_connectionis_h3r.   r    get_allr#   structunpackget)r   r*   r)   sizes       r   receiveAsyncioQuicStream.receive8   s     227;
!!####J///<<''))--:...mmD$,,*:*:1*=>GT--111<<##D)) 0 /1s7   AC,C&3C,;C(<A
C,C* C,(C,*C,c                    #    U R                  U5      nU R                  R                  U R                  X25      I S h  vN   g  N7fr   )_encapsulater3   write
_stream_id)r   datagramis_enddatas       r   sendAsyncioQuicStream.sendC   s5       *$$T__dCCCs   ;AAAc                    #    U R                  X5      (       a@  U R                   IS h  vN   U R                  R                  5         S S S 5      IS h  vN   g g  N0 N! , IS h  vN  (       d  f       g = f7fr   )_common_add_inputr   notify)r   rB   rA   s      r   
_add_inputAsyncioQuicStream._add_inputG   sF     !!$//}}}$$& %}} 0$}}}sD   'A8AA8AA8AA8A8A5$A'%A51A8c                 ,   #    U R                  5         g 7fr   )_closer   s    r   closeAsyncioQuicStream.closeL   s     s   c                    #    U $ 7fr    r   s    r   
__aenter__AsyncioQuicStream.__aenter__Q   
        c                    #    U R                  5       I S h  vN   U R                   IS h  vN   U R                  R                  5         S S S 5      IS h  vN   g ND N1 N	! , IS h  vN  (       d  f       g= f7fNF)rL   r   rG   )r   exc_typeexc_valexc_tbs       r   	__aexit__AsyncioQuicStream.__aexit__T   sH     jjl===MM  " != 	 ===sT   A;AA;AA;A!
A;AA;A;A;!A8'A*(A84A;)r"   r   r   F)__name__
__module____qualname____firstlineno__r   r   r#   r.   r:   rC   rH   rL   rP   rY   __static_attributes____classcell__r   s   @r   r	   r	      s;    ,'
 ,	*D'

 r   r	   c                   j   ^  \ rS rSrSU 4S jjrS rS rS rS rS r	SS jr
S	 rSS
 jrS rSrU =r$ )AsyncioQuicConnection[   c                    > [         TU ]  XX4XV5        S U l        [        R                  " 5       U l        [        R                  " 5       U l        [        R                  " 5       U l        S U l	        S U l
        SU l        g rU   )r   r   _socketr   Event_handshake_complete_socket_createdr   _wake_timer_receiver_task_sender_task_wake_pending)r   r   addressportsourcesource_portmanagerr   s          r   r   AsyncioQuicConnection.__init__\   s`    dKQ#*==? &}}",,." "r   c           	        #     [         R                  R                  U R                  5      n[         R                  R                  S5      nUR                  U[        R                  SU R                  U R                  S   U R                  S   45      I S h  vN U l        U R                  R                  5         U R                   IS h  vN   U R                  (       d  U R                  R                  [         S 5      I S h  vN u  p4US   U R                  S   :w  d  US   U R                  S   :w  a  Mi  U R"                  R%                  X4[&        R&                  " 5       5        U R)                  5       I S h  vN   U R                  (       d  M  S S S 5      IS h  vN   SU l        U R)                  5       I S h  vN   U R,                  R                  5         g  GNF GN N Ni NH! , IS h  vN  (       d  f       N]= f! [*         a     Nlf = f NU! SU l        U R)                  5       I S h  vN    U R,                  R                  5         f = f7f)Nr   r      T)r%   inetaf_for_address_addressasyncbackendget_backendmake_socketsocket
SOCK_DGRAM_source_peerrg   rj   set_donerecvfromr   r3   receive_datagramtime_wakeup	Exceptionri   )r   afbackendr@   ro   s        r   	_receiverAsyncioQuicConnection._receiverf   s    	+((7B&&229=G ")!4!4F%%q$,,A

ST8V" DL   $$&|||**040E0E)41 +'X qzTZZ]2gajDJJqM6Q $$55hU ,,.(( *** $| DJ,,.  $$((*) $+ ) $|||  		 ! DJ,,.  $$((*s   IBH G3H G!H 5G*G$A6G*<G&=G*H G( H $I>H?IH !H $G*&G*(H *H0G31H=H  H H 
HH HH II1H42 IIc                    #    SU l         U R                   IS h  vN   U R                  R                  5         S S S 5      IS h  vN   g  N/ N! , IS h  vN  (       d  f       g = f7f)NT)rn   rk   
notify_allr   s    r   r   AsyncioQuicConnection._wakeup   s?     !###'') $#####sC   A(A
A(AA(AA(A(A%AA%!A(c                 
  #    U R                    IS h  vN   U R                  (       d"  U R                   R                  5       I S h  vN   S S S 5      IS h  vN   SU l        g  NO N N! , IS h  vN  (       d  f       N%= f7frU   )rk   rn   r   r   s    r   _wait_for_wake_timer*AsyncioQuicConnection._wait_for_wake_timer   sZ     ###%%&&++--- $# # $- $###sV   BA#B/A)A%A)BA'B%A)'B)B /A20B <Bc                   #    U R                   R                  5       I S h  vN   U R                  (       d  U R                  R	                  [
        R
                  " 5       5      nU HD  u  p#X0R                  :X  d   eU R                  R                  X R                  S 5      I S h  vN   MF     U R                  5       u  pE [        R                  " U R                  5       U5      I S h  vN   U R                  U5        U R                  5       I S h  vN   U R                  (       d  M  g g  GN N NG! [         a     NQf = f N07fr   )rj   r   r   r3   datagrams_to_sendr   r   rg   sendto_get_timer_valuesr   r#   r   r   _handle_timer_handle_events)r   	datagramsr@   ro   r)   intervals         r   _senderAsyncioQuicConnection._sender   s    ""'')))**((::499;GI%.!**,,,ll))(JJEEE &/ &*%;%;%="Z&&t'@'@'BHMMM z*%%''' *** 	*
 F N  (sj   ED,BE%D/&E(D3 )D1*D3 .$EEE*E/E1D3 3
E =E?E  Ec                 V  #    Sn U R                   R                  5       nUc  g [        U[        R                  R
                  R                  5      (       Ga  U R                  5       (       Ga  U R                  R                  U5      nU GHd  n[        U[        R                  R
                  R                  5      (       a  U R                  R                  UR                  5      nU(       al  UR                  c  UR                   Ul        OUR"                  c  UR                   Ul        UR$                  (       a  UR'                  SS5      I S h  vN   M  M  M  [        U[        R                  R
                  R(                  5      (       d  GM  U R                  R                  UR                  5      nU(       d  GM6  UR'                  UR*                  UR$                  5      I S h  vN   GMg     GOxU R                  R                  UR                  5      nU(       a.  UR'                  UR*                  UR,                  5      I S h  vN   GO[        U[        R                  R
                  R.                  5      (       a  U R0                  R3                  5         O[        U[        R                  R
                  R4                  5      (       a"  SU l        U R8                  R;                  5         Oy[        U[        R                  R
                  R<                  5      (       aF  U R                  R                  UR                  5      nU(       a  UR'                  SS5      I S h  vN   US-  nUS:  a   Sn[>        R@                  " S5      I S h  vN   GM   GNK GN GNW N; N7f)Nr   Tr   rv   
   )!r3   
next_event
isinstanceaioquicquiceventsStreamDataReceivedr4   _h3_connhandle_eventh3HeadersReceived_streamsr8   r   _headersheaders	_trailersstream_endedrH   DataReceivedrB   
end_streamHandshakeCompletedri   r   ConnectionTerminatedr   rl   cancelStreamResetr   sleep)r   countevent	h3_eventsh3_eventstreams         r   r   $AsyncioQuicConnection._handle_events   s    $$//1E}%!4!4!G!GHH::<< $ : :5 AI$-%h

0A0A0Q0QRR%)]]%6%6u%GF%#)??#:6>6F6FFO%+%5%5%=7?7G7GF$4#+#8#8*0*;*;C*F$F$F $9  & ('**2C2C2P2PQQ%)]]%6%6u%GF%v&,&7&7$,MM83H3H'" !" !" %." "]]..u?F$//

E<L<LMMME7<<#6#6#I#IJJ((,,.E7<<#6#6#K#KLL!
##**,E7<<#6#6#B#BCC**5??; ++C666QJErzmmA&&&S   %G!" N 7 'sh   EN)N;N)*N))N)*N+A N)N"DN))N%**N)N'N)N)"N)%N)'N)c                 x   #    U R                   R                  XU5        U R                  5       I S h  vN   g  N7fr   )r3   send_stream_datar   )r   r   rB   rA   s       r   r>   AsyncioQuicConnection.write   s*     ))&?llns   0:8:c                     U R                   (       a  g [        R                  " U R                  5       5      U l        [        R                  " U R                  5       5      U l        g r   )_closedr   Taskr   rl   r   rm   r   s    r   runAsyncioQuicConnection.run   s;    <<%ll4>>+;<#LL8r   c                 h  #     [         R                  " U R                  R                  5       U5      I S h  vN   U R                  (       a  [        eU R                  R                  S5      n[        X5      nX0R                  U'   U$  NQ! [         a    [
        R                  R                  ef = f7frU   )r   r#   ri   r   r$   r%   r&   r'   r   r   r3   get_next_available_stream_idr	   r   )r   r*   r   r   s       r   make_stream!AsyncioQuicConnection.make_stream   s     	(""4#;#;#@#@#BGLLL ::$$AA%H	"43#)i  M 	(--'''	(s,   B22B
 BB
 AB2B
 
%B//B2c                 R  #    U R                   (       d  U R                  R                  U R                  S   U R                  S   5        SU l         U R                  R                  5         U R                  R                  5         U R                  5       I S h  vN    U R                  I S h  vN    U R                  I S h  vN   U R                  R                  5       I S h  vN   g g  NR N?! [        R                   a     NSf = f NF! [        R                   a     NZf = f N@7f)Nr   rv   T)r   _managerclosedr   r3   rL   rj   r   r   rl   r   CancelledErrorrm   rg   r   s    r   rL   AsyncioQuicConnection.close   s     ||MM  A

1>DL""$  $$&,,.  ))))'''' ,,$$&&&  !)))  ()) &s   BD'C+D'C/ -C-.C/ 3D D	D D'$D%%D'-C/ /DD'DD'	D D"D'!D""D')	r   r   ri   rl   rm   rg   rj   rn   rk   r   r[   )r\   r]   r^   r_   r   r   r   r   r   r   r>   r   r   rL   r`   ra   rb   s   @r   rd   rd   [   s;    #+8*
#(+'Z9
' 'r   rd   c                   `   ^  \ rS rSrS\R
                  SS4U 4S jjr S	S jrS rS r	Sr
U =r$ )
AsyncioQuicManager   NFc                 0   > [         TU ]  X[        X45        g r   )r   r   rd   )r   confverify_modeserver_namer   r   s        r   r   AsyncioQuicManager.__init__   s     	,A;Sr   c                 ^    U R                  XX4U5      u  pgU(       a  UR                  5         U$ r   )_connectr   )r   ro   rp   rq   rr   want_session_ticketr   starts           r   connectAsyncioQuicManager.connect   s2     #mm60C
 NNr   c                    #    U $ 7fr   rO   r   s    r   rP   AsyncioQuicManager.__aenter__  rR   rS   c                    #    [        U R                  R                  5       5      nU H  nUR                  5       I S h  vN   M     g N	7frU   )list_connectionsvaluesrL   )r   rV   rW   rX   connectionsr   s         r   rY   AsyncioQuicManager.__aexit__  sD      4,,3356%J""$$$ & %s   <A
A
A
rO   )iU  Nr   T)r\   r]   r^   r_   sslCERT_REQUIREDr   r   rP   rY   r`   ra   rb   s   @r   r   r      s3    S%6%6DUT RV r   r   )r   r}   r   r6   r   aioquic.quic.configurationr   aioquic.quic.connectionaioquic.quic.eventsdns.asyncbackendr%   dns.exceptiondns.inetdns.quic._commonr   r   r   r   r   r	   rd   r   rO   r   r   <module>r      s\      
   !      ? ?DT'/ T'n) r   