
    d                        S r SSKrSSKrSSKrSSKrSSKJr  SSK7  SSK7  SSK	7  SSK
7  \R                  (       a  SSKJr  OSSKJr  \R                  (       a  \R                   (       a  SSKJr  OSS	KJr  OSSKr/ S
Qr\" \S5      (       a  \R.                  rOS rSr\R2                  \R4                  \R6                  /r\" 5       r " S S\5      rS r S r!S r"SS jr#SSS.r$S r%S r&g)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)client)
HTTPStatus)handshake_response	handshakeSUPPORTED_REDIRECT_STATUSEScompare_digestc                 
    X:H  $ )N )s1s2s     'lib/third_party/websocket/_handshake.pyr   r   4   s	    x       c                       \ rS rSrS rSrg)r
   ?   c                 p    Xl         X l        X0l        [        R	                  UR                  S5      5        g )Nz
set-cookie)statusheaderssubprotocol	CookieJaraddget)selfr   r   r   s       r   __init__handshake_response.__init__A   s'    &gkk,/0r   )r   r   r   N)__name__
__module____qualname____firstlineno__r   __static_attributes__r   r   r   r
   r
   ?   s    1r   r
   c                 *   [        X1X$5      u  pVSR                  U5      n[        X5        [        SU5        [	        U 5      u  pU[
        ;   a  [        XS 5      $ [        XUR                  S5      5      u  pU
(       d  [        S5      e[        XU5      $ )Nz
zrequest headersubprotocolszInvalid WebSocket Header)
_get_handshake_headersjoinsenddump_get_resp_headersr   r
   	_validater   WebSocketException)sockhostnameportresourceoptionsr   key
header_strr   respsuccesssubprotos               r   r   r   H   s    )(dLLGW%J	:&$T*LF,,!&55!$W[[-HIG !;<<fH55r   c                 "    SU ;   a  SU -   S-   $ U $ )N:[]r   )r0   s    r   _pack_hostnamer=   X   s    
hX~##Or   c                    SU -  SS/nUS:X  d  US:X  a  [        U5      nOS[        U5      U4-  nSU;   a  US   b  UR                  SUS   -  5        OUR                  SU-  5        S	U;  d
  US	   (       d8  S
U;   a  US
   b  UR                  SUS
   -  5        OUR                  SU-  5        [        5       nSU;  d	  SUS   ;  a  [        5       nUR                  SU-  5        OUS   S   nSU;  d	  SUS   ;  a  UR                  S[        -  5        UR	                  S5      nU(       a#  UR                  SSR                  U5      -  5        SU;   ad  US   n[        U[        5      (       a9  UR                  5        V	V
s/ s H  u  pU
c  M
  SR                  X/5      PM     nn	n
UR                  U5        [        R	                  U5      nUR	                  SS 5      nSR                  [        S X/5      5      nU(       a  UR                  SU-  5        UR                  S5        UR                  S5        XF4$ s  sn
n	f )NzGET %s HTTP/1.1zUpgrade: websocketzConnection: UpgradeP   i  z%s:%dhostzHost: %ssuppress_originoriginz
Origin: %szOrigin: http://%sheaderzSec-WebSocket-KeyzSec-WebSocket-Key: %szSec-WebSocket-VersionzSec-WebSocket-Version: %sr'   zSec-WebSocket-Protocol: %s,z: cookiez; z
Cookie: %s )r=   append_create_sec_websocket_keyVERSIONr   r)   
isinstancedictitemsextendr   filter)r2   r@   r1   r3   r   hostportr4   r'   rC   kvserver_cookieclient_cookierE   s                 r   r(   r(   _   s7   H$G
 rzTS[!$'nT2D99WV_8zGFO34zH,-'w7H/Iw78#4#@NN<'(*;;<NN.9:
#
%C w"5WX=N"N').45h 34w"9AR"R2W<=;;~.L3chh|6LLM7"fd## #LLN*DA "		1&!*  
 	vMM$'MKK$/MYYvd]$BCDF|f,-NN2NN2<%s   	I I c                 H    [        U 5      u  p#nX!;  a  [        SX$U5      eX#4$ )NzHandshake status %d %s)read_headersWebSocketBadStatusException)r/   success_statusesr   resp_headersstatus_messages        r   r,   r,      s1    +7+=(F.%)*BF\hiir   	websocketupgrade)r[   
connectionc                 >   S n[         R                  5        H7  u  pEU R                  US 5      nU(       d    gUR                  5       nXV:w  d  M7    g   U(       as  U R                  SS 5      nU(       a2  UR                  5       U Vs/ s H  owR                  5       PM     sn;  a  [	        S[        U5      -   5        gUR                  5       nU R                  SS 5      nU(       d  gUR                  5       n[        U[        R                  5      (       a  UR                  S5      nUS-   R                  S5      n	[        [        R                  " U	5      R                  5       5      R                  5       R                  5       n
[        X5      nU(       a  SU4$ gs  snf )N)FNzsec-websocket-protocolzInvalid subprotocol: zsec-websocket-acceptutf-8z$258EAFA5-E914-47DA-95CA-C5AB0DC85B11T)_HEADERS_TO_CHECKrL   r   lowererrorstrrJ   six	text_typeencodebase64encodehashlibsha1digeststripr   )r   r4   r'   r8   rP   rQ   rsresultvaluehashedr7   s               r   r-   r-      sF   H!'')KK4 GGI6 * ;;7>8>>+|3T|!GGI|3TT)C,==>>>#[[/6F\\^F&#--((w'99AA'JE',,u-4467==?EEGFV,GX~) 4Us   Fc                  ~    [         R                  " S5      n [        U 5      R                  S5      R	                  5       $ )N   r^   )osurandomrf   decoderj   )
randomnesss    r   rH   rH      s.    BJ
#**7399;;r   ))e   i-  i.  i/  )'__doc__rg   hmacrr   rc   
_cookiejarr   _exceptions_http_logging_socketPY3base64r   rf   r   PY34httpr   r	   httplib__all__hasattrr   rI   MOVED_PERMANENTLYFOUND	SEE_OTHERr   r   objectr
   r   r=   r(   r,   r_   r-   rH   r   r   r   <module>r      s   *   	 
 '    772377
xx-# 
L
4!""((N );;Z=M=MzOcOcd 	1 16 ;|    F<r   