U
    óåêfQ  ã                   @   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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)ÚBaseQuicStreamÚAsyncQuicConnectionÚAsyncQuicManagerÚQUIC_MAX_DATAGRAMc                       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 )ÚAsyncioQuicStreamc                    s   t ƒ  ||¡ t ¡ | _d S ©N)ÚsuperÚ__init__ÚasyncioÚ	ConditionÚ_wake_up)ÚselfÚ
connectionÚ	stream_id©Ú	__class__© ú_/home/www/findmeahotel.co.uk/times_travel/venv/lib/python3.8/site-packages/dns/quic/_asyncio.pyr	      s    zAsyncioQuicStream.__init__c              
   Ã   s4   | j 4 I d H š | j  ¡ I d H  W 5 Q I d H R X 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k
rN   Y nX d| _q
d S ©Nr   )Z_timeout_from_expirationÚ_bufferZhaveZ
_expectingr
   Úwait_forr   Ú	Exception)r   ÚamountÚ
expirationÚtimeoutr   r   r   r       s    
zAsyncioQuicStream.wait_forNc                 Ã   sP   |   |¡}|  d|¡I d H  t d| j d¡¡\}|  ||¡I d H  | j |¡S )Né   z!H)Z_expiration_from_timeoutr   ÚstructÚunpackr   Úget)r   r   r   Úsizer   r   r   Úreceive,   s
    
zAsyncioQuicStream.receiveFc                 Ã   s&   |   |¡}| j | j||¡I d H  d S r   )Z_encapsulateÚ_connectionÚwriteZ
_stream_id)r   ÚdatagramÚis_endÚdatar   r   r   Úsend3   s    
zAsyncioQuicStream.sendc              
   Ã   s:   |   ||¡r6| j4 I d H š | j ¡  W 5 Q I d H R X d S r   )Z_common_add_inputr   Únotify)r   r(   r'   r   r   r   Ú
_add_input7   s    zAsyncioQuicStream._add_inputc                 Ã   s   |   ¡  d S r   )Ú_closer   r   r   r   Úclose<   s    zAsyncioQuicStream.closec                 Ã   s   | S r   r   r   r   r   r   Ú
__aenter__A   s    zAsyncioQuicStream.__aenter__c              
   Ã   s<   |   ¡ I d H  | j4 I d H š | j ¡  W 5 Q I d H R X dS ©NF)r-   r   r*   )r   Úexc_typeÚexc_valÚexc_tbr   r   r   Ú	__aexit__D   s    zAsyncioQuicStream.__aexit__)N)F)Ú__name__Ú
__module__Ú__qualname__r	   r   r   r#   r)   r+   r-   r.   r3   Ú__classcell__r   r   r   r   r      s   

