
    d                        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 ddl ddl	 ddl
 ej                  rddlmZ nddlmZ ej                  rej                   rddlmZ ndd	lmZ nddlZg d
Z eed      rej.                  Znd ZdZej2                  ej4                  ej6                  gZ e       Z G d de      Zd Z d Z!d Z"ddZ#dddZ$d Z%d Z&y)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                     | |k(  S )N )s1s2s     'lib/third_party/websocket/_handshake.pyr   r   4   s    Rx       c                       e Zd Zd Zy)r
   c                 v    || _         || _        || _        t        j	                  |j                  d             y )Nz
set-cookie)statusheaderssubprotocol	CookieJaraddget)selfr   r   r   s       r   __init__zhandshake_response.__init__A   s-    &gkk,/0r   N)__name__
__module____qualname__r   r   r   r   r
   r
   ?   s    1r   r
   c                 .   t        ||||      \  }}dj                  |      }t        | |       t        d|       t	        |       \  }}	|t
        v rt        ||	d       S t        |	||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   WebSocketException)sockhostnameportresourceoptionsr   key
header_strr   respsuccesssubprotos               r   r   r   H   s    )(HdGLLGSW%Jz	:&$T*LFD,,!&$55!$W[[-HIGX !;<<fdH55r   c                     d| v rd| z   dz   S | S )N:[]r   )r,   s    r   _pack_hostnamer9   X   s    
hX~##Or   c                 8   d| z  ddg}|dk(  s|dk(  rt        |      }ndt        |      |fz  }d|v r|d   |j                  d|d   z         n|j                  d|z         d	|vs|d	   s5d
|v r|d
   |j                  d|d
   z         n|j                  d|z         t               }d|vsd|d   vrt               }|j                  d|z         n|d   d   }d|vsd|d   vr|j                  dt        z         |j	                  d      }|r#|j                  ddj                  |      z         d|v r[|d   }t        |t              r5|j                         D 	
cg c]  \  }	}
|
dj                  |	|
g       }}	}
|j                  |       t        j	                  |      }|j	                  dd       }dj                  t        d ||g            }|r|j                  d|z         |j                  d       |j                  d       ||fS c c}
}	w )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 )r9   append_create_sec_websocket_keyVERSIONr   r%   
isinstancedictitemsextendr   filter)r.   r<   r-   r/   r   hostportr0   r#   r?   kvserver_cookieclient_cookierA   s                 r   r$   r$   _   s<   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*DAq= 		1a&!*  
 	vMM$'MKK$/MYYvd]M$BCDF|f,-NN2NN2C<%s   #Hc                 L    t        |       \  }}}||vrt        d|||      ||fS )NzHandshake status %d %s)read_headersWebSocketBadStatusException)r+   success_statusesr   resp_headersstatus_messages        r   r(   r(      s:    +7+=(FL.%%)*BFN\hii<r   	websocketupgrade)rW   
connectionc                    d }t         j                         D ]2  \  }}| j                  |d       }|s y|j                         }||k7  s2 y |rj| j                  dd       }|r.|j                         |D cg c]  }|j                          c}vrt	        dt        |      z          y|j                         }| j                  dd       }|sy|j                         }t        |t        j                        r|j                  d      }|dz   j                  d      }	t        t        j                  |	      j                               j                         j                         }
t        |
|      }|rd|fS yc c}w )N)FNzsec-websocket-protocolzInvalid subprotocol: zsec-websocket-acceptutf-8z$258EAFA5-E914-47DA-95CA-C5AB0DC85B11T)_HEADERS_TO_CHECKrH   r   lowererrorstrrF   six	text_typeencodebase64encodehashlibsha1digeststripr   )r   r0   r#   r4   rL   rM   rsresultvaluehashedr3   s               r   r)   r)      sK   H!'')1KK4 GGI6 * ;;7>8>>+|3T|!AGGI|3TT)C,==>>>#[[/6F\\^F&#--(w'99AA'JE',,u-4467==?EEGFVV,GX~) 4Us   5E7c                  |    t        j                  d      } t        |       j                  d      j	                         S )N   rZ   )osurandomrb   decoderf   )
randomnesss    r   rD   rD      s.    BJ
#**7399;;r   ))e   i-  i.  i/  )'__doc__rc   hmacrn   r_   
_cookiejarr   _exceptions_http_logging_socketPY3base64r   rb   r   PY34httpr   r	   httplib__all__hasattrr   rE   MOVED_PERMANENTLYFOUND	SEE_OTHERr   r   objectr
   r   r9   r$   r(   r[   r)   rD   r   r   r   <module>r      s   *   	 
 '    772377
xx-# 
L
4!"((N );;Z=M=MzOcOcd 	1 16 ;|    F<r   