o
    Rf                     @   s   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 deZG dd deZG dd deZdS )	    N)QUIC_MAX_DATAGRAMAsyncQuicConnectionAsyncQuicManagerBaseQuicStreamUnexpectedEOFc                       s`   e Zd Z fddZdd Zdd Zddd	ZdddZdd Zdd Z	dd Z
dd Z  ZS )AsyncioQuicStreamc                    s   t  || t | _d S N)super__init__asyncio	Condition_wake_up)self
connection	stream_id	__class__ J/home/ubuntu/webapp/venv/lib/python3.10/site-packages/dns/quic/_asyncio.pyr
      s   zAsyncioQuicStream.__init__c              	      R   | j 4 I d H  | j  I d H  W d   I d H  d S 1 I d H s"w   Y  d S r   )r   waitr   r   r   r   _wait_for_wake_up      .z#AsyncioQuicStream._wait_for_wake_upc                    s^   	 |  |}| j|rd S || _zt|  |I d H  W n ty*   tj	j
w d| _q)NTr   )_timeout_from_expiration_bufferhave
_expectingr   wait_forr   TimeoutErrordns	exceptionTimeout)r   amount
expirationtimeoutr   r   r   r   "   s   
zAsyncioQuicStream.wait_forNc                    sR   |  |}| d|I d H  td| jd\}| ||I d H  | j|S )N   z!H)_expiration_from_timeoutr   structunpackr   get)r   r%   r$   sizer   r   r   receive.   s   
zAsyncioQuicStream.receiveFc                    s(   |  |}| j| j||I d H  d S r   )_encapsulate_connectionwrite
_stream_id)r   datagramis_enddatar   r   r   send5   s   
zAsyncioQuicStream.sendc              	      s\   |  ||r,| j4 I d H  | j  W d   I d H  d S 1 I d H s%w   Y  d S d S r   )_common_add_inputr   notify)r   r3   r2   r   r   r   
_add_input9   s   .zAsyncioQuicStream._add_inputc                    s   |    d S r   )_closer   r   r   r   close>   s   zAsyncioQuicStream.closec                       | S r   r   r   r   r   r   
__aenter__C      zAsyncioQuicStream.__aenter__c              	      sZ   |   I d H  | j4 I d H  | j  W d   I d H  dS 1 I d H s&w   Y  dS NF)r9   r   r6   )r   exc_typeexc_valexc_tbr   r   r   	__aexit__F   s   zAsyncioQuicStream.__aexit__r   F)__name__
__module____qualname__r
   r   r   r,   r4   r7   r9   r;   rA   __classcell__r   r   r   r   r      s    

r   c                       sb   e Zd Zd fdd	Zdd Zdd Zdd	 Zd
d ZdddZdd Z	dddZ
dd Z  ZS )AsyncioQuicConnectionNc                    sJ   t  |||||| d | _t | _t | _t | _d | _	d | _
d S r   )r	   r
   _socketr   Event_handshake_complete_socket_createdr   _wake_timer_receiver_task_sender_task)r   r   addressportsourcesource_portmanagerr   r   r   r
   N   s   



zAsyncioQuicConnection.__init__c                    s  zzt j| j}t jd}||tjd| j	| j
d | j
d fI d H | _| j  | j4 I d H \ | js| jtd I d H \}}|d | j
d ksU|d | j
d krVq4| j||t  | j4 I d H  | j  W d   I d H  n1 I d H s}w   Y  | jr7W d   I d H  n1 I d H sw   Y  W n	 ty   Y nw W d| _| j4 I d H  | j  W d   I d H  n1 I d H sw   Y  | j  d S d| _| j4 I d H  | j  W d   I d H  n1 I d H sw   Y  | j  w )Nr   r      T)r    inetaf_for_address_addressasyncbackendget_backendmake_socketsocket
SOCK_DGRAM_source_peerrH   rK   set_donerecvfromr   r.   receive_datagramtimerL   
notify_all	ExceptionrJ   )r   afbackendr1   rO   r   r   r   	_receiverW   sH   
$((((zAsyncioQuicConnection._receiverc              	      r   r   )rL   r   r   r   r   r   _wait_for_wake_timeru   r   z*AsyncioQuicConnection._wait_for_wake_timerc                    s   | j  I d H  | js\| jt }|D ]\}}|| jks!J | j|| jd I d H  q| 	 \}}zt
|  |I d H  W n	 tyJ   Y nw | | |  I d H  | jrd S d S r   )rK   r   r`   r.   datagrams_to_sendrc   r^   rH   sendto_get_timer_valuesr   r   ri   re   _handle_timer_handle_events)r   	datagramsr1   rO   r$   intervalr   r   r   _sendery   s    
zAsyncioQuicConnection._senderc                    s   d}	 | j  }|d u rd S t|tjjjr,| j|j	}|r+|
|j|jI d H  n9t|tjjjr:| j  n+t|tjjjrKd| _| j  nt|tjjjre| j|j	}|re|
ddI d H  |d7 }|dkrwd}tdI d H  q)Nr   T    rT   
   )r.   
