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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__ L/wd/webapps/venvs/v2025_4um/lib/python3.9/site-packages/dns/quic/_asyncio.pyr
      s    zAsyncioQuicStream.__init__c              	      sN   | j 4 I d H & | j  I d H  W d   I d H  qJ1 I d H s@0    Y  d S r   )r   waitr   r   r   r   _wait_for_wake_up   s    z#AsyncioQuicStream._wait_for_wake_upc                    sb   |  |}| j|rd S || _zt|  |I d H  W n tyT   tj	j
Y n0 d| _q d S )Nr   )_timeout_from_expiration_bufferZhaveZ
_expectingr   wait_forr   TimeoutErrordns	exceptionTimeout)r   amount
expirationtimeoutr   r   r   r   "   s    
zAsyncioQuicStream.wait_forc                    sT   |  |}| j rd S zt|  |I d H  W q  tyL   tjj	Y q 0 q d S r   )
r   r   Zseen_endr   r   r   r   r   r   r   )r   r    r!   r   r   r   wait_for_end.   s    

zAsyncioQuicStream.wait_for_endNc                    sx   |  |}| j r.| |I d H  | j S | d|I d H  td| j	d\}| ||I d H  | j	|S d S )N   z!H)
Z_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   )Z_encapsulater$   writeZ
_stream_id)r   datagramis_enddatar   r   r   sendC   s    
zAsyncioQuicStream.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_inputG   s    zAsyncioQuicStream._add_inputc                    s   |    d S r   )_closer   r   r   r   closeL   s    zAsyncioQuicStream.closec                    s   | S r   r   r   r   r   r   
__aenter__Q   s    zAsyncioQuicStream.__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)r4   r   r1   )r   exc_typeexc_valexc_tbr   r   r   	__aexit__T   s    4zAsyncioQuicStream.__aexit__)N)F)__name__
__module____qualname__r
   r   r   r"   r+   r0   r2   r4   r5   r:   __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 r6   )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              	      sX  z0zt j| j}t jd}||tjd| j	| j
d | j
d fI d H | _| j  | j4 I d H ~ | js| jtd I d H \}}|d | j
d ksh|d | j
d krqh| j||t  |  I d H  qhW d   I d H  q1 I d H s0    Y  W n ty   Y n0 W d| _|  I d H  | j  n d| _|  I d H  | j  0 d S )Nr   r      T)r   ZinetZaf_for_addressZ_addressZasyncbackendget_backendZmake_socketsocket
SOCK_DGRAM_source_peerr@   rC   set_donerecvfromr   r$   Zreceive_datagramtime_wakeup	ExceptionrB   )r   afbackendr-   rH   r   r   r   	_receiverf   s0    
$>zAsyncioQuicConnection._receiverc              	      sN   d| _ | j4 I d H   | j  W d   I d H  qJ1 I d H s@0    Y  d S )NT)rG   rD   
notify_allr   r   r   r   rW      s    zAsyncioQuicConnection._wakeupc              	      sZ   | j 4 I d H , | js&| j  I d H  W d   I d H  qP1 I d H sF0    Y  d| _d S r6   )rD   rG   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y   Y n0 | | |  I d H  qd S r   )rC   r   rT   r$   Zdatagrams_to_sendrV   rR   r@   sendtoZ_get_timer_valuesr   r   r]   rX   Z_handle_timer_handle_events)r   Z	datagramsr-   rH   r    intervalr   r   r   _sender   s    
zAsyncioQuicConnection._senderc                    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       TrM   
   )!r$   Z
next_event
isinstanceaioquicZquiceventsZStreamDataReceivedr%   Z_h3_connZhandle_eventh3ZHeadersReceived_streamsr)   r   _headersheadersZ	_trailersZstream_endedr2   ZDataReceivedr/   Z
end_streamZHandshakeCompletedrB   rS   ZConnectionTerminatedrT   rE   cancelZStreamResetr   sleep)r   counteventZ	h3_eventsZh3_eventstreamr   r   r   r_      sN    



z$AsyncioQuicConnection._handle_eventsFc                    s"   | j ||| |  I d H  d S r   )r$   Zsend_stream_datarW   )r   ro   r/   r.   r   r   r   r,      s    zAsyncioQuicConnection.writec                 C   s.   | j r
d S t|  | _t|  | _d S r   )_closedr   Taskr[   rE   ra   rF   r   r   r   r   run   s    zAsyncioQuicConnection.runc                    sf   zt | j |I d H  W n ty6   tjjY n0 | jrBt	| j
d}t| |}|| j|< |S r6   )r   r   rB   r   r   r   r   r   rT   r   r$   Zget_next_available_stream_idr   rh   )r   r!   r   ro   r   r   r   make_stream   s    

z!AsyncioQuicConnection.make_streamc                    s   | j s| j| jd | jd  d| _ | j  | j  |  I d H  z| j	I d H  W n t
jyl   Y n0 z| jI d H  W n t
jy   Y n0 | j I d H  d S )Nr   rM   T)rp   _managerclosedrR   r$   r4   rC   rS   rW   rE   r   ZCancelledErrorrF   r@   r   r   r   r   r4      s    

zAsyncioQuicConnection.close)N)F)N)r;   r<   r=   r
   r[   rW   r]   ra   r_   r,   rr   rs   r4   r>   r   r   r   r   r?   [   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 )AsyncioQuicManagerNFc                    s   t  ||t|| d S r   )r	   r
   r?   )r   Zconfverify_modeZserver_namerg   r   r   r   r
      s    zAsyncioQuicManager.__init__U  r   Tc                 C   s&   |  |||||\}}|r"|  |S r   )_connectrr   )r   rH   rI   rJ   rK   Zwant_session_ticketr   startr   r   r   connect   s    
zAsyncioQuicManager.connectc                    s   | S r   r   r   r   r   r   r5     s    zAsyncioQuicManager.__aenter__c                    s*   t | j }|D ]}| I d H  qdS r6   )listZ_connectionsvaluesr4   )r   r7   r8   r9   connectionsr   r   r   r   r:     s    zAsyncioQuicManager.__aexit__)rx   Nr   T)
r;   r<   r=   sslCERT_REQUIREDr
   r{   r5   r:   r>   r   r   r   r   rv      s   
 

rv   )r   rO   r   r'   rV   Zaioquic.quic.configurationre   Zaioquic.quic.connectionZaioquic.quic.eventsZdns.asyncbackendr   Zdns.exceptionZdns.inetZdns.quic._commonr   r   r   r   r   r   r?   rv   r   r   r   r   <module>   s   	B 