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mZ d dlmZm	Z	 d dl
mZ d dlmZ G dd„ dƒZG dd	„ d	ƒZ	 d dlZd dlZG d
d„ dejƒZG dd„ dƒZG dd„ deƒZG dd„ deƒZdS )é    N)Ú	UniTarget)Ú
PacketizerÚStreamPacketizer)ÚPacketizerSSL)ÚUNITransportc                   @   sÄ   e Zd Zd*dejdejdededef
dd„Z	d	d
„ Z
dd„ Zd+dd„Zdd„ Zdd„ Zdd„ Zd*dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%ejfd&d'„Zd%ejfd(d)„ZdS ),ÚUniConnectionNÚreaderÚwriterÚ
packetizerÚpeer_ipÚ	peer_portc                 C   sV   || _ || _|| _|| _|| _d | _d| _t ¡ | _	t 
¡ | _t ¡ | _| j ¡  d S ©NF)r   r	   r
   r   r   Úpacketizer_taskÚclosingÚasyncioÚEventÚ
closed_evtÚLockÚ	read_lockÚread_resumeÚset)Úselfr   r	   r
   r   r   © r   ú•/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asysocks/unicomm/common/connection.pyÚ__init__   s   


zUniConnection.__init__c                 Ã   s   �| S ©Nr   ©r   r   r   r   Ú
__aenter__   ó   €zUniConnection.__aenter__c                 Ã   s   �|   ¡ I d H  d S r   )Úclose)r   Úexc_typeÚexcÚtbr   r   r   Ú	__aexit__   s   €zUniConnection.__aexit__c                 C   s<   t | jdƒr| j ||¡S |dkr| jd ur| j| jfS |S )NÚget_extra_infoÚpeername)Úhasattrr	   r$   r   r   )r   ÚnameÚdefaultr   r   r   r$   !   s
   zUniConnection.get_extra_infoc                 C   s
   | j  ¡ S r   )r
   Úget_peer_certificater   r   r   r   r)   *   ó   
z"UniConnection.get_peer_certificatec                 C   s,   | j  ¡ }t| j tƒr|| j _ d S || _ d S r   )r
   Úflush_bufferÚ
isinstancer   )r   r
   Úrem_datar   r   r   Úchange_packetizer-   s   

zUniConnection.change_packetizerc                 O   s   | j j|i |¤ŽS r   )r
   Úpacketizer_control)r   ÚargsÚkwr   r   r   r/   4   ó   z UniConnection.packetizer_controlc                 Ã   sV   �|d u r| j }|d u rt ¡ }d|_tj|_t||ƒ| _ | j  | j| j	¡I d H  d S r   )
r
   ÚsslÚcreate_default_contextÚcheck_hostnameÚ	CERT_NONEÚverify_moder   Údo_handshaker   r	   )r   Ússl_ctxr
   r   r   r   Úwrap_ssl7   s   €zUniConnection.wrap_sslc                 Ã   s*   �d| _ | jd ur| j ¡  | j ¡  d S ©NT)r   r	   r   r   r   r   r   r   r   r   A   s
   €

zUniConnection.closec                 Ã   s   �d S r   r   r   r   r   r   ÚdrainG   r   zUniConnection.drainc                 Ã   s>   �| j  |¡2 z3 d H W }| j |¡ | j ¡ I d H  q6 d S r   )r
   Údata_outr	   Úwriter<   )r   ÚdataÚpacketr   r   r   r>   J   s
   €þzUniConnection.writec                 Ã   s$   �|   ¡ 2 z	3 d H W }|  S 6 d S r   )Úread)r   r@   r   r   r   Úread_oneO   s   €ÿzUniConnection.read_onec              
   C  sÒ   �zQd }| j du r5| j |¡2 z3 d H W }|d u r n|V  q6 | j | jj¡I d H }|dkr0n| j du s	d }| j |¡2 z3 d H W }|d u rK W d S |V  q=6 W d S  tyh } z
d V  W Y d }~d S d }~ww )NFó    )r   r
   Údata_inr   rA   Úbuffer_sizeÚ	Exception)r   r?   ÚresultÚer   r   r   rA   S   s.   €
ý
øý€ÿzUniConnection.readc                 Ã   sN   �t | jtƒstdƒ‚	 | j | jj¡I d H }| j |¡I d H  |dkr&d S q)Nz<This function onaly available when StreamPacketizer is used!TrC   )r,   r
   r   rF   r   rA   rE   rD   ©r   r?   r   r   r   Ústreami   s   €üzUniConnection.streamc              	   Ã   s\   �| j  ¡  | j4 I d H š | j  ¡ I d H  W d   ƒI d H  d S 1 I d H s'w   Y  d S r   )r   Úclearr   Úwaitr   r   r   r   Úpause_readingt   s
   €
.ÿzUniConnection.pause_readingÚprotocolc              
   Ã   s"  �d }z‡z^d }	 | j 4 I d H šF | j |¡2 z3 d H W }|d u r&| ¡   n| |¡ q6 | j | jj¡I d H }|dkrK| ¡  	 W d   ƒI d H  nW d   ƒI d H  n1 I d H s[w   Y  qW n tyz } zt	 
¡  |}W Y d }~nd }~ww W | |¡ d S W | |¡ d S | |¡ w )NTrC   )r   r
   rD   Úeof_receivedÚdata_receivedr   rA   rE   rF   Ú	tracebackÚ	print_excÚconnection_lost)r   rN   Úerrr?   rG   rH   r   r   r   Ú__transport_readery   s<   €üö(øÿ€þõþz UniConnection.__transport_readerc                 Ã   s*   �t | |ƒ}| |¡ t |  |¡¡}|S r   )r   Úconnection_mader   Úcreate_taskÚ _UniConnection__transport_reader)r   rN   Ú	transportÚxr   r   r   Úget_transport�   s
   €

zUniConnection.get_transport)NNr   )Ú__name__Ú
__module__Ú__qualname__r   ÚStreamReaderÚStreamWriterr   ÚstrÚintr   r   r#   r$   r)   r.   r/   r:   r   r<   r>   rB   rA   rJ   rM   ÚProtocolrX   r[   r   r   r   r   r      s$    $
	

r   c                   @   s   e Zd Zdd„ ZdS )ÚUniUDPConnectionc                 C   s   || _ || _|| _d S r   )Úsocketr?   Úaddr)r   re   r?   rf   r   r   r   r   —   s   
zUniUDPConnection.__init__N)r\   r]   r^   r   r   r   r   r   rd   –   s    rd   c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )ÚDatagramEndpointProtocolz8Datagram protocol for the endpoint high-level interface.c                 C   s
   || _ d S r   )Ú	_endpoint)r   Úendpointr   r   r   r   ¾   r*   z!DatagramEndpointProtocol.__init__c                 C   s   || j _d S r   )rh   Ú
_transport)r   rY   r   r   r   rV   Ã   s   z(DatagramEndpointProtocol.connection_madec                 C   s4   |d u sJ ‚| j jd ur| j j d ¡ | j  ¡  d S r   )rh   Ú_write_ready_futureÚ
set_resultr   )r   r!   r   r   r   rS   Æ   s   z(DatagramEndpointProtocol.connection_lostc                 C   s   | j  ||¡ d S r   )rh   Úfeed_datagram©r   r?   rf   r   r   r   Údatagram_receivedÎ   r2   z*DatagramEndpointProtocol.datagram_receivedc                 C   s   d}t  | |¡¡ d S )Nz Endpoint received an error: {!r})ÚwarningsÚwarnÚformat)r   r!   Úmsgr   r   r   Úerror_receivedÑ   s   z'DatagramEndpointProtocol.error_receivedc                 C   s*   | j jd u sJ ‚| j jj}| ¡ | j _d S r   )rh   rk   rj   Ú_loopÚcreate_future)r   Úloopr   r   r   Úpause_writing×   s   
z&DatagramEndpointProtocol.pause_writingc                 C   s*   | j jd usJ ‚| j j d ¡ d | j _d S r   )rh   rk   rl   r   r   r   r   Úresume_writingÜ   s   z'DatagramEndpointProtocol.resume_writingN)r\   r]   r^   Ú__doc__r   rV   rS   ro   rt   rx   ry   r   r   r   r   rg   »   s    rg   c                   @   s†   e Zd ZdZddefdd„Zdd„ Zdd	„ Zdd
d„Zddd„Z	ddd„Z
dd„ Zdd„ Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZdS )ÚEndpointz“High-level interface for UDP enpoints.
	Can either be local or remote.
	It is initialized with an optional queue size for the incoming datagrams.
	NÚtargetc                 C   s4   || _ |d u r	d}t |¡| _d| _d | _d | _d S )Nr   F)r|   r   ÚQueueÚ_queueÚ_closedrj   rk   )r   r|   Ú
queue_sizer   r   r   r   ê   s   
zEndpoint.__init__c                 C   s8   z| j  ||f¡ W d S  tjy   t d¡ Y d S w )NzEndpoint queue is full)r~   Ú
put_nowaitr   Ú	QueueFullrp   rq   rn   r   r   r   rm   õ   s
   ÿzEndpoint.feed_datagramc                 C   s>   | j rd S d| _ | j ¡ r|  d d ¡ | jr| j ¡  d S d S r;   )r   r~   Úemptyrm   rj   r   r   r   r   r   r   û   s   
ÿzEndpoint.closec                 Ã   s(   �|du r| j  ¡ | j jf}|  ||¡S )ú%Send a datagram to the given address.N)r|   Úget_ip_or_hostnameÚportÚsendrn   r   r   r   r>   	  s   €zEndpoint.writeFc                 C  sZ   �| j s+|  ¡ I dH \}}|du r|  ¡  dS ||f}|du r#|V  n|V  | j rdS dS ©únWait for an incoming datagram and return it with
		the corresponding address.
		This method is a coroutine.
		NT)r   Úreceiver   )r   Ú	with_addrr?   rf   rG   r   r   r   rA     s   €özEndpoint.readc                 Ã   s<   �|   ¡ I dH \}}|du r|  ¡  dS |du r||fS |S rˆ   )rŠ   r   )r   r‹   r?   rf   r   r   r   rB      s   €zEndpoint.read_onec                 C   sJ   | j rtdƒ‚t | jj¡du rt | j ||¡¡}dS | j ||¡ dS )r„   úEnpoint is closedTN)r   ÚIOErrorr   Úiscoroutinerj   ÚsendtorW   )r   r?   rf   rZ   r   r   r   r‡   -  s
   zEndpoint.sendc                 Ã   sF   �| j  ¡ r| jrtdƒ‚| j  ¡ I dH \}}|du rtdƒ‚||fS )r‰   rŒ   N)r~   rƒ   r   r�   Úgetrn   r   r   r   rŠ   7  s   €zEndpoint.receivec                 C   s$   | j rtdƒ‚| j ¡  |  ¡  dS )z Close the transport immediately.rŒ   N)r   r�   rj   Úabortr   r   r   r   r   r‘   C  s   
zEndpoint.abortc                 Ã   s    �| j dur| j I dH  dS dS )z4Drain the transport buffer below the low-water mark.N)rk   r   r   r   r   r<   J  s   €
ÿzEndpoint.drainc                 C   s   | j  d¡ ¡ S )z-The endpoint address as a (host, port) tuple.re   )rj   r$   Úgetsocknamer   r   r   r   ÚaddressQ  s   zEndpoint.addressc                 C   s   | j S )z0Indicates whether the endpoint is closed or not.)r   r   r   r   r   ÚclosedV  s   zEndpoint.closedr   )F)r\   r]   r^   rz   r   r   rm   r   r>   rA   rB   r‡   rŠ   r‘   r<   Úpropertyr“   r”   r   r   r   r   r{   ä   s     




r{   c                   @   s   e Zd ZdZdS )ÚLocalEndpointzyHigh-level interface for UDP local enpoints.
	It is initialized with an optional queue size for the incoming datagrams.
	N)r\   r]   r^   rz   r   r   r   r   r–   \  s    r–   c                       s,   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡  ZS )ÚRemoteEndpointzzHigh-level interface for UDP remote enpoints.
	It is initialized with an optional queue size for the incoming datagrams.
	c                    s   t ƒ  |d¡ dS )z#Send a datagram to the remote host.N)Úsuperr‡   rI   ©Ú	__class__r   r   r‡   h  s   zRemoteEndpoint.sendc                 ƒ   s   �t ƒ  ¡ I dH \}}|S )zU Wait for an incoming datagram from the remote host.
		This method is a coroutine.
		N)r˜   rŠ   rn   r™   r   r   rŠ   l  s   €zRemoteEndpoint.receive)r\   r]   r^   rz   r‡   rŠ   Ú__classcell__r   r   r™   r   r—   c  s    r—   )r3   Úcopyr   rQ   Ú	ipaddressÚasysocks.unicomm.common.targetr   Ú#asysocks.unicomm.common.packetizersr   r   Ú'asysocks.unicomm.common.packetizers.sslr   Ú!asysocks.unicomm.common.transportr   r   rd   rp   ÚDatagramProtocolrg   r{   r–   r—   r   r   r   r   Ú<module>   s&     
)x