next_event
isinstanceaioquicquiceventsStreamDataReceived_streamsr*   r   r7   r3   
end_streamHandshakeCompletedrJ   r_   ConnectionTerminatedr`   rM   cancelStreamResetr   sleep)r   counteventstreamr   r   r   rn      s2   
z$AsyncioQuicConnection._handle_eventsFc              	      s\   | j ||| | j4 I d H  | j  W d   I d H  d S 1 I d H s'w   Y  d S r   )r.   send_stream_datarL   rd   )r   r   r3   r2   r   r   r   r/      s
   .zAsyncioQuicConnection.writec                 C   s.   | j rd S t|  | _t|  | _d S r   )_closedr   Taskrh   rM   rq   rN   r   r   r   r   run   s   zAsyncioQuicConnection.runc                    sd   zt | j |I d H  W n ty   tjjw | jr t	| j
d}t| |}|| j|< |S r=   )r   r   rJ   r   r   r    r!   r"   r`   r   r.   get_next_available_stream_idr   rz   )r   r%   r   r   r   r   r   make_stream   s   

z!AsyncioQuicConnection.make_streamc              	      s   | j sp| j| jd | jd  d| _ | j  | j  | j4 I d H  | j	  W d   I d H  n1 I d H s;w   Y  z| j
I d H  W n
 tjyR   Y nw z| jI d H  W n
 tjye   Y nw | j I d H  d S d S )Nr   rT   T)r   _managerclosedr^   r.   r9   rK   r_   rL   rd   rM   r   CancelledErrorrN   rH   r   r   r   r   r9      s*   

(zAsyncioQuicConnection.closer   rB   )rC   rD   rE   r
   rh   ri   rq   rn   r/   r   r   r9   rF   r   r   r   r   rG   M   s    	

rG   c                       sB   e Zd Zdejdf fdd	Z	dddZd	d
 Zdd Z  Z	S )AsyncioQuicManagerNc                    s   t  ||t| d S r   )r	   r
   rG   )r   confverify_modeserver_namer   r   r   r
      s   zAsyncioQuicManager.__init__U  r   Tc                 C   s&   |  |||||\}}|r|  |S r   )_connectr   )r   rO   rP   rQ   rR   want_session_ticketr   startr   r   r   connect   s   
zAsyncioQuicManager.connectc                    r:   r   r   r   r   r   r   r;      r<   zAsyncioQuicManager.__aenter__c                    s,   t | j }|D ]	}| I d H  q
dS r=   )list_connectionsvaluesr9   )r   r>   r?   r@   connectionsr   r   r   r   rA      s
   zAsyncioQuicManager.__aexit__)r   Nr   T)
rC   rD   rE   sslCERT_REQUIREDr
   r   r;   rA   rF   r   r   r   r   r      s    

r   )r   r[   r   r(   rc   aioquic.quic.configurationrv   aioquic.quic.connectionaioquic.quic.eventsdns.asyncbackendr    dns.exceptiondns.inetdns.quic._commonr   r   r   r   r   r   rG   r   r   r   r   r   <module>   s    	4 