o
    h $                     @   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                       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 )TrioQuicStreamc                    s   t  || t | _d S N)super__init__trio	Condition_wake_up)self
connection	stream_id	__class__ A/var/www/html/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   )_bufferZhaveZ
_expectingr   wait)r   amountr   r   r   wait_for   s   (zTrioQuicStream.wait_forc              	      s^   	 | 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  qr	   )r   Zseen_endr   r   r   r   r   r   wait_for_end'   s   
(zTrioQuicStream.wait_for_endNc                    s   |d u r
t d }nt|}|A | j r*|  I d H  | j W  d    S | dI d H  t	
d| jd\}| |I d H  | j|W  d    S 1 sUw   Y  tjj)N   z!H)r   r   move_on_after_connectionis_h3r   r   get_allr   structunpackgetdns	exceptionTimeout)r   timeoutcontextsizer   r   r   receive.   s   



 	zTrioQuicStream.receiveFc                    s(   |  |}| j| j||I d H  d S r	   )Z_encapsulater   writeZ
_stream_id)r   datagramis_enddatar   r   r   send>   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	   )Z_common_add_inputr   notify)r   r.   r-   r   r   r   
_add_inputB   s   .zTrioQuicStream._add_inputc                    s   |    d S r	   )_closer   r   r   r   closeG   s   zTrioQuicStream.closec                       | S r	   r   r   r   r   r   
__aenter__L      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)r3   r   r0   )r   exc_typeexc_valexc_tbr   r   r   	__aexit__O   s   zTrioQuicStream.__aexit__r	   F)__name__
__module____qualname__r   r   r   r*   r/   r1   r3   r5   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   W   s   


zTrioQuicConnection.__init__c                    sp  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  | j  d S W d| _	| j  | j  d S d| _	| j  | j  w )NFg        )deadlineT)_sourcerE   bindr$   ZinetZlow_level_address_tuplerC   connect_peer_doneZ_get_timer_valuesrJ   r   ZCancelScopecurrent_timerI   recvr   r   Zreceive_datagramtimeZ_handle_timer_handle_eventsZdatagrams_to_sendr/   r3   rG   set)r   Z
expirationintervalr,   Z	datagrams_r   r   r   _worker_   sH   





zTrioQuicConnection._workerc                    s  d}	 | j  }|d u rd S t|tjjjr|  rt| j	|}|D ]O}t|tj
jjrV| j|j}|rU|jd u r@|j|_n	|jd u rI|j|_|jrU|ddI d H  q#t|tj
jjrr| j|j}|rr||j|jI d H  q#nN| j|j}|r||j|jI d H  n9t|tjjjr| j  n+t|tjjjrd| _| j  nt|tjjjr| j|j}|r|ddI d H  |d7 }|dkrd}t dI d H  q)Nr   T       
   )!r   Z
next_event
isinstanceaioquicZquiceventsZStreamDataReceivedr   Z_h3_connZhandle_eventh3ZHeadersReceived_streamsr#   r   _headersheadersZ	_trailersZstream_endedr1   ZDataReceivedr.   Z
end_streamZHandshakeCompletedrG   rZ   ZConnectionTerminatedrU   rE   r3   ZStreamResetr   sleep)r   counteventZ	h3_eventsZh3_eventstreamr   r   r   rY      s\   




z!TrioQuicConnection._handle_eventsFc                    s4   | j ||| d| _| jd ur| j  d S d S )NT)r   Zsend_stream_datarJ   rI   cancel)r   rk   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   Zopen_nursery
start_soonr]   rH   rZ   )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r7   )r   r   r   rG   r   rU   r   r   Zget_next_available_stream_idr   re   r$   r%   r&   )r   r'   r(   r   rk   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   r_   T)rm   _managerclosedrT   r   r3   rJ   rI   rl   rH   r   r   r   r   r   r3      s   


zTrioQuicConnection.closer	   r<   )r=   r>   r?   r   r]   rY   r+   rp   rq   r3   r@   r   r   r   r   rA   V   s    %
,
rA   c                       sD   e Zd Zdejddf fdd	Z	ddd	Zd
d Zdd Z  Z	S )TrioQuicManagerNFc                    s   t  ||t|| || _d S r	   )r
   r   rA   _nursery)r   ro   Zconfverify_modeZserver_namerd   r   r   r   r      s   
zTrioQuicManager.__init__U  r   Tc                 C   s,   |  |||||\}}|r| j|j |S r	   )_connectru   rn   rp   )r   rK   rL   rM   rN   Zwant_session_ticketr   startr   r   r   rS      s   
zTrioQuicManager.connectc                    r4   r	   r   r   r   r   r   r5      r6   zTrioQuicManager.__aenter__c                    s,   t | j }|D ]	}| I d H  q
dS r7   )listZ_connectionsvaluesr3   )r   r8   r9   r:   connectionsr   r   r   r   r;      s
   zTrioQuicManager.__aexit__)rw   Nr   T)
r=   r>   r?   sslCERT_REQUIREDr   rS   r5   r;   r@   r   r   r   r   rt      s    

rt   )rB   r}   r!   rX   Zaioquic.quic.configurationrb   Zaioquic.quic.connectionZaioquic.quic.eventsr   Zdns.exceptionr$   Zdns.inetZdns._asyncbackendr   Zdns.quic._commonr   r   r   r   r   r   rA   rt   r   r   r   r   <module>   s    	= 