o
    �õ±jª'  ã                   @   sÌ   d dl mZmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlZd dlZd dlZ	 dZdZdZd	Zd
Zd	Zd ZdZdZdZdZdZdZeddd�ZG dd„ dƒZG dd„ dƒZG dd„ dƒZeZ dS )é    )Ú	UniTargetÚUniProto)ÚStreamPacketizer)Ú	UniServer)Úsha1)Ú	b64encodeNé€   é   é   é~   é   é   é   é	   é
   iè  Ú úutf-8)Úencodingc                   @   s>   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )ÚWebSocketServerNc                 C   s>   || _ || _|| _|| _|| _g | _d| _d | _t 	¡ | _
d S )Nr   )Úclient_handlerÚhostÚportÚssl_ctxÚproxiesÚclientsÚ
id_counterÚ_WebSocketServer__main_taskÚasyncioÚEventÚstarted_evt)Úselfr   r   r   r   r   © r!   ú¤/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asysocks/unicomm/protocol/server/websocket/server.pyÚ__init__2   s   zWebSocketServer.__init__c                 Ã   s&   �t  |  ¡ ¡| _t  d¡I d H  | S ©Nr   )r   Úcreate_taskÚserver   Úsleep©r    r!   r!   r"   Ú
__aenter__>   s   €zWebSocketServer.__aenter__c                 Ã   s   �|   ¡ I d H  d S ©N)Ú	terminate)r    Úexc_typeÚexcÚtbr!   r!   r"   Ú	__aexit__C   ó   €zWebSocketServer.__aexit__c                 Ã   s&   �| j D ]	}| ¡ I d H  qg | _ d S r*   )r   r+   )r    Úclientr!   r!   r"   r+   F   s   €

zWebSocketServer.terminatec                 Ã   sP   �| j }|  j d7  _ t|| || jƒ}| j |¡ | ¡ I d H  | j |¡ d S r$   )r   ÚWebSocketClientHandlerr   r   ÚappendÚrunÚremove)r    Ú
connectionÚ	client_idr1   r!   r!   r"   Ú__handle_connectionK   s   €z#WebSocketServer.__handle_connectionc              
   Ã   sˆ   �z+t | j| jtj| jd�}tƒ }t||ƒ}| ¡ 2 z3 d H W }t	 
|  |¡¡}q6 W d S  tyC } zt ¡  W Y d }~d S d }~ww )N)r   )r   r   r   r   Ú
SERVER_TCPr   r   r   r&   r   r%   Ú#_WebSocketServer__handle_connectionÚ	ExceptionÚ	tracebackÚ	print_exc)r    ÚtargetÚ
packetizerÚserverr6   ÚxÚer!   r!   r"   r&   U   s   €
ÿ€ÿzWebSocketServer.serve©NN)	Ú__name__Ú
__module__Ú__qualname__r#   r)   r/   r+   r:   r&   r!   r!   r!   r"   r   1   s    

r   c                   @   sz   e Zd Zdd„ Zedd„ ƒZedd„ ƒZdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdefdd„Zdd„ Zdd„ ZdS )r2   c                 C   s&   || _ || _|| _|| _t ¡ | _d S r*   )r7   r@   r6   r   r   ÚQueueÚincoming_buffer)r    r7   r@   r6   r   r!   r!   r"   r#   b   s
   zWebSocketClientHandler.__init__c                 C   s   dt  | ¡ S )NzgHTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: %s

)r2   Úcalculate_response_key)Úkeyr!   r!   r"   Úmake_handshake_responsei   s   üÿz.WebSocketClientHandler.make_handshake_responsec                 C   s2   d}t |  ¡ | ¡  ƒ}t| ¡ ƒ ¡ }| d¡S )Nz$258EAFA5-E914-47DA-95CA-C5AB0DC85B11ÚASCII)r   Úencoder   ÚdigestÚstripÚdecode)rJ   ÚGUIDÚhashÚresponse_keyr!   r!   r"   rI   r   s   
z-WebSocketClientHandler.calculate_response_keyc                 Ã   s–   �i }| j j d¡I d H }| ¡  ¡ }| ¡  d¡du r"td| ƒ‚	 | j j d¡I d H }| ¡  ¡ }|s8	 |S | dd¡\}}| ¡ || 	¡  ¡ < q#)Ns   
ÚGETFzInvalid HTTP request: %sTú:r   )
r6   r?   Ú	readuntilrP   rO   ÚupperÚ
startswithr;   ÚsplitÚlower)r    ÚheadersÚhttp_rawÚhttp_getÚheaderÚheadÚvaluer!   r!   r"   Ú__read_http_headersy   s   €þúz*WebSocketClientHandler.__read_http_headersc              
   Ã   s¦   �z:|   ¡ I d H }d|vrtdƒ‚|d  ¡ dkrtdƒ‚d|vr%tdƒ‚|d }t |¡}| j | ¡ ¡I d H  W d S  tyR } zt 	¡  W Y d }~d S d }~ww )NÚupgradez9Client tried to connect but was missing an upgrade headerÚ	websocketz-Client tried to connect but was missing a keyzsec-websocket-key)
Ú*_WebSocketClientHandler__read_http_headersr;   rZ   r2   rK   r6   ÚwriterM   r<   r=   )r    r[   rJ   ÚresponserB   r!   r!   r"   Ú	handshakeŠ   s    €
€ÿz WebSocketClientHandler.handshakec              
   C  sF  �z‹	 d\}}| j j d¡I d H }|d }|d }|t@ }|t@ }|t@ }|t@ }|tkr1tdƒ‚|s7tdƒ‚|t	kr?tdƒ‚|d	v rZ| j j |d
