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 ej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BaseQuicConnectionBaseQuicManager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 )SyncQuicStreamc                    s&   t  || t | _t | _d S N)super__init__	threading	Condition_wake_upLock_lock)self
connection	stream_id	__class__ A/var/www/html/venv/lib/python3.10/site-packages/dns/quic/_sync.pyr
      s   
zSyncQuicStream.__init__c                 C   s   	 |  |}| j | j|r	 W d    d S || _W d    n1 s&w   Y  | j | j|s9tjj	W d    n1 sCw   Y  d| _q)NTr   )
_timeout_from_expirationr   _bufferZhaveZ
_expectingr   waitdns	exceptionTimeout)r   amount
expirationtimeoutr   r   r   wait_for#   s   
zSyncQuicStream.wait_forc                 C   s   	 |  |}| j | j r	 W d    d S W d    n1 s"w   Y  | j | j|s5tjjW d    n1 s?w   Y  qr   )	r   r   r   Zseen_endr   r   r   r   r   )r   r   r   r   r   r   wait_for_end/   s   

zSyncQuicStream.wait_for_endNc                 C   s   |  |}| j r)| | | j | j W  d    S 1 s"w   Y  d S | d| | j t	d| j
d\}W d    n1 sHw   Y  | || | j | j
|W  d    S 1 sgw   Y  d S )N   z!H)Z_expiration_from_timeout_connectionis_h3r!   r   r   get_allr    structunpackget)r   r   r   sizer   r   r   receive9   s   


$
$zSyncQuicStream.receiveFc                 C   s    |  |}| j| j|| d S r   )Z_encapsulater#   writeZ
_stream_id)r   datagramis_enddatar   r   r   sendG   s   
zSyncQuicStream.sendc                 C   sF   |  ||r!| j | j  W d    d S 1 sw   Y  d S d S r   )Z_common_add_inputr   notify)r   r.   r-   r   r   r   
_add_inputK   s
   "zSyncQuicStream._add_inputc                 C   s4   | j  |   W d    d S 1 sw   Y  d S r   )r   _closer   r   r   r   closeP   s   
"zSyncQuicStream.closec                 C      | S r   r   r3   r   r   r   	__enter__T      zSyncQuicStream.__enter__c                 C   s>   |    | j | j  W d    dS 1 sw   Y  dS NF)r4   r   r0   )r   exc_typeexc_valexc_tbr   r   r   __exit__W   s   
zSyncQuicStream.__exit__r   F)__name__
__module____qualname__r
   r    r!   r*   r/   r1   r4   r6   r<   __classcell__r   r   r   r   r      s    


r   c                       s   e Zd Z fddZdd Zdd Zdd Zd	d
 ZdddZd fdd	Z	d fdd	Z
dd ZdddZ fddZdd Z  ZS )SyncQuicConnectionc                    s   t  |||||| t| jtjd| _| jd ur6z| jt	j
| j| j W n ty5   | j   w | j| j t \| _| _| jd | jd t | _d | _t | _d S )Nr   F)r	   r
   socket_factoryZ_afsocket
SOCK_DGRAM_socket_sourcebindr   ZinetZlow_level_address_tuple	Exceptionr4   connect_peer
socketpair_send_wakeup_receive_wakeupsetblockingr   Event_handshake_complete_worker_threadr   r   )r   r   addressportsourcesource_portmanagerr   r   r   r
   _   s$   


zSyncQuicConnection.__init__c                 C   s   d}|dk rA|d7 }z| j t}W n
 ty   Y d S w | j | j|| jt  W d    n1 s6w   Y  |dk sd S d S )Nr   
      )	rF   recvr   BlockingIOErrorr   r#   Zreceive_datagramrK   time)r   countr,   r   r   r   _readr   s   zSyncQuicConnection._readc                 C   s*   	 z| j d W n
 ty   Y d S w q)NT    )rN   rZ   r[   r3   r   r   r   _drain_wakeup}   s   z SyncQuicConnection._drain_wakeupc           	      C   s  zt  }|| jt j| j || jt j| j | js| 	d\}}|
|}|D ]\}}|  q*| j | | W d    n1 sFw   Y  |   | j | jt }W d    n1 sew   Y  |D ]\}}z| j| W ql ty   Y qlw | jrW | j d| _W d    n1 sw   Y  | j  | j  d S | j d| _W d    n1 sw   Y  | j  | j  w )NFT)	selectorsDefaultSelectorregisterrF   
EVENT_READr^   rN   r`   _doneZ_get_timer_valuesselectr.   r   Z_handle_timer_handle_eventsr#   Zdatagrams_to_sendr\   r/   r[   r4   rQ   set)	r   selr   intervalitemskey_Z	datagramsr,   r   r   r   _worker   sD   



zSyncQuicConnection._workerc              	   C   sH  	 | j  | j }W d    n1 sw   Y  |d u rd S t|tjjjr|  r| j	
|}|D ]o}t|tjjjrv| j  | j|j}W d    n1 sRw   Y  |ru|jd u rc|j|_n	|jd u rl|j|_|jru|dd q3t|tjjjr| j  | j|j}W d    n1 sw   Y  |r||j|j q3n| j  | j|j}W d    n1 sw   Y  |r||j|j nZt|tjjjr| j  nLt|tjjjr| j  d| _W d    n1 sw   Y  n-t|tjjjr#| j  | j|j}W d    n	1 sw   Y  |r#|dd q)NT    )r   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HandshakeCompletedrQ   rh   ZConnectionTerminatedre   ZStreamReset)r   eventZ	h3_eventsZh3_eventstreamr   r   r   rg      sd   


z!SyncQuicConnection._handle_eventsFc                 C   sF   | j  | j||| W d    n1 sw   Y  | jd d S N   )r   r#   Zsend_stream_datarM   r/   )r   rx   r.   r-   r   r   r   r+      s   zSyncQuicConnection.writec                    N   | j  t ||| W d    n1 sw   Y  |r%| jd d S d S ry   )r   r	   send_headersrM   r/   )r   r   rv   r-   r   r   r   r|         zSyncQuicConnection.send_headersc                    r{   ry   )r   r	   	send_datarM   r/   )r   r   r.   r-   r   r   r   r~      r}   zSyncQuicConnection.send_datac                 C   s(   | j rd S tj| jd| _| j  d S )N)target)_closedr   Threadrn   rR   startr3   r   r   r   run   s   zSyncQuicConnection.runNc                 C   sj   | j |s
tjj| j | jrt| j	d}t
| |}|| j|< W d    |S 1 s.w   Y  |S r8   )rQ   r   r   r   r   r   re   r   r#   Zget_next_available_stream_idr   rt   )r   r   r   rx   r   r   r   make_stream   s   

zSyncQuicConnection.make_streamc                    s8   | j  t | W d    d S 1 sw   Y  d S r   )r   r	   close_stream)r   r   r   r   r   r      s   "zSyncQuicConnection.close_streamc                 C   s   | j / | jr	 W d    d S | j| jd | jd  d| _| j  | jd W d    n1 s5w   Y  | j	
  d S )Nr   rY   Trz   )r   r   _managerclosedrK   r#   r4   rM   r/   rR   joinr3   r   r   r   r4      s   
zSyncQuicConnection.closer=   r   )r>   r?   r@   r
   r^   r`   rn   rg   r+   r|   r~   r   r   r   r4   rA   r   r   r   r   rB   ^   s    
)
rB   c                       sp   e Zd Zdejddf fdd	Z					ddd	Z fd
dZ fddZ fddZ	dd Z
dd Z  ZS )SyncQuicManagerNFc                    s"   t  ||t|| t | _d S r   )r	   r
   rB   r   r   r   )r   Zconfverify_modeZserver_namers   r   r   r   r
      s   zSyncQuicManager.__init__U  r   Tc           	   	   C   sR   | j  | ||||||\}}|r|  |W  d    S 1 s"w   Y  d S r   )r   _connectr   )	r   rS   rT   rU   rV   Zwant_session_ticketZ
want_tokenr   r   r   r   r   rJ     s   	$zSyncQuicManager.connectc                    s:   | j  t || W d    d S 1 sw   Y  d S r   )r   r	   r   )r   rS   rT   r   r   r   r     s   "zSyncQuicManager.closedc                    <   | j  t ||| W d    d S 1 sw   Y  d S r   )r   r	   save_session_ticket)r   rS   rT   ticketr   r   r   r        "z#SyncQuicManager.save_session_ticketc                    r   r   )r   r	   
save_token)r   rS   rT   tokenr   r   r   r     r   zSyncQuicManager.save_tokenc                 C   r5   r   r   r3   r   r   r   r6     r7   zSyncQuicManager.__enter__c                 C   s$   t | j }|D ]}|  q	dS r8   )listZ_connectionsvaluesr4   )r   r9   r:   r;   connectionsr   r   r   r   r<   !  s   
zSyncQuicManager.__exit__)r   Nr   TT)r>   r?   r@   sslCERT_REQUIREDr
   rJ   r   r   r   r6   r<   rA   r   r   r   r   r      s    
	
r   )ra   rD   r   r&   r   r\   Zaioquic.quic.configurationrq   Zaioquic.quic.connectionZaioquic.quic.eventsZdns.exceptionr   Zdns.inetZdns.quic._commonr   r   r   r   r   rC   r   rB   r   r   r   r   r   <module>   s"   
A 