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m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)NullContext)QUIC_MAX_DATAGRAMAsyncQuicConnectionAsyncQuicManagerBaseQuicStreamUnexpectedEOFc                       sX   e Zd Z f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 )TrioQuicStreamc                    s   t  || t | _d S N)super__init__trio	Condition_wake_up)self
connection	stream_id	__class__ G/home/ubuntu/webapp/venv/lib/python3.10/site-packages/dns/quic/_trio.pyr      s   zTrioQuicStream.__init__c              	      sl   	 | j |r
d S || _| j4 I d H  | j I d H  W d   I d H  n1 I d H s-w   Y  d| _q)NTr   )_bufferhave
_expectingr   wait)r   amountr   r   r   wait_for   s   (zTrioQuicStream.wait_forNc                    s   |d u r
t d }nt|}|) | dI d H  td| jd\}| |I d H  | j|W  d    S 1 s=w   Y  tj	j
)N   z!H)r   r   move_on_afterr   structunpackr   getdns	exceptionTimeout)r   timeoutcontextsizer   r   r   receive'   s   


 zTrioQuicStream.receiveFc                    s(   |  |}| j| j||I d H  d S r	   )_encapsulate_connectionwrite
_stream_id)r   datagramis_enddatar   r   r   send3   s   
zTrioQuicStream.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   r.   r-   r   r   r   
_add_input7   s   .zTrioQuicStream._add_inputc                    s   |    d S r	   )_closer   r   r   r   close<   s   zTrioQuicStream.closec                       | S r	   r   r4   r   r   r   
__aenter__A      zTrioQuicStream.__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)r5   r   r1   )r   exc_typeexc_valexc_tbr   r   r   	__aexit__D   s   zTrioQuicStream.__aexit__r	   F)__name__
__module____qualname__r   r   r'   r/   r2   r5   r7   r=   __classcell__r   r   r   r   r      s    
	
r   c                       sR   e Zd Zd f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 )TrioQuicConnectionNc                    sP   t  |||||| tj| jtjd| _t | _t | _	d | _
d| _d S )Nr   F)r
   r   r   socket_af
SOCK_DGRAM_socketEvent_handshake_complete	_run_done_worker_scope_send_pending)r   r   addressportsourcesource_portmanagerr   r   r   r   L   s   


zTrioQuicConnection.__init__c                    sR  z| j r| jtj| j | jI d H  | j| jI d H  | j	s| 
d\}}| jr.d}tjt | d| _| jtI d H }| j|| jt  W d    n1 sXw   Y  d | _| | |  I d H  d| _| jt }|D ]\}}| j|I d H  qy| j	r"W d| _	| j  d S W d| _	| j  d S d| _	| j  w )NFg        )deadlineT)_sourcerG   bindr!   inetlow_level_address_tuplerE   connect_peer_done_get_timer_valuesrL   r   CancelScopecurrent_timerK   recvr   r)   receive_datagramtime_handle_timer_handle_eventsdatagrams_to_sendr/   rI   set)r   
expirationintervalr,   	datagrams_r   r   r   _workerT   sB   


zTrioQuicConnection._workerc                    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       
   )r)   
next_event
isinstanceaioquicquiceventsStreamDataReceived_streamsr    r   r2   r.   
end_streamHandshakeCompletedrI   rc   ConnectionTerminatedrY   rG   r5   StreamResetr   sleep)r   counteventstreamr   r   r   ra   x   s2   
z!TrioQuicConnection._handle_eventsFc                    s4   | j ||| d| _| jd ur| j  d S d S )NT)r)   send_stream_datarL   rK   cancel)r   rz   r.   r-   r   r   r   r*      s   
zTrioQuicConnection.writec              	      sb   | j rd S t 4 I d H }|| j W d   I d H  n1 I d H s%w   Y  | j  d S r	   )_closedr   open_nursery
start_soonrh   rJ   rc   )r   nurseryr   r   r   run   s   (zTrioQuicConnection.runc                    s   |d u r
t d }nt|}|' | j I d H  | jrt| jd}t	| |}|| j
|< |W  d    S 1 s;w   Y  tjjr9   )r   r   r   rI   r   rY   r   r)   get_next_available_stream_idr   rr   r!   r"   r#   )r   r$   r%   r   rz   r   r   r   make_stream   s   



 zTrioQuicConnection.make_streamc                    sd   | j s0| j| jd | jd  d| _ | j  d| _| jd ur&| j  | j	
 I d H  d S d S )Nr   rj   T)r}   _managerclosedrX   r)   r5   rL   rK   r|   rJ   r   r4   r   r   r   r5      s   


zTrioQuicConnection.closer	   r>   )r?   r@   rA   r   rh   ra   r*   r   r   r5   rB   r   r   r   r   rC   K   s    $

rC   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 )TrioQuicManagerNc                    s   t  ||t| || _d S r	   )r
   r   rC   _nursery)r   r   confverify_modeserver_namer   r   r   r      s   
zTrioQuicManager.__init__U  r   Tc                 C   s,   |  |||||\}}|r| j|j |S r	   )_connectr   r   r   )r   rM   rN   rO   rP   want_session_ticketr   startr   r   r   rW      s   
zTrioQuicManager.connectc                    r6   r	   r   r4   r   r   r   r7      r8   zTrioQuicManager.__aenter__c                    s,   t | j }|D ]	}| I d H  q
dS r9   )list_connectionsvaluesr5   )r   r:   r;   r<   connectionsr   r   r   r   r=      s
   zTrioQuicManager.__aexit__)r   Nr   T)
r?   r@   rA   sslCERT_REQUIREDr   rW   r7   r=   rB   r   r   r   r   r      s    

r   )rD   r   r   r_   aioquic.quic.configurationrn   aioquic.quic.connectionaioquic.quic.eventsr   dns.exceptionr!   dns.inetdns._asyncbackendr   dns.quic._commonr   r   r   r   r   r   rC   r   r   r   r   r   <module>   s   	2m