o
    Þý°jæ*  ã                   @   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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__© ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/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_end1   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   Úreceive;   s   


$ÿÿ
$ÿzSyncQuicStream.receiveFc                 C   s    |   |¡}| j | j||¡ d S r   )Ú_encapsulater'   ÚwriteÚ
_stream_id)r   ÚdatagramÚis_endÚdatar   r   r   ÚsendI   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_inputM   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   ÚcloseR   s   
"ÿzSyncQuicStream.closec                 C   ó   | S r   r   r:   r   r   r   Ú	__enter__V   ó   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__Y   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
   a   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   Ú_readt   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Ê  zÃz–t  ¡ �ˆ}| | jt j| j¡ | | jt j| j¡ | js‡|  	d¡\}}| 
|¡}|D ]\}}| ¡  q,| j� |  |¡ W d   ƒ n1 sHw   Y  |  ¡  | j� | j t ¡ ¡}W d   ƒ n1 sgw   Y  |D ]\}}z| j |¡ W qn tyƒ   Y qnw | jrW d   ƒ n1 s‘w   Y  W n	 ty    Y nw W | j� d| _W d   ƒ n1 s³w   Y  | j ¡  | j ¡  d S | j� d| _W d   ƒ n1 sÕw   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   rS   r;   r[   Úset)	r   Úselr    ÚintervalÚitemsÚkeyÚ_Ú	datagramsr2   r   r   r   Ú_worker†   sT   
ÿ

ÿÿþó€û€ý€ÿ
üÿ
zSyncQuicConnection._workerc              	   C   sV  	 | j � | j ¡ }W d   ƒ n1 sw   Y  |d u rd S t|tjjjƒrÐ|  ¡ r«| j	d us2J ‚| j	 
|¡}|D ]o}t|tjjjƒr}| j � | j |j¡}W d   ƒ n1 sYw   Y  |r||jd u rj|j|_n	|jd u rs|j|_|jr|| dd¡ q:t|tjjjƒr©| j � | j |j¡}W d   ƒ n1 sšw   Y  |r©| |j|j¡ q:n| j � | j |j¡}W d   ƒ n1 sÀw   Y  |rÏ| |j|j¡ nZt|tjjjƒrÞ| j ¡  nLt|tjjjƒrý| j � d| _W d   ƒ n1 s÷w   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   ¨   sf   ÿÿ


€ÿ€ñÿ€ÿ€ÿÙ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 �4 | jr	 W d   ƒ d S | jd ur"| j | jd | jd ¡ d| _| j ¡  | j d¡ W d   ƒ n1 s:w   Y  | j	d urK| j	 
¡  d S 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.h3.connectionr�   Úaioquic.h3.eventsÚaioquic.quic.configurationÚ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 &