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__ J/var/www/html/olx_land/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   _bufferhave
_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   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)_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   )_encapsulater'   write
_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   )_common_add_inputr   notify)r   r4   r3   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   r:   r   r   r   	__enter__T      zSyncQuicStream.__enter__c                 C   s>   |    | j | j  W d    dS 1 sw   Y  dS NF)r;   r   r7   )r   exc_typeexc_valexc_tbr   r   r   __exit__W   s   
zSyncQuicStream.__exit__r   F)__name__
__module____qualname__r
   r"   r$   r.   r5   r8   r;   r=   rC   __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_factory_afsocket
SOCK_DGRAM_socket_sourcebindr   inetlow_level_address_tuple	Exceptionr;   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   
      )	rN   recvr   BlockingIOErrorr   r'   receive_datagramrU   time)r   countr2   r   r   r   _readr   s   zSyncQuicConnection._readc                 C   s*   	 z| j d W n
 ty   Y d S w q)NT    )rX   rd   re   r:   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registerrN   
EVENT_READri   rX   rk   _done_get_timer_valuesselectr4   r   _handle_timer_handle_eventsr'   datagrams_to_sendrg   r5   re   r;   r[   set)	r   selr    intervalitemskey_	datagramsr2   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'   
next_event
isinstanceaioquicquiceventsStreamDataReceivedr(   _h3_connhandle_eventh3HeadersReceived_streamsr,   r   _headersheaders	_trailersstream_endedr8   DataReceivedr4   
end_streamHandshakeCompletedr[   rv   ConnectionTerminatedrp   StreamReset)r   event	h3_eventsh3_eventstreamr   r   r   rt      sd   


z!SyncQuicConnection._handle_eventsFc                 C   sF   | j  | j||| W d    n1 sw   Y  | jd d S N   )r   r'   send_stream_datarW   r5   )r   r   r4   r3   r   r   r   r0      s   zSyncQuicConnection.writec                    N   | j  t ||| W d    n1 sw   Y  |r%| jd d S d S r   )r   r	   send_headersrW   r5   )r   r   r   r3   r   r   r   r         zSyncQuicConnection.send_headersc                    r   r   )r   r	   	send_datarW   r5   )r   r   r4   r3   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   Threadr}   r\   startr:   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 r?   )r[   r   r   r   r   r   rp   r   r'   get_next_available_stream_idr   r   )r   r!   r   r   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   rc   Tr   )r   r   _managerclosedrU   r'   r;   rW   r5   r\   joinr:   r   r   r   r;      s   
zSyncQuicConnection.closerD   r   )rE   rF   rG   r
   ri   rk   r}   rt   r0   r   r   r   r   r   r;   rH   r   r   r   r   rI   ^   s    
)
rI   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
   rI   r   r   r   )r   confverify_modeserver_namer   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   r]   r^   r_   r`   want_session_ticket
want_tokenr   r   r   r   r   rT     s   	$zSyncQuicManager.connectc                    s:   | j  t || W d    d S 1 sw   Y  d S r   )r   r	   r   )r   r]   r^   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   r]   r^   ticketr   r   r   r        "z#SyncQuicManager.save_session_ticketc                    r   r   )r   r	   
save_token)r   r]   r^   tokenr   r   r   r     r   zSyncQuicManager.save_tokenc                 C   r<   r   r   r:   r   r   r   r=     r>   zSyncQuicManager.__enter__c                 C   s$   t | j }|D ]}|  q	dS r?   )list_connectionsvaluesr;   )r   r@   rA   rB   connectionsr   r   r   r   rC   !  s   
zSyncQuicManager.__exit__)r   Nr   TT)rE   rF   rG   sslCERT_REQUIREDr
   rT   r   r   r   r=   rC   rH   r   r   r   r   r      s    
	
r   )rl   rL   r   r*   r   rg   aioquic.quic.configurationr   aioquic.quic.connectionaioquic.quic.eventsdns.exceptionr   dns.inetdns.quic._commonr   r   r   r   r   rJ   r   rI   r   r   r   r   r   <module>   s"   
A 