
=\•j¬  ã               @   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 Td d l Td d l	 Td d l
 Te e d ƒ r™ e j r™ d 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 d d d g Z e e d ƒ r5e j Z n d d „  Z d Z e j e j e j f Z e e j f Z e ƒ  Z Gd d „  d e  ƒ Z! d d „  Z" d d „  Z# d d „  Z$ e d d „ Z% d d d d i Z& d d „  Z' d d  „  Z( d S)!aH  
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-1301  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   ú@/tmp/pip-build-jxowagp5/websocket-client/websocket/_handshake.pyr   3   s    é   c               @   s   e  Z d  Z d d „  Z d S)r   c             C   s5   | |  _  | |  _ | |  _ t j | j d ƒ ƒ d  S)Nz
set-cookie)ÚstatusÚheadersÚsubprotocolÚ	CookieJarÚaddÚget)Úselfr   r   r   r   r   r   Ú__init__A   s    			zhandshake_response.__init__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   ?   s   c             K   sµ   t  | | | | ƒ \ } } d j | ƒ } t |  | ƒ t d | ƒ t |  ƒ \ } }	 | t k rr t | |	 d  ƒ St |	 | | j d ƒ ƒ \ }
 } |
 s¥ t	 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   ÚkeyÚ
header_strr   ÚrespÚsuccessÚsubprotor   r   r   r   H   s    !c             C   s   d |  k r d |  d S|  S)Nú:ú[ú]r   )r'   r   r   r   Ú_pack_hostnameY   s    r3   c             C   sœ  d |  d g } | d k s( | d k r7 t  | ƒ } n d t  | ƒ | f } d | k r� | d d  k	 r� | j d | d ƒ n | j d | ƒ d | k s© | d rî d	 | k rÝ | d	 d  k	 rÝ | j d
 | d	 ƒ n | j d | ƒ t ƒ  } d | k sd | d k r0t ƒ  } | j d | ƒ n | d d } d | k sZd | d k rk| j d t ƒ d | k s‡| d d  k r—| j d ƒ n | j | d ƒ | j d ƒ } | r×| j d d j | ƒ ƒ d | k r"| d } t | t ƒ rd d „  | j ƒ  Dƒ } | j	 | ƒ t
 j | ƒ }	 | j d d  ƒ }
 d j t d  |	 |
 g ƒ ƒ } | rx| j d | ƒ | j d ƒ | j 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   s7   g  |  ]- \ } } | d  k	 r d j  | | g ƒ ‘ q S)Nz: )r!   )Ú.0ÚkÚvr   r   r   ú
<listcomp>Ž   s   		z*_get_handshake_headers.<locals>.<listcomp>Úcookiez; z
Cookie: %sÚ )r3   ÚappendÚ_create_sec_websocket_keyÚVERSIONr   r!   Ú
isinstanceÚdictÚitemsÚextendr   Úfilter)r)   r5   r(   r*   r   Úhostportr+   r   r7   Zserver_cookieZclient_cookier>   r   r   r   r    a   sN    			
	r    c             C   s@   t  |  ƒ \ } } } | | k r6 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$   ÚupgradeZ	websocketr8   c             C   sw  d  } xb t  j ƒ  D]T \ } } |  j | d  ƒ } | s; d Sd d „  | j d ƒ Dƒ } | | k r d Sq W| rÍ |  j d d  ƒ } | s© | j ƒ  d d „  | Dƒ k rÁ t d t | ƒ ƒ d S| j ƒ  } |  j d d  ƒ } | sé d S| j ƒ  } t | t j	 ƒ r| j
 d	 ƒ } | d
 j
 d	 ƒ } t t j | ƒ j ƒ  ƒ j ƒ  j ƒ  }	 t |	 | ƒ }
 |
 rod | f Sd Sd  S)NFc             S   s"   g  |  ] } | j  ƒ  j ƒ  ‘ q Sr   )ÚstripÚlower)r:   Úxr   r   r   r=   µ   s   	 z_validate.<locals>.<listcomp>r9   zsec-websocket-protocolc             S   s   g  |  ] } | j  ƒ  ‘ q Sr   )rK   )r:   Úsr   r   r   r=   »   s   	 zInvalid subprotocol: zsec-websocket-acceptzutf-8z$258EAFA5-E914-47DA-95CA-C5AB0DC85B11T)FN)FN)FN)FN)FN)Ú_HEADERS_TO_CHECKrE   r   ÚsplitrK   ÚerrorÚstrrC   ÚsixÚ	text_typeÚencodeÚbase64encodeÚhashlibÚsha1ÚdigestrJ   r   )r   r+   r   r/   r;   r<   ÚrÚresultÚvalueÚhashedr.   r   r   r   r%   ¯   s4    &'
r%   c              C   s(   t  j d ƒ }  t |  ƒ j d ƒ j ƒ  S)Né   zutf-8)ÚosÚurandomrU   ÚdecoderJ   )Z
randomnessr   r   r   rA   Ò   s    rA   ))Ú__doc__rV   Úhmacr^   rR   Z
_cookiejarr   Ú_exceptionsZ_httpZ_loggingÚ_socketÚhasattrr   Úbase64r   rU   r   r   Úhttpr	   r
   ÚhttplibÚ__all__r   rB   ÚMOVED_PERMANENTLYÚFOUNDÚ	SEE_OTHERr   ÚSWITCHING_PROTOCOLSZSUCCESS_STATUSESr   Úobjectr   r   r3   r    r$   rN   r%   rA   r   r   r   r   Ú<module>   sD   



		A#