
    o)                     @   S r SSKrSSKrSSKrSSKrSSKrSSK7  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  / SQr SSKr\R$                  rSr " S S\5      rS rS rS rS rS rS rS rS rS rg!    " S	 S
\5      rSr N8= f)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   )*)encodebytes)encodestring)
proxy_infoconnectread_headersTc                       \ rS rSrSrg)ProxyConnectionError/    N)__name__
__module____qualname____firstlineno____static_attributes__r       "lib/third_party/websocket/_http.pyr   r   /   s    r   r   Fc                       \ rS rSrS rSrg)r   3   c                 ~   UR                  S5      =(       d    SU l        U R                  S;  a  [        S5      eUR                  SS 5      U l        U R                  (       aF  UR                  SS5      U l        UR                  SS 5      U l        UR                  S	S 5      U l        g SU l        S U l        S U l        g )
N
proxy_typehttp)r   socks4socks5socks5hz:proxy_type must be 'http', 'socks4', 'socks5' or 'socks5h'http_proxy_hosthttp_proxy_portr   http_proxy_authhttp_no_proxy)gettype
ValueErrorhostportauthno_proxy)selfoptionss     r   __init__proxy_info.__init__5   s    KK-7	yyCCYZZKK 148	99$5q9DI$5t<DI#KK>DMDIDI DMr   )r&   r$   r'   r%   r"   N)r   r   r   r   r*   r   r   r   r   r   r   3   s    !r   r   c                    [        U 5      u  p4pV[        (       d  [        S5      e[        R                  nSnUR
                  S:X  a  [        R                  nUR
                  S:X  a  [        R                  nUR
                  S   S:X  a  Sn[        R                  " X44UUR                  UR                  UUR                  (       a  UR                  S   OS UR                  (       a  UR                  S	   OS UR                  [        UR                  -   S
9	n	U(       a-  [        (       a  [!        XR"                  U5      n	O[        S5      eXXE44$ )NzPySocks module not found.Fr   r   hTr   r   )r   
proxy_addr
proxy_port
proxy_rdnsproxy_usernameproxy_passwordtimeoutsocket_optionsSSL not available.)	parse_urlHAS_PYSOCKSWebSocketExceptionsocksSOCKS5r"   SOCKS4HTTPcreate_connectionr$   r%   r&   r4   DEFAULT_SOCKET_OPTIONsockoptHAVE_SSL_ssl_socketsslopt)
urlr)   proxyhostnamer%   resource	is_secureptyperdnssocks
             r   _open_proxied_socketrL   C   s   *3C.'HH; !<==LLEDzzXzzV

zz"~"".3jjUZZ]d.3jjUZZ]doo2W__D
D 8t^^X>D$%9::D+++r   c                    UR                   (       a#  U(       d  UR                  S:X  d  [        XU5      $ [        U 5      u  pEpgU(       a  X4XV44$ [	        XEXr5      u  pn
U(       d  [        SU-   S-   [        U5      -   5      eS n [        XR                  UR                  5      nU	(       a  [        XXZ5      nU(       a-  [        (       a  [        XR                  U5      nO[        S5      eXXV44$ !   U(       a  UR                  5         e = f)Nr   zHost not found.: :r6   )r$   r"   rL   r7   _get_addrinfo_listr9   str_open_socketr@   r4   _tunnelrA   rB   rC   close)rD   r)   rE   socketrF   r%   rG   rH   addrinfo_listneed_tunnelr&   rK   s               r   r   r   g   s    zz&%***>#C%88*3C.'HH$111'9	(*$M (*S03t9<> 	> DM??GOOL446Dx"4B()=>>///JJLs   A+C1 1Dc                    [        XUR                  UR                  UR                  UR                  5      u  pEn U(       d,  [
        R                  " XSS[
        R                  5      nUSS 4$ U=(       a    U=(       d    Sn[
        R                  " XES[
        R                  [
        R                  5      nUSU4$ ! [
        R                   a  n[        U5      eS nAff = f)Nr   FP   T)get_proxy_infor$   r%   r&   r'   rT   getaddrinfoSOL_TCPSOCK_STREAMgaierrorWebSocketAddressException)	rF   r%   rH   rE   phostpportpauthrU   es	            r   rO   rO      s    (UZZUZZQE%+"..1fnn6M %--Oe)rE
 #..uQ@R@RTZTbTbcM $--?? +'**+s   2B= /AB= =C!CC!c                    S nU  H  nUS S u  pVn[         R                   " XVU5      nUR                  U5        [         H  n	UR                  " U	6   M     U H  n	UR                  " U	6   M     US   n
S nU(       d   UR	                  U
5        OM    U$    U(       a  UeW$ ! [
         a2  n[        [        U5      5      n[        U
S   5      Ul         S nAMc  S nAf[         R                   a  n[        U
S   5      Ul         [        R                  [        R                  4nO!   [        R                  4n O= fUR                  [        R                  :X  a   S nAM  UR                  U;   a	  Un S nAGM  UeS nAff = f)N      r   )rT   
settimeoutr?   
setsockoptr   r   WebSocketProxyExceptionrP   	remote_iperrorerrnoECONNREFUSEDWSAECONNREFUSEDEINTR)rU   r@   r4   erraddrinfofamilysocktypeprotorK   optsaddressrj   eConnRefuseds                r   rQ   rQ      sZ   
C!"*2A,%}}Vu5 )DOOT" *DOOT"  1+W%& 
 KQ "J IK5 ( -c%j9 #GAJ<<  "%gaj/:$)$6$68M8M#NL:$)$6$6#9L;;%++-[[L0CK sH   ;B
E>)'CE>-E9 D"!E9"D75#E9E97E99E>c                      [         R                  =(       a    [        R                  S:  =(       d    [        R                  S:  $ )N)      	   )rd   rx   )sixPY2sysversion_infor   r   r   _can_use_snir      s,    774s''94R8H8HF8RRr   c                    [         R                  UR                  S[         R                  5      5      nUR                  S[         R                  5      [         R                  :w  a|  UR                  SS 5      nUR                  SS 5      nU(       d  U(       a  UR                  XVS9  O:[        US5      (       a)  UR                  [         R                  R                  5        UR                  SS 5      (       a6  UR                  US   UR                  SS 5      UR                  S	S 5      5        US   Ul        [        (       a  X4l        S
U;   a  UR                  US
   5        SU;   a  US   u  pxn	UR                  XxU	5        SU;   a  UR                  US   5        UR!                  U UR                  SS5      UR                  SS5      US9$ )Nssl_version	cert_reqsca_certsca_cert_path)cafilecapathload_default_certscertfilekeyfilepasswordciphers
cert_chain
ecdh_curvedo_handshake_on_connectTsuppress_ragged_eofs)r   r   server_hostname)ssl
SSLContextr!   PROTOCOL_SSLv23	CERT_NONEload_verify_locationshasattrr   PurposeSERVER_AUTHload_cert_chainverify_modeHAVE_CONTEXT_CHECK_HOSTNAMEcheck_hostnameset_ciphersset_ecdh_curvewrap_socket)
rK   rC   rF   r   contextr   r   r   r   r   s
             r   _wrap_sni_socketr      s   nnVZZs7J7JKLGzz+s}}->J-ND1V)))GW233&&s{{'>'>?zz*d##:JJy$'JJz4(	
 !-G""!/FF9-.v&,\&:#88<vvl34 &

+Dd K#ZZ(>E 	   r   c                    [        [        R                  S9nUR                  U5        [        R
                  R                  S5      nU(       aO  [        R                  R                  U5      (       a+  UR                  SS 5      c  UR                  SS 5      c  XCS'   OBU(       a;  [        R                  R                  U5      (       a  UR                  SS 5      c  XCS'   US   [        R                  :g  =(       a    UR                  SS5      n[        5       (       a  [        XX%5      n O)UR                  SS5        [        R                  " U 40 UD6n [        (       d!  U(       a  [!        U R#                  5       U5        U $ )	N)r   WEBSOCKET_CLIENT_CA_BUNDLEr   ca_certr   r   r   T)dictr   CERT_REQUIREDupdateosenvironr!   pathisfileisdirr   popr   r   r   r   match_hostnamegetpeercert)rK   user_ssloptrF   rC   certPathr   s         r   rB   rB      s   C--.F
MM+zz~~:;HBGGNN8,,
D19	408%z	bggmmH--5=!)~K(CMM9  fjj$? N ~~hG

#T*t.v.&&>t'')84Kr   c                    [        S5        SX4-  nU(       aa  US   (       aW  US   nUS   (       a  USUS   -   -  n[        UR                  5       5      R                  5       R	                  5       nUSU-  -  nUS-  n[        SU5        [        X5         [        U 5      u  pxn	US	:w  a  [        S
U-  5      eU $ ! [         a  n
[        [        U
5      5      eS n
A
ff = f)NzConnecting proxy...zCONNECT %s:%d HTTP/1.0
r   r   rN   zProxy-Authorization: Basic %s
z
zrequest header   z#failed CONNECT via proxy status: %r)debugbase64encodeencodestripdecodedumpsendr	   	Exceptionrh   rP   )rK   r$   r%   r&   connect_headerauth_strencoded_strstatusresp_headersstatus_messagerb   s              r   rR   rR     s    	
 1TL@NQ77d1g%H"8??#45;;=DDF=KKfN	>*./;D/A,n }%1F:< 	< K  .%c!f--.s   B; ;
CCCc                    S nS n0 n[        S5         [        U 5      nUR                  S5      R                  5       nU(       d  O[        U5        U(       d5  UR	                  SS5      n[        US   5      n[        U5      S:  a  US   nOQUR	                  SS5      n[        U5      S:X  a%  Uu  pxUR                  5       X7R                  5       '   O[        S5      eM  [        S5        XU4$ )	Nz--- response header ---zutf-8 rx   r   rN   zInvalid headerz-----------------------)	trace	recv_liner   r   splitintlenlowerr9   )	rK   r   r   headerslinestatus_infokvkeyvalues	            r   r	   r	   *  s    FNG	
#$
{{7#))+d**S!,KQ(F;!#!,QC#B2w!|
',{{}		$()9::% ( 

#$N**r   ) __doc__rk   r   rT   r}   r{   _exceptions_logging_socket_ssl_compat_urlPY3base64r   r   r   __all__r:   r   r8   BaseExceptionobjectr   rL   r   rO   rQ   r   r   rB   rR   r	   r   r   r   <module>r      s   *  	  
 
     7723
3 55K! ! !,HD+(*ZS"J86+y} Ks   B B