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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                       sh   e Zd Z fddZ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__ M/var/www/html/olx_land/venv/lib/python3.10/site-packages/dns/quic/_asyncio.pyr
      s   zAsyncioQuicStream.__init__c              	      sR   | 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   s   .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_forc                    sP   	 |  |}| j rd S zt|  |I d H  W n ty&   tjj	w qr   )
r   r   seen_endr   r   r   r   r   r   r    )r   r"   r#   r   r   r   wait_for_end.   s   

zAsyncioQuicStream.wait_for_endNc                    sv   |  |}| j r| |I d H  | j S | d|I d H  td| j	d\}| ||I d H  | j	|S )N   z!H)
_expiration_from_timeout_connectionis_h3r%   r   get_allr   structunpackget)r   r#   r"   sizer   r   r   receive8   s   


zAsyncioQuicStream.receiveFc                    s(   |  |}| j| j||I d H  d S r   )_encapsulater(   write
_stream_id)r   datagramis_enddatar   r   r   sendC   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   r5   r4   r   r   r   
_add_inputG   s   .zAsyncioQuicStream._add_inputc                    s   |    d S r   )_closer   r   r   r   closeL   s   zAsyncioQuicStream.closec                       | S r   r   r   r   r   r   
__aenter__Q      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)r;   r   r8   )r   exc_typeexc_valexc_tbr   r   r   	__aexit__T   s   zAsyncioQuicStream.__aexit__r   F)__name__
__module____qualname__r
   r   r   r%   r/   r6   r9   r;   r=   rC   __classcell__r   r   r   r   r      s    


r   c                       sj   e Zd Zd fdd	Z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                    sP   t  |||||| d | _t | _t | _t | _d | _	d | _
d| _d S r?   )r	   r
   _socketr   Event_handshake_complete_socket_createdr   _wake_timer_receiver_task_sender_task_wake_pending)r   r   addressportsourcesource_portmanagerr   r   r   r
   \   s   



zAsyncioQuicConnection.__init__c              	      s|  zz~t j| j}t jd}||tjd| j	| j
d | j
d fI d H | _| j  | j4 I d H A | jsj| jtd I d H \}}|d | j
d ksU|d | j
d krVq4| j||t  |  I d H  | jr7W d   I d H  n1 I d H szw   Y  W n	 ty   Y nw W d| _|  I d H  | j  d S W d| _|  I d H  | j  d S d| _|  I d H  | j  w )Nr   r      T)r   inetaf_for_address_addressasyncbackendget_backendmake_socketsocket
SOCK_DGRAM_source_peerrJ   rM   set_donerecvfromr   r(   receive_datagramtime_wakeup	ExceptionrL   )r   afbackendr3   rR   r   r   r   	_receiverf   sD   
$(zAsyncioQuicConnection._receiverc              	      sR   d| _ | j4 I d H  | j  W d   I d H  d S 1 I d H s"w   Y  d S )NT)rQ   rN   
notify_allr   r   r   r   rg      s
   .zAsyncioQuicConnection._wakeupc              	      s\   | j 4 I d H  | js| j  I d H  W d   I d H  n1 I d H s$w   Y  d| _d S r?   )rN   rQ   r   r   r   r   r   _wait_for_wake_timer   s   (
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   )rM   r   rc   r(   datagrams_to_sendrf   ra   rJ   sendto_get_timer_valuesr   r   rm   rh   _handle_timer_handle_events)r   	datagramsr3   rR   r"   intervalr   r   r   _sender   s    
zAsyncioQuicConnection._senderc                    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    rW   
   )!r(   
next_event
isinstanceaioquicquiceventsStreamDataReceivedr)   _h3_connhandle_eventh3HeadersReceived_streamsr-   r   _headersheaders	_trailersstream_endedr9   DataReceivedr5   
end_streamHandshakeCompletedrL   rb   ConnectionTerminatedrc   rO   cancelStreamResetr   sleep)r   countevent	h3_eventsh3_eventstreamr   r   r   rr      s\   




z$AsyncioQuicConnection._handle_eventsFc                    s$   | j ||| |  I d H  d S r   )r(   send_stream_datarg   )r   r   r5   r4   r   r   r   r1      s   zAsyncioQuicConnection.writec                 C   s.   | j rd S t|  | _t|  | _d S r   )_closedr   Taskrk   rO   ru   rP   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   rL   r   r   r   r   r    rc   r   r(   get_next_available_stream_idr   r   )r   r#   r   r   r   r   r   make_stream   s   

z!AsyncioQuicConnection.make_streamc                    s   | j sU| j| jd | jd  d| _ | j  | j  |  I d H  z| j	I d H  W n
 t
jy7   Y nw z| jI d H  W n
 t
jyJ   Y nw | j I d H  d S d S )Nr   rW   T)r   _managerclosedra   r(   r;   rM   rb   rg   rO   r   CancelledErrorrP   rJ   r   r   r   r   r;      s&   

zAsyncioQuicConnection.closer   rD   )rE   rF   rG   r
   rk   rg   rm   ru   rr   r1   r   r   r;   rH   r   r   r   r   rI   [   s    

-
rI   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 )AsyncioQuicManagerNFc                    s   t  ||t|| d S r   )r	   r
   rI   )r   confverify_modeserver_namer   r   r   r   r
      s   zAsyncioQuicManager.__init__U  r   Tc                 C   s&   |  |||||\}}|r|  |S r   )_connectr   )r   rR   rS   rT   rU   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valuesr;   )r   r@   rA   rB   connectionsr   r   r   r   rC     s
   zAsyncioQuicManager.__aexit__)r   Nr   T)
rE   rF   rG   sslCERT_REQUIREDr
   r   r=   rC   rH   r   r   r   r   r      s    


r   )r   r^   r   r+   rf   aioquic.quic.configurationrz   aioquic.quic.connectionaioquic.quic.eventsdns.asyncbackendr   dns.exceptiondns.inetdns.quic._commonr   r   r   r   r   r   rI   r   r   r   r   r   <module>   s    	B 