a
   ®0(ž³¥ã                   @   sX  d 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T ddlT ddl	T ddl
T eedƒrnejrnddlmZ nddlmZ eedƒr¶ejr¶eed	ƒr¨ejr¨dd
lmZ q¾ddlmZ nddlZg d¢ZeedƒrØejZndd„ ZdZejejejfZeejf Zeƒ ZG dd„ de ƒZ!dd„ Z"dd„ Z#dd„ Z$efdd„Z%dddœZ&dd„ Z'dd „ Z(dS )!aL  
websocket - WebSocket client library for Python

Copyright (C) 2010 Hiroki Ohtani(liris)

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA  02110-1335  USA

é    Né   )ÚSimpleCookieJar)Ú*ÚPY3)Úencodebytes)ÚencodestringÚPY34)Úclient)Ú
HTTPStatus)Úhandshake_responseÚ	handshakeÚSUPPORTED_REDIRECT_STATUSESÚcompare_digestc                 C   s   | |kS )N© )Ús1Ús2r   r   ú8/usr/lib/python3.9/site-packages/websocket/_handshake.pyr   4   s    é   c                   @   s   e Zd Zdd„ ZdS )r   c                 C   s&   || _ || _|| _t | d¡¡ d S )Nz
set-cookie)ÚstatusÚheadersÚsubprotocolÚ	CookieJarÚaddÚget)Úselfr   r   r   r   r   r   Ú__init__B   s    zhandshake_response.__init__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   @   s   r   c                 K   s~   t ||||ƒ\}}d |¡}t| |ƒ td|ƒ t| ƒ\}}	|tv rPt||	d ƒS t|	|| d¡ƒ\}
}|
srt	dƒ‚t||	|ƒS )Nz
zrequest headerÚsubprotocolszInvalid WebSocket Header)
Ú_get_handshake_headersÚjoinÚsendÚdumpÚ_get_resp_headersr   r   Ú	_validater   ZWebSocketException)ÚsockÚhostnameÚportÚresourceÚoptionsr   ÚkeyZ
header_strr   ZrespÚsuccessÚsubprotor   r   r   r   I   s    


r   c                 C   s   d| v rd|  d S | S )Nú:ú[ú]r   )r'   r   r   r   Ú_pack_hostnameZ   s    r1   c                 C   sþ  d|  dg}|dks|dkr&t |ƒ}ndt |ƒ|f }d|v r^|d d ur^| d|d  ¡ n| d| ¡ d|vs||d s²d	|v r¤|d	 d ur¤| d
|d	  ¡ n| d| ¡ tƒ }d|vsÌd|d vrâtƒ }| d| ¡ n|d d }d|vsd|d vr| dt ¡ d|vs,|d d u r8| d¡ n| |d ¡ | d¡}|rj| dd |¡ ¡ d|v r¤|d }t|tƒršdd„ | ¡ D ƒ}| 	|¡ t
 |¡}	| dd ¡}
d td |	|
gƒ¡}|râ| d| ¡ | d¡ | d¡ ||fS )NzGET %s HTTP/1.1zUpgrade: websocketéP   i»  z%s:%dÚhostzHost: %sZsuppress_originÚoriginz
Origin: %szOrigin: http://%sÚheaderzSec-WebSocket-KeyzSec-WebSocket-Key: %szSec-WebSocket-VersionzSec-WebSocket-Version: %sÚ
connectionzConnection: upgrader   zSec-WebSocket-Protocol: %sú,c                 S   s&   g | ]\}}|d urd  ||g¡‘qS )Nz: )r!   )Ú.0ÚkÚvr   r   r   Ú
<listcomp>   s   þz*_get_handshake_headers.<locals>.<listcomp>Úcookiez; z
Cookie: %sÚ )r1   ÚappendÚ_create_sec_websocket_keyÚVERSIONr   r!   Ú
isinstanceÚdictÚitemsÚextendr   Úfilter)r)   r3   r(   r*   r   Zhostportr+   r   r5   Zserver_cookieZclient_cookier<   r   r   r   r    a   sR    þ


þ



r    c                 C   s,   t | ƒ\}}}||vr$td|||ƒ‚||fS )NzHandshake status %d %s)Zread_headersZWebSocketBadStatusException)r&   Zsuccess_statusesr   Zresp_headersZstatus_messager   r   r   r$   ¢   s    r$   Z	websocketÚupgrade)rF   r6   c                 C   sø   d }t  ¡ D ]4\}}|  |d ¡}|s* dS | ¡ }||kr dS q|r€|  dd ¡ ¡ }|rl|dd„ |D ƒvr€tdt|ƒ ƒ dS |  dd ¡}|s”dS | ¡ }t|tjƒr²| 	d¡}|d  	d¡}t
t |¡ ¡ ƒ ¡  ¡ }	t|	|ƒ}
|
rðd	|fS dS d S )
N)FNzsec-websocket-protocolc                 S   s   g | ]}|  ¡ ‘qS r   )Úlower)r8   Úsr   r   r   r;   »   ó    z_validate.<locals>.<listcomp>zInvalid subprotocol: zsec-websocket-acceptúutf-8z$258EAFA5-E914-47DA-95CA-C5AB0DC85B11T)Ú_HEADERS_TO_CHECKrC   r   rG   ÚerrorÚstrrA   ÚsixZ	text_typeÚencodeÚbase64encodeÚhashlibZsha1ZdigestÚstripr   )r   r+   r   r-   r9   r:   ÚrÚresultÚvalueZhashedr,   r   r   r   r%   ¯   s2    

r%   c                  C   s   t  d¡} t| ƒ d¡ ¡ S )Né   rJ   )ÚosÚurandomrP   ÚdecoderR   )Z
randomnessr   r   r   r?   Ñ   s    
r?   ))Ú__doc__rQ   ZhmacrW   rN   Z
_cookiejarr   Ú_exceptionsZ_httpZ_loggingZ_socketÚhasattrr   Úbase64r   rP   r   r   Úhttpr	   r
   ZhttplibÚ__all__r   r@   ZMOVED_PERMANENTLYZFOUNDZ	SEE_OTHERr   ZSWITCHING_PROTOCOLSZSUCCESS_STATUSESr   Úobjectr   r   r1   r    r$   rK   r%   r?   r   r   r   r   Ú<module>   sF   
	Aþ"