U
    m{r['  ã                   @   sì   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jrdddlmZ nddlmZ dd	gZeed
ƒrŠejZndd
„ ZdZeƒ ZG dd„ deƒZdd	„ Zdd„ Zdd„ Zd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)Ú*)Úencodebytes)ÚencodestringÚhandshake_responseÚ	handshakeÚcompare_digestc                 C   s   | |kS )N© )Ús1Ús2r
   r
   ú6/usr/lib/python3/dist-packages/websocket/_handshake.pyr	   ,   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__7   s    zhandshake_response.__init__N)Ú__name__Ú
__module__Ú__qualname__r   r
   r
   r
   r   r   5   s   c                 K   sj   t ||||ƒ\}}d |¡}t| |ƒ td|ƒ t| ƒ\}}	t|	|| d¡ƒ\}
}|
s^tdƒ‚t||	|ƒS )Nz
zrequest headerÚsubprotocolszInvalid WebSocket Header)	Ú_get_handshake_headersÚjoinÚsendÚdumpÚ_get_resp_headersÚ	_validater   ZWebSocketExceptionr   )ÚsockÚhostnameÚportÚresourceÚoptionsr   ÚkeyZ
header_strr   ZrespÚsuccessÚsubprotor
   r
   r   r   >   s    


c                 C   s   d| krd|  d S | S )Nú:ú[ú]r
   )r"   r
   r
   r   Ú_pack_hostnameL   s    r,   c                 C   sŒ  d|  ddg}|dks|dkr(t |ƒ}ndt |ƒ|f }d|kr`|d d k	r`| d|d  ¡ n| d| ¡ d	|ks~|d	 s´d
|kr¦|d
 d k	r¦| d|d
  ¡ n| d| ¡ tƒ }| d| ¡ | dt ¡ | d¡}|rø| dd |¡ ¡ d|kr2|d }t|tƒr(dd„ | ¡ D ƒ}| 	|¡ t
 |¡}	| dd ¡}
d td |	|
gƒ¡}|rp| d| ¡ | d¡ | d¡ ||fS )NzGET %s HTTP/1.1zUpgrade: websocketzConnection: UpgradeéP   i»  z%s:%dÚhostzHost: %sZsuppress_originÚoriginz
Origin: %szOrigin: http://%szSec-WebSocket-Key: %szSec-WebSocket-Version: %sr   zSec-WebSocket-Protocol: %sú,Úheaderc                 S   s&   g | ]\}}|d k	rd  ||g¡‘qS )Nz: )r   )Ú.0ÚkÚvr
   r
   r   Ú
<listcomp>t   s   þz*_get_handshake_headers.<locals>.<listcomp>Úcookiez; z
Cookie: %sÚ )r,   ÚappendÚ_create_sec_websocket_keyÚVERSIONr   r   Ú
isinstanceÚdictÚitemsÚextendr   Úfilter)r$   r.   r#   r%   r   Zhostportr&   r   r1   Zserver_cookieZclient_cookier6   r
   r
   r   r   S   sF    ý


þ



r   ée   c                 C   s*   t | ƒ\}}}||kr"td||ƒ‚||fS )NzHandshake status %d %s)Zread_headersZWebSocketBadStatusException)r!   Zsuccess_statusr   Zresp_headersZstatus_messager
   r
   r   r   ‰   s    r   Z	websocketÚupgrade)rA   Z
connectionc                 C   sø   d }t  ¡ D ]4\}}|  |d ¡}|s* dS | ¡ }||kr dS q|r€|  dd ¡ ¡ }|rl|dd„ |D ƒk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)r2   Úsr
   r
   r   r5   ¡   s     z_validate.<locals>.<listcomp>zInvalid subprotocol: zsec-websocket-acceptúutf-8z$258EAFA5-E914-47DA-95CA-C5AB0DC85B11T)Ú_HEADERS_TO_CHECKr=   r   rB   ÚerrorÚstrr;   ÚsixZ	text_typeÚencodeÚbase64encodeÚhashlibZsha1ZdigestÚstripr	   )r   r&   r   r(   r3   r4   ÚrÚresultÚvalueZhashedr'   r
   r
   r   r    •   s2    

r    c                  C   s   t  d¡} t| ƒ d¡ ¡ S )Né   rD   )ÚosÚurandomrJ   ÚdecoderL   )Z
randomnessr
   r
   r   r9   ·   s    
r9   )r@   )Ú__doc__rK   ZhmacrQ   rH   Z
_cookiejarr   Ú_exceptionsZ_httpZ_loggingZ_socketZPY3Úbase64r   rJ   r   Ú__all__Úhasattrr	   r:   r   Úobjectr   r   r,   r   r   rE   r    r9   r
   r
   r
   r   Ú<module>   s8   
	6
þ"