r   c                       s`   e Zd Zd‡ fdd„	Zdd„ Zdd„ Zdd	„ Zd
d„ Zddd„Zdd„ Z	dd„ Z
dd„ Z‡  ZS )ÚAsyncioQuicConnectionNc                    sJ   t ƒ  ||||||¡ d | _t ¡ | _t ¡ | _t ¡ | _d | _	d | _
d S r   )r   r	   Ú_socketr
   ÚEventÚ_handshake_completeÚ_socket_createdr   Ú_wake_timerÚ_receiver_taskÚ_sender_task)r   r   ÚaddressÚportÚsourceÚsource_portÚmanagerr   r   r   r	   L   s    


zAsyncioQuicConnection.__init__c                 Ã   s  zòt j | j¡}t j d¡}| |tjd| j	| j
¡I d H | _| j ¡  | j4 I d H š | jsà| j td ¡I d H \}}|d | j
d ksV|d | j
d kršqV| j || j
d t ¡ ¡ | j4 I d H š | j ¡  W 5 Q I d H R X qVW 5 Q I d H R X W n tk
r   Y nX d S )Nr
   r   é   )ÚdnsZinetZaf_for_addressÚ_addressZasyncbackendÚget_backendZmake_socketÚsocketÚ
SOCK_DGRAMÚ_sourceÚ_peerr9   r<   ÚsetÚ_doneÚrecvfromr   r$   Zreceive_datagramÚtimer=   Ú
notify_allr   )r   ÚafÚbackendr&   r@   r   r   r   Ú	_receiverU   s8        ÿ
 ÿ$  ÿ0zAsyncioQuicConnection._receiverc              
   Ã   s4   | j 4 I d H š | j  ¡ I d H  W 5 Q I d H R X d S r   )r=   r   r   r   r   r   Ú_wait_for_wake_timern   s    z*AsyncioQuicConnection._wait_for_wake_timerc                 Ã   s¸   | j  ¡ I d H  | js´| j t ¡ ¡}|D ]2\}}|| jd ksDt‚| j 	|| jd ¡I d H  q*|  
¡ \}}zt |  ¡ |¡I d H  W n tk
r˜   Y nX |  |¡ |  ¡ I d H  qd S r   )r<   r   rN   r$   Zdatagrams_to_sendrP   rL   ÚAssertionErrorr9   ÚsendtoZ_get_timer_valuesr
   r   rU   r   Z_handle_timerÚ_handle_events)r   Z	datagramsr&   r@   r   Úintervalr   r   r   Ú_senderr   s    
zAsyncioQuicConnection._senderc                 Ã   sÊ   d}| j  ¡ }|d krd S t|tjjjƒrT| j |j	¡}|r | 
|j|j¡I d H  nLt|tjjjƒrp| j ¡  n0t|tjjjƒst|tjjjƒr d| _| j ¡  |d7 }|dkrd}t d¡I d H  qd S )Nr   TrE   é
   )r$   Z
next_eventÚ
isinstanceÚaioquicZquicÚeventsZStreamDataReceivedÚ_streamsr!   r   r+   r(   Z
end_streamZHandshakeCompletedr;   rM   ZConnectionTerminatedZStreamResetrN   r>   Úcancelr
   Úsleep)r   ÚcountÚeventÚstreamr   r   r   rX      s,    
 ÿþ
z$AsyncioQuicConnection._handle_eventsFc              
   Ã   s>   | j  |||¡ | j4 I d H š | j ¡  W 5 Q I d H R X d S r   )r$   Zsend_stream_datar=   rQ   )r   rd   r(   r'   r   r   r   r%   ˜   s    zAsyncioQuicConnection.writec                 C   s.   | j r
d S t |  ¡ ¡| _t |  ¡ ¡| _d S r   )Ú_closedr
   ÚTaskrT   r>   rZ   r?   r   r   r   r   Úrun   s    zAsyncioQuicConnection.runc                 Ã   s4   | j  ¡ I d H  | j d¡}t| |ƒ}|| j|< |S r/   )r;   r   r$   Zget_next_available_stream_idr   r_   )r   r   rd   r   r   r   Úmake_stream£   s
    

z!AsyncioQuicConnection.make_streamc              
   Ã   s®   | j sª| j | jd | jd ¡ d| _ | j ¡  | j4 I d H š | j ¡  W 5 Q I d H R X z| jI d H  W n t	j
k
r€   Y nX z| jI d H  W n t	j
k
r¨   Y nX d S )Nr   rE   T)re   Ú_managerÚclosedrL   r$   r-   r=   rQ   r>   r
   ÚCancelledErrorr?   r   r   r   r   r-   ª   s    
zAsyncioQuicConnection.close)N)F)r4   r5   r6   r	   rT   rU   rZ   rX   r%   rg   rh   r-   r7   r   r   r   r   r8   K   s   	
r8   c                       s>   e Zd Zdejf‡ fdd„	Zddd„Zdd	„ Zd
d„ Z‡  Z	S )ÚAsyncioQuicManagerNc                    s   t ƒ  ||t¡ d S r   )r   r	   r8   )r   ÚconfÚverify_moder   r   r   r	   ¼   s    zAsyncioQuicManager.__init__éU  r   c                 C   s$   |   ||||¡\}}|r | ¡  |S r   )Ú_connectrg   )r   r@   rA   rB   rC   r   Ústartr   r   r   Úconnect¿   s    zAsyncioQuicManager.connectc                 Ã   s   | S r   r   r   r   r   r   r.   Å   s    zAsyncioQuicManager.__aenter__c                 Ã   s*   t | j ¡ ƒ}|D ]}| ¡ I d H  qdS r/   )ÚlistZ_connectionsÚvaluesr-   )r   r0   r1   r2   Úconnectionsr   r   r   r   r3   È   s    zAsyncioQuicManager.__aexit__)ro   Nr   )
r4   r5   r6   ÚsslÚCERT_REQUIREDr	   rr   r.   r3   r7   r   r   r   r   rl   »   s   
rl   )r
   rI   rv   r   rP   Zaioquic.quic.configurationr]   Zaioquic.quic.connectionZaioquic.quic.eventsZdns.inetrF   Zdns.asyncbackendZdns.quic._commonr   r   r   r   r   r8   rl   r   r   r   r   Ú<module>   s   4p