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 ,