a
    PҚ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__ I/wd/webapps/venvs/v2025_4um/lib/python3.9/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  q`1 I d H sV0    Y  d| _q d S )Nr   )_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  q 1 I d H sN0    Y  q d S 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|}| | j rR|  I d H  | j W  d    S | dI d H  t	
d| jd\}| |I d H  | j|W  d    S W d    n1 s0    Y  tjjd S )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    


8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              	      sT   |  ||rP| j4 I d H   | j  W d   I d H  qP1 I d H sF0    Y  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   | S r	   r   r   r   r   r   
__aenter__L   s    zTrioQuicStream.__aenter__c              	      sV   |   I d H  | j4 I d H   | j  W d   I d H  qR1 I d H sH0    Y  dS NF)r3   r   r0   )r   exc_typeexc_valexc_tbr   r   r   	__aexit__O   s    4zTrioQuicStream.__aexit__)N)F)__name__
__module____qualname__r   r   r   r*   r/   r1   r3   r4   r9   __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 s0    Y  d | _| | |  I d H  d| _| jt }|D ]\}}| j|I d H  qq>W d| _	| j  | j  nd| _	| j  | j  0 d S )NFg        )deadlineT)_sourcerB   bindr$   ZinetZlow_level_address_tupler@   connect_peer_doneZ_get_timer_valuesrG   r   ZCancelScopecurrent_timerF   recvr   r   Zreceive_datagramtimeZ_handle_timer_handle_eventsZdatagrams_to_sendr/   r3   rD   set)r   Z
expirationintervalr,   Z	datagrams_r   r   r   _worker_   s:    

4


zTrioQuicConnection._workerc                    s  d}| j  }|d u rd S t|tjjjr|  r| j	|}|D ]}t|tj
jjr| j|j}|r|jd u r~|j|_n|jd u r|j|_|jr|ddI d H  qDt|tj
jjrD| j|j}|rD||j|jI d H  qDn*| j|j}|r||j|jI d H  nzt|tjjjr0| j  n\t|tjjjrTd| _| j  n8t|tjjjr| j|j}|r|ddI d H  |d7 }|dkrd}t dI d H  qd S )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HandshakeCompletedrD   rW   ZConnectionTerminatedrR   rB   r3   ZStreamResetr   sleep)r   counteventZ	h3_eventsZh3_eventstreamr   r   r   rV      sN    



z!TrioQuicConnection._handle_eventsFc                    s.   | j ||| d| _| jd ur*| j  d S )NT)r   Zsend_stream_datarG   rF   cancel)r   rh   r.   r-   r   r   r   r+      s    
zTrioQuicConnection.writec              	      s`   | j r
d S t 4 I d H "}|| j W d   I d H  qR1 I d H sH0    Y  | j  d S r	   )_closedr   Zopen_nursery
start_soonrZ   rE   rW   )r   nurseryr   r   r   run   s
    6zTrioQuicConnection.runc                    s   |d u rt d }n
t|}|N | j I d H  | jr<t| jd}t	| |}|| j
|< |W  d    S 1 st0    Y  tjjd S r5   )r   r   r   rD   r   rR   r   r   Zget_next_available_stream_idr   rb   r$   r%   r&   )r   r'   r(   r   rh   r   r   r   make_stream   s    



"zTrioQuicConnection.make_streamc                    s^   | j sZ| j| jd | jd  d| _ | j  d| _| jd urJ| j  | j	
 I d H  d S )Nr   r\   T)rj   _managerclosedrQ   r   r3   rG   rF   ri   rE   r   r   r   r   r   r3      s    


zTrioQuicConnection.close)N)F)N)r:   r;   r<   r   rZ   rV   r+   rm   rn   r3   r=   r   r   r   r   r>   V   s   %,

r>   c                       sB   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   r>   _nursery)r   rl   Zconfverify_modeZserver_namera   r   r   r   r      s    zTrioQuicManager.__init__U  r   Tc                 C   s,   |  |||||\}}|r(| j|j |S r	   )_connectrr   rk   rm   )r   rH   rI   rJ   rK   Zwant_session_ticketr   startr   r   r   rP      s    
zTrioQuicManager.connectc                    s   | S r	   r   r   r   r   r   r4      s    zTrioQuicManager.__aenter__c                    s*   t | j }|D ]}| I d H  qdS r5   )listZ_connectionsvaluesr3   )r   r6   r7   r8   connectionsr   r   r   r   r9      s    zTrioQuicManager.__aexit__)rt   Nr   T)
r:   r;   r<   sslCERT_REQUIREDr   rP   r4   r9   r=   r   r   r   r   rq      s    

rq   )r?   rz   r!   rU   Zaioquic.quic.configurationr_   Zaioquic.quic.connectionZaioquic.quic.eventsr   Zdns.exceptionr$   Zdns.inetZdns._asyncbackendr   Zdns.quic._commonr   r   r   r   r   r   r>   rq   r   r   r   r   <module>   s   	= 