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__ J/var/www/html/olx_land/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_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   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	   )_encapsulater!   write
_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	   )_common_add_inputr   notify)r   r3   r2   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)r9   r   r6   )r   exc_typeexc_valexc_tbr   r   r   	__aexit__O   s   zTrioQuicStream.__aexit__r	   F)__name__
__module____qualname__r   r   r   r-   r4   r7   r9   r;   rA   __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)_sourcerK   bindr'   inetlow_level_address_tuplerI   connect_peer_done_get_timer_valuesrP   r   CancelScopecurrent_timerO   recvr   r!   receive_datagramtime_handle_timer_handle_eventsdatagrams_to_sendr4   r9   rM   set)r   
expirationintervalr1   	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!   
next_event
isinstanceaioquicquiceventsStreamDataReceivedr"   _h3_connhandle_eventh3HeadersReceived_streamsr&   r   _headersheaders	_trailersstream_endedr7   DataReceivedr3   
end_streamHandshakeCompletedrM   rg   ConnectionTerminatedr]   rK   r9   StreamResetr   sleep)r   countevent	h3_eventsh3_eventstreamr   r   r   re      s\   




z!TrioQuicConnection._handle_eventsFc                    s4   | j ||| d| _| jd ur| j  d S d S )NT)r!   send_stream_datarP   rO   cancel)r   r   r3   r2   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_soonrl   rN   rg   )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r=   )r   r   r    rM   r   r]   r   r!   get_next_available_stream_idr   rz   r'   r(   r)   )r   r*   r+   r   r   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   rn   T)r   _managerclosedr\   r!   r9   rP   rO   r   rN   r   r   r   r   r   r9      s   


zTrioQuicConnection.closer	   rB   )rC   rD   rE   r   rl   re   r/   r   r   r9   rF   r   r   r   r   rG   V   s    %
,
rG   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   rG   _nursery)r   r   confverify_modeserver_namerx   r   r   r   r      s   
zTrioQuicManager.__init__U  r   Tc                 C   s,   |  |||||\}}|r| j|j |S r	   )_connectr   r   r   )r   rQ   rR   rS   rT   want_session_ticketr   startr   r   r   r[      s   
zTrioQuicManager.connectc                    r:   r	   r   r   r   r   r   r;      r<   zTrioQuicManager.__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TrioQuicManager.__aexit__)r   Nr   T)
rC   rD   rE   sslCERT_REQUIREDr   r[   r;   rA   rF   r   r   r   r   r      s    

r   )rH   r   r$   rc   aioquic.quic.configurationrr   aioquic.quic.connectionaioquic.quic.eventsr   dns.exceptionr'   dns.inetdns._asyncbackendr   dns.quic._commonr   r   r   r   r   r   rG   r   r   r   r   r   <module>   s    	= 