
    dfC                         d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z
d dlZ
d dlZ
d dlmZmZmZmZmZ  G d de      Z G d de      Z G d de      Zy)	    N)QUIC_MAX_DATAGRAMAsyncQuicConnectionAsyncQuicManagerBaseQuicStreamUnexpectedEOFc                   R     e Zd Z fdZd Zd Zd
dZddZd Zd Z	d Z
d	 Z xZS )AsyncioQuicStreamc                 X    t         |   ||       t        j                         | _        y N)super__init__asyncio	Condition_wake_up)self
connection	stream_id	__class__s      J/home/api-vastappli/venv/lib/python3.12/site-packages/dns/quic/_asyncio.pyr   zAsyncioQuicStream.__init__   s"    Y/))+    c                    K   | j                   4 d {    | j                   j                          d {    d d d       d {    y 7 77 7 	# 1 d {  7  sw Y   y xY wwr   )r   waitr   s    r   _wait_for_wake_upz#AsyncioQuicStream._wait_for_wake_up   sV     == 	' 	'--$$&&&	' 	' 	'&	' 	' 	' 	'S   A&AA&AAAA&AA&AA&A#AA#A&c                 0  K   	 | j                  |      }| j                  j                  |      ry || _        	 t	        j
                  | j                         |       d {    d| _        i7 # t        $ r t        j                  j                  w xY wwNr   )_timeout_from_expiration_bufferhave
_expectingr   wait_forr   TimeoutErrordns	exceptionTimeout)r   amount
expirationtimeouts       r   r"   zAsyncioQuicStream.wait_for"   s     33J?G||  ($DO,&&t'='='?III  DO  J ,mm+++,s.   6B'A/  A-!A/ %B-A/ /$BBc                 4  K   | j                  |      }| j                  d|       d {    t        j                  d| j                  j                  d            \  }| j                  ||       d {    | j                  j                  |      S 7 j7 !w)N   z!H)_expiration_from_timeoutr"   structunpackr   get)r   r)   r(   sizes       r   receivezAsyncioQuicStream.receive.   s}     227;
mmAz***--dll&6&6q&9:mmD*---||%% 	+-s"   'BBA
B4B5 BBc                    K   | j                  |      }| j                  j                  | j                  ||       d {    y 7 wr   )_encapsulate_connectionwrite
_stream_id)r   datagramis_enddatas       r   sendzAsyncioQuicStream.send5   s8       *$$T__dFCCCs   <AAAc                    K   | j                  ||      r@| j                  4 d {    | j                  j                          d d d       d {    y y 7 07 # 1 d {  7  sw Y   y xY wwr   )_common_add_inputr   notify)r   r9   r8   s      r   
_add_inputzAsyncioQuicStream._add_input9   sf     !!$/}} ' '$$&' ' ' 0' ' ' ' 'sD   #A/AA/AA/AA/A/A, A#!A,(A/c                 ,   K   | j                          y wr   )_closer   s    r   closezAsyncioQuicStream.close>   s     s   c                    K   | S wr    r   s    r   
__aenter__zAsyncioQuicStream.__aenter__C           c                    K   | j                          d {    | j                  4 d {    | j                  j                          d d d       d {    y7 D7 17 	# 1 d {  7  sw Y   yxY wwNF)rA   r   r=   )r   exc_typeexc_valexc_tbs       r   	__aexit__zAsyncioQuicStream.__aexit__F   sg     jjl== 	# 	#MM  "	# 	# 		# 	# 	# 	# 	#sT   A6AA6AA6A!
A6AA6A6A6!A3'A*(A3/A6r   F)__name__
__module____qualname__r   r   r"   r1   r:   r>   rA   rD   rL   __classcell__r   s   @r   r	   r	      s1    ,'
 &D'

r   r	   c                   T     e Zd Zd
 fd	Zd Zd Zd Zd ZddZd Z	d
dZ
d	 Z xZS )AsyncioQuicConnectionc                     t         |   ||||||       d | _        t        j                         | _        t        j                         | _        t        j                         | _        d | _	        d | _
        y r   )r   r   _socketr   Event_handshake_complete_socket_createdr   _wake_timer_receiver_task_sender_task)r   r   addressportsourcesource_portmanagerr   s          r   r   zAsyncioQuicConnection.__init__N   s^    WdFKQ#*==? &}}",,." r   c           	        K   	 t         j                  j                  | j                        }t         j                  j                  d      }|j                  |t        j                  d| j                  | j                  d   | j                  d   f       d {   | _        | j                  j                          | j                  4 d {    | j                  s| j                  j                  t         d        d {   \  }}|d   | j                  d   k7  s|d   | j                  d   k7  rb| j"                  j%                  || j                  d   t'        j&                                | j(                  4 d {    | j(                  j+                          d d d       d {    | j                  sd d d       d {    d| _        | j(                  4 d {    | j(                  j+                          d d d       d {    | j.                  j                          y 7 7 c7 27 7 # 1 d {  7  sw Y   xY w7 # 1 d {  7  sw Y   xY w# t,        $ r Y w xY w7 7 i# 1 d {  7  sw Y   yxY w# d| _        | j(                  4 d {  7   | j(                  j+                          d d d       d {  7   n# 1 d {  7  sw Y   nxY w| j.                  j                          w xY ww)Nr   r      T)r$   inetaf_for_address_addressasyncbackendget_backendmake_socketsocket
SOCK_DGRAM_source_peerrV   rY   set_donerecvfromr   r4   receive_datagramtimerZ   
notify_all	ExceptionrX   )r   afbackendr7   r]   s        r   	_receiverzAsyncioQuicConnection._receiverW   s|    	+((7B&&229=G ")!4!4F%%q$,,A

ST8V" DL   $$&|| 6 6**040E0E)41 +'Xw qzTZZ]2gajDJJqM6Q $$55 $**Q-
  $// 6 6((3356 6 **6 6" DJ'' . .  ++-. .$$((*16+6 6 6 6 66 6 6 6  		. . . . . DJ'' . .  ++-. . . . .$$((*sn  L
BI% H,3I% H/I% 0I H2A>I?H5 IH9I)H7*I;I% II% L
"I4#L
&I8L
I6L
,I% /I% 2I5I7I9I	?I I	II% I"II"I% %	I1.J 0I11J 4L
6L
8J
>J?J
L
L%J(
&L*KLKLK)K K)%"LL
c                    K   | j                   4 d {    | j                   j                          d {    d d d       d {    y 7 77 7 	# 1 d {  7  sw Y   y xY wwr   )rZ   r   r   s    r   _wait_for_wake_timerz*AsyncioQuicConnection._wait_for_wake_timerw   sZ     ## 	* 	*""'')))	* 	* 	*)	* 	* 	* 	*r   c                 z  K   | j                   j                          d {    | j                  s| j                  j	                  t        j
                               }|D ]H  \  }}|| j                  d   k(  sJ | j                  j                  || j                  d        d {    J | j                         \  }}	 t        j                  | j                         |       d {    | j                  |       | j                          d {    | j                  sy y 7 7 7 A# t        $ r Y Jw xY w7 )wr   )rY   r   ro   r4   datagrams_to_sendrr   rm   rV   sendto_get_timer_valuesr   r"   ry   rt   _handle_timer_handle_events)r   	datagramsr7   r]   r(   intervals         r   _senderzAsyncioQuicConnection._sender{   s    ""'')))**((::499;GI%. F!'$**Q-//ll))(DJJEEEF &*%;%;%="Z&&t'@'@'BHMMM z*%%''' ** 	*
 F N  (sj   D;D#BD;$D&%D;?'D* &D('D* +$D;D9D;!D;&D;(D* *	D63D;5D66D;c                 <  K   d}	 | j                   j                         }|y t        |t        j                  j
                  j                        rV| j                  j                  |j                        }|r|j                  |j                  |j                         d {    nt        |t        j                  j
                  j                        r| j                  j                          n}t        |t        j                  j
                  j                         s.t        |t        j                  j
                  j"                        r!d| _        | j&                  j)                          |dz  }|dkD  rd}t+        j,                  d       d {    7 7 w)Nr   Trc   
   )r4   
next_event
isinstanceaioquicquiceventsStreamDataReceived_streamsr/   r   r>   r9   
end_streamHandshakeCompletedrX   rn   ConnectionTerminatedStreamResetro   r[   cancelr   sleep)r   counteventstreams       r   r   z$AsyncioQuicConnection._handle_events   s3    $$//1E}%!4!4!G!GH**5??; ++EJJ8H8HIIIE7<<#6#6#I#IJ((,,.w||**??E7<<#6#6#B#BC!
##**,QJErzmmA&&&'  J 's%   BF!F"C/FFFFc                    K   | j                   j                  |||       | j                  4 d {    | j                  j                          d d d       d {    y 7 /7 # 1 d {  7  sw Y   y xY wwr   )r4   send_stream_datarZ   rs   )r   r   r9   r8   s       r   r5   zAsyncioQuicConnection.write   sh     ))&$?## 	* 	*'')	* 	* 	* 	* 	* 	* 	*sD   .A9A A9A$A9A"A9"A9$A6*A-+A62A9c                     | j                   ry t        j                  | j                               | _        t        j                  | j                               | _        y r   )_closedr   Taskrw   r[   r   r\   r   s    r   runzAsyncioQuicConnection.run   s;    <<%ll4>>+;<#LL8r   c                 ^  K   	 t        j                  | j                  j                         |       d {    | j                  rt        | j                  j                  d      }t        | |      }|| j                  |<   |S 7 N# t        $ r t
        j                  j                  w xY wwrH   )r   r"   rX   r   r#   r$   r%   r&   ro   r   r4   get_next_available_stream_idr	   r   )r   r)   r   r   s       r   make_streamz!AsyncioQuicConnection.make_stream   s     	(""4#;#;#@#@#BGLLL ::$$AA%H	"43#)i  M 	(--'''	(s,   B-1B BB A
B-B $B**B-c                   K   | j                   s| j                  j                  | j                  d   | j                  d          d| _         | j                  j                          | j                  j                          | j                  j                          d {    | j                  4 d {    | j                  j                          d d d       d {    	 | j                   d {    	 | j                   d {    y y 7 o7 \7 4# 1 d {  7  sw Y   DxY w7 6# t        j                  $ r Y Iw xY w7 <# t        j                  $ r Y y w xY ww)Nr   rc   T)r   _managerclosedrm   r4   rA   rY   rn   rV   rZ   rs   r[   r   CancelledErrorr\   r   s    r   rA   zAsyncioQuicConnection.close   s)    ||MM  A

1>DL""$  $$&,,$$&&&'' . .  ++-. .))))''''  '. . . . . *))  ()) s   BEDE2D3E6DEDE"D* 1D(2D* 7E EE EEED%DD%!E(D* *E =E?E  EE EEEEr   rM   )rN   rO   rP   r   rw   ry   r   r   r5   r   r   rA   rQ   rR   s   @r   rT   rT   M   s1    !+@*('.*
9
r   rT   c                   N     e Zd Zdej                  df fd	ZddZd Zd Z xZ	S )AsyncioQuicManagerNc                 2    t         |   ||t        |       y r   )r   r   rT   )r   confverify_modeserver_namer   s       r   r   zAsyncioQuicManager.__init__   s    {,A;Or   c                 X    | j                  ||||      \  }}|r|j                          |S r   )_connectr   )r   r]   r^   r_   r`   r   starts          r   connectzAsyncioQuicManager.connect   s.    "mmGT6;OUNNr   c                    K   | S wr   rC   r   s    r   rD   zAsyncioQuicManager.__aenter__   rE   rF   c                    K   t        | j                  j                               }|D ]  }|j                          d {     y7 wrH   )list_connectionsvaluesrA   )r   rI   rJ   rK   connectionsr   s         r   rL   zAsyncioQuicManager.__aexit__   sJ      4,,3356% 	%J""$$$	% %s   <AAA)iU  Nr   )
rN   rO   rP   sslCERT_REQUIREDr   r   rD   rL   rQ   rR   s   @r   r   r      s%     c.?.?T Pr   r   )r   rj   r   r-   rr   aioquic.quic.configurationr   aioquic.quic.connectionaioquic.quic.eventsdns.asyncbackendr$   dns.exceptiondns.inetdns.quic._commonr   r   r   r   r   r	   rT   r   rC   r   r   <module>r      s\      
   !      1 1h|/ |~) r   