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 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__ I/wd/webapps/venvs/v2025_4um/lib/python3.9/site-packages/dns/quic/_sync.pyr
      s    
zSyncQuicStream.__init__c                 C   s   |  |}| j2 | j|r.W d    d S || _W d    n1 sH0    Y  | j$ | j|sntjj	W d    n1 s0    Y  d| _q d S )Nr   )
_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@0    Y  | j$ | j|sftjjW d    q 1 sz0    Y  q d S 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 rP| | | j | j W  d    S 1 sD0    Y  n| d| | j& t	d| j
d\}W d    n1 s0    Y  | || | j | j
|W  d    S 1 s0    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    


*4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   s@   |  ||r<| j | j  W d    n1 s20    Y  d S r   )Z_common_add_inputr   notify)r   r.   r-   r   r   r   
_add_inputK   s    zSyncQuicStream._add_inputc                 C   s2   | j  |   W d    n1 s$0    Y  d S r   )r   _closer   r   r   r   closeP   s    zSyncQuicStream.closec                 C   s   | S r   r   r3   r   r   r   	__enter__T   s    zSyncQuicStream.__enter__c                 C   s<   |    | j | j  W d    n1 s.0    Y  dS NF)r4   r   r0   )r   exc_typeexc_valexc_tbr   r   r   __exit__W   s    (zSyncQuicStream.__exit__)N)F)__name__
__module____qualname__r
   r    r!   r*   r/   r1   r4   r5   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rpz| jt	j
| j| j W n tyn   | j   Y n0 | 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 rx|d7 }z| j t}W n ty8   Y d S 0 | j& | j|| jt  W d    q1 sl0    Y  qd S )Nr   
      )	rC   recvr   BlockingIOErrorr   r#   Zreceive_datagramrH   time)r   countr,   r   r   r   _readr   s    zSyncQuicConnection._readc                 C   s,   z| j d W q  ty$   Y d S 0 q d S )N    )rK   rW   rX   r3   r   r   r   _drain_wakeup}   s    z SyncQuicConnection._drain_wakeupc           	      C   s  zPt  }|| jt j| j || jt j| j | js| 	d\}}|
|}|D ]\}}|  qX| j | | W d    n1 s0    Y  |   | j  | jt }W d    n1 s0    Y  |D ].\}}z| j| W q ty   Y q0 qq4W | j d| _W d    n1 s40    Y  | j  | j  nD| j d| _W d    n1 sx0    Y  | j  | j  0 d S )NFT)	selectorsDefaultSelectorregisterrC   
EVENT_READr[   rK   r]   _doneZ_get_timer_valuesselectr.   r   Z_handle_timer_handle_eventsr#   Zdatagrams_to_sendrY   r/   rX   r4   rN   set)	r   selr   intervalitemskey_Z	datagramsr,   r   r   r   _worker   s6    

(.&
&
zSyncQuicConnection._workerc              	   C   sV  | j  | j }W d    n1 s&0    Y  |d u r<d S t|tjjjr|  rL| j	
|}|D ]}t|tjjjr| j  | j|j}W d    n1 s0    Y  |r|jd u r|j|_n|jd u r|j|_|jr|dd qht|tjjjrh| j  | j|j}W d    n1 s*0    Y  |rh||j|j qhnL| j  | j|j}W d    n1 sx0    Y  |rP||j|j q t|tjjjr| j  q t|tjjjr| j  d| _W d    n1 s0    Y  q t|tjjjr | j  | j|j}W d    n1 s60    Y  |r |dd q d S )N    T)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HandshakeCompletedrN   re   ZConnectionTerminatedrb   ZStreamReset)r   eventZ	h3_eventsZh3_eventstreamr   r   r   rd      sJ    (
,


..(.z!SyncQuicConnection._handle_eventsFc                 C   sF   | j   | j||| W d    n1 s,0    Y  | jd d S N   )r   r#   Zsend_stream_datarJ   r/   )r   ru   r.   r-   r   r   r   r+      s    .zSyncQuicConnection.writec                    sJ   | j   t ||| W d    n1 s,0    Y  |rF| jd d S rv   )r   r	   send_headersrJ   r/   )r   r   rs   r-   r   r   r   rx      s    .zSyncQuicConnection.send_headersc                    sJ   | j   t ||| W d    n1 s,0    Y  |rF| jd d S rv   )r   r	   	send_datarJ   r/   )r   r   r.   r-   r   r   r   ry      s    .zSyncQuicConnection.send_datac                 C   s(   | j r
d S tj| jd| _| j  d S )N)target)_closedr   Threadrk   rO   startr3   r   r   r   run   s    zSyncQuicConnection.runNc                 C   sh   | j |stjj| j: | jr&t| j	d}t
| |}|| j|< W d    n1 sZ0    Y  |S r6   )rN   r   r   r   r   r   rb   r   r#   Zget_next_available_stream_idr   rq   )r   r   r   ru   r   r   r   make_stream   s    
(zSyncQuicConnection.make_streamc                    s6   | j  t | W d    n1 s(0    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 sh0    Y  | j	
  d S )Nr   rV   Trw   )r   r{   _managerclosedrH   r#   r4   rJ   r/   rO   joinr3   r   r   r   r4      s    
*zSyncQuicConnection.close)F)F)F)N)r;   r<   r=   r
   r[   r]   rk   rd   r+   rx   ry   r~   r   r   r4   r>   r   r   r   r   r?   ^   s   )

r?   c                       sf   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
   r?   r   r   r   )r   Zconfverify_modeZserver_namerp   r   r   r   r
      s    zSyncQuicManager.__init__U  r   Tc           	   	   C   sR   | j 8 | ||||||\}}|r,|  |W  d    S 1 sD0    Y  d S r   )r   _connectr~   )	r   rP   rQ   rR   rS   Zwant_session_ticketZ
want_tokenr   r}   r   r   r   rG     s    	zSyncQuicManager.connectc                    s8   | j  t || W d    n1 s*0    Y  d S r   )r   r	   r   )r   rP   rQ   r   r   r   r     s    zSyncQuicManager.closedc                    s:   | j   t ||| W d    n1 s,0    Y  d S r   )r   r	   save_session_ticket)r   rP   rQ   ticketr   r   r   r     s    z#SyncQuicManager.save_session_ticketc                    s:   | j   t ||| W d    n1 s,0    Y  d S r   )r   r	   
save_token)r   rP   rQ   tokenr   r   r   r     s    zSyncQuicManager.save_tokenc                 C   s   | S r   r   r3   r   r   r   r5     s    zSyncQuicManager.__enter__c                 C   s$   t | j }|D ]}|  qdS r6   )listZ_connectionsvaluesr4   )r   r7   r8   r9   connectionsr   r   r   r   r:   !  s    
zSyncQuicManager.__exit__)r   Nr   TT)r;   r<   r=   sslCERT_REQUIREDr
   rG   r   r   r   r5   r:   r>   r   r   r   r   r      s   
	     
r   )r^   rA   r   r&   r   rY   Zaioquic.quic.configurationrn   Zaioquic.quic.connectionZaioquic.quic.eventsZdns.exceptionr   Zdns.inetZdns.quic._commonr   r   r   r   r   r@   r   r?   r   r   r   r   r   <module>   s    
A 