krMdnd¡I d H }t
j|dd�}| j j d¡I d H }	tƒ }
| j j |¡I d H }|D ]}||	t|
ƒd  N }|
 |¡ qs|t|
ƒfV  q ty¢ } z
dV  W Y d }~d S d }~ww )NT)r   r   r   r   r   z!Client asked to close connection.zClient must always be masked.z&Continuation frames are not supported.)r   r
   r   r   Úbig)Ú	byteorderé   rC   )r6   r?   ÚreadexactlyÚFINÚOPCODEÚMASKEDÚPAYLOAD_LENÚOPCODE_CLOSE_CONNr;   ÚOPCODE_CONTINUATIONÚintÚ
from_bytesÚ	bytearrayÚlenr3   Úbytes)r    Úb1Úb2ÚresÚfinÚopcodeÚmaskedÚpayload_lengthÚpayload_length_rawÚmasksÚmessage_bytesÚrawÚcrB   r!   r!   r"   Ú__recv_internalœ   s@   € á!€þz&WebSocketClientHandler.__recv_internalc                 Ã   ó0   �t |tƒdu r| d¡}|  t|¡I d H  d S ©NTr   )Ú
isinstanceÚstrrM   Ú&_WebSocketClientHandler__send_internalÚOPCODE_PONG©r    Údatar!   r!   r"   Ú	send_pongÃ   ó   €
z WebSocketClientHandler.send_pongc                 Ã   r„   r…   )r†   r‡   rM   rˆ   ÚOPCODE_PINGrŠ   r!   r!   r"   Ú	send_pingÈ   r�   z WebSocketClientHandler.send_pingc                 Ã   s¨   �|   ¡ 2 zK3 d H W \}}|d u r d S |tkr"| j | d¡¡ q|tkr-| j |¡ q|tkr:|  |¡I d H  q|tkrCt	dƒ q|t
krJ d S t	d| ƒ q6 d S )Nr   zReceived pongzUnknown opcode %s)Ú&_WebSocketClientHandler__recv_internalÚOPCODE_TEXTrH   Ú
put_nowaitrP   ÚOPCODE_BINARYrŽ   rŒ   r‰   Úprintrp   )r    r{   r‹   r!   r!   r"   Ú
start_recvÍ   s    €
ïz!WebSocketClientHandler.start_recvr‹   c                 Ã   sÄ   �t ƒ }t|ƒ}|dkr| t|B ¡ | |¡ n<|dkr7|dkr7| t|B ¡ | t¡ | t d|¡¡ n|dk rQ| t|B ¡ | t¡ | t d|¡¡ nt	dƒ‚| j
 || ¡I d H  d S )Né}   r   iÿÿ  z>Hl            z>Qz5Message is too big. Consider breaking it into chunks.)rt   ru   r3   rl   ÚPAYLOAD_LEN_EXT16ÚextendÚstructÚpackÚPAYLOAD_LEN_EXT64r;   r6   re   )r    r{   r‹   r^   r}   r!   r!   r"   Ú__send_internalã   s    €

z&WebSocketClientHandler.__send_internalc                 Ã   sJ   �t |tƒdu rt}|  || d¡¡I d H  d S t}|  ||¡I d H  d S r…   )r†   r‡   r‘   rˆ   rM   r“   )r    r‹   r{   r!   r!   r"   Úsendý   s   €zWebSocketClientHandler.sendc                 Ã   sJ   �t  | j ¡ ¡}|  ¡ I d H  t  |  ¡ ¡}t| ƒ}|  |¡I d H  d S r*   )r   r%   r6   Ústreamrg   r•   ÚWebSocketClientConnectionr   )r    rA   Úconnr!   r!   r"   r4     s   €zWebSocketClientHandler.runN)rD   rE   rF   r#   ÚstaticmethodrK   rI   rd   rg   r�   rŒ   r�   r•   rv   rˆ   r�   r4   r!   r!   r!   r"   r2   a   s    

'r2   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )rŸ   c                 C   s
   || _ d S r*   )Úclienthandler)r    r¢   r!   r!   r"   r#     s   
z"WebSocketClientConnection.__init__c                 C   s   | S r*   r!   r(   r!   r!   r"   Ú	__aiter__  s   z#WebSocketClientConnection.__aiter__c                 Ã   ó   �| j j ¡ I d H S r*   ©r¢   rH   Úgetr(   r!   r!   r"   Ú	__anext__  r0   z#WebSocketClientConnection.__anext__c                 Ã   r¤   r*   r¥   r(   r!   r!   r"   Úrecv  r0   zWebSocketClientConnection.recvc                 Ã   ó   �| j  |¡I d H  d S r*   )r¢   r�   rŠ   r!   r!   r"   r�     ó   €zWebSocketClientConnection.sendc                 Ã   r©   r*   )r¢   r�   rŠ   r!   r!   r"   Úping  rª   zWebSocketClientConnection.pingN)	rD   rE   rF   r#   r£   r§   r¨   r�   r«   r!   r!   r!   r"   rŸ     s    rŸ   )!Úasysocks.unicomm.common.targetr   r   Ú#asysocks.unicomm.common.packetizersr   Úasysocks.unicomm.serverr   Úhashlibr   Úbase64r   r   r<   r™   rl   rm   rn   ro   r—   r›   rq   r‘   r“   rp   rŽ   r‰   ÚCLOSE_STATUS_NORMALrv   ÚDEFAULT_CLOSE_REASONr   r2   rŸ   r&   r!   r!   r!   r"   Ú<module>   s8   0 ,