
    o)                     6   d Z ddlZddlZddlZddlZddlZddl 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 g dZ	 ddlZej$                  ZdZ G d de      Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy#   G d	 d
e      ZdZY 8xY w)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                       e Zd Zy)ProxyConnectionErrorN)__name__
__module____qualname__     "lib/third_party/websocket/_http.pyr   r   /   s    r   r   Fc                       e Zd Zd Zy)r   c                 f   |j                  d      xs d| _        | j                  dvrt        d      |j                  dd       | _        | j                  rF|j                  dd      | _        |j                  dd       | _        |j                  d	d       | _        y d| _        d | _        d | _        y )
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__z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   N)r   r   r   r&   r   r   r   r   r   3   s    !r   r   c                 z   t        |       \  }}}}t        st        d      t        j                  }d}|j
                  dk(  rt        j                  }|j
                  dk(  rt        j                  }|j
                  d   dk(  rd}t        j                  ||f||j                  |j                  ||j                  r|j                  d   nd |j                  r|j                  d	   nd |j                  t        |j                  z   
	      }	|r)t        rt!        |	|j"                  |      }	nt        d      |	|||ffS )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"   r/   DEFAULT_SOCKET_OPTIONsockoptHAVE_SSL_ssl_socketsslopt)
urlr%   proxyhostnamer!   resource	is_secureptyperdnssocks
             r   _open_proxied_socketrG   C   s   *3C.'HdHi !<==LLEDzzXzzV

zz"~""t.3jjUZZ]d.3jjUZZ]doo2W__D
D tW^^X>D$%9::(D(+++r   c                    |j                   r|s|j                  dk(  st        | ||      S t        |       \  }}}}|r||||ffS t	        ||||      \  }}	}
|st        d|z   dz   t        |      z         d }	 t        ||j                  |j                        }|	rt        ||||
      }|r)t        rt        ||j                  |      }nt        d      ||||ffS #  |r|j                           xY w)Nr   zHost not found.: :r1   )r    r   rG   r2   _get_addrinfo_listr4   str_open_socketr;   r/   _tunnelr<   r=   r>   close)r?   r%   r@   socketrA   r!   rB   rC   addrinfo_listneed_tunnelr"   rF   s               r   r   r   g   s   zz&%***>#C%88*3C.'HdHi$111'9$	5(*$M; (*S03t9<> 	> DM7??GOOL446D"4B()=>>hh///JJLs   8A"C C0c                    t        | ||j                  |j                  |j                  |j                        \  }}}	 |s,t        j                  | |ddt
        j                        }|dd fS |xr |xs d}t        j                  ||dt
        j                  t
        j                        }|d|fS # t
        j                  $ r}t        |      d }~ww xY w)Nr   FP   T)get_proxy_infor    r!   r"   r#   rO   getaddrinfoSOL_TCPSOCK_STREAMgaierrorWebSocketAddressException)	rA   r!   rC   r@   phostpportpauthrP   es	            r   rJ   rJ      s    ()UZZUZZQE5%+"..$1fnn6M %--Oe)rE
 #..ueQ@R@RTZTbTbcM $--?? +'**+s   -B0 ,AB0 0CCCc                    d }| D ]  }|d d \  }}}t        j                   |||      }|j                  |       t        D ]  }	 |j                  |	   |D ]  }	 |j                  |	   |d   }
d }|s	 |j	                  |
       	  |S  |r|S # t
        $ r1}t        t        |            }t        |
d         |_        Y d }~Ud }~wt         j                  $ r}t        |
d         |_        	 t        j                  t        j                  f}n#  t        j                  f}Y nxY w|j                  t        j                  k(  rY d }~|j                  |v r|}Y d }~|d }~ww xY w)N      r   )rO   
settimeoutr:   
setsockoptr   r   WebSocketProxyExceptionrK   	remote_iperrorerrnoECONNREFUSEDWSAECONNREFUSEDEINTR)rP   r;   r/   erraddrinfofamilysocktypeprotorF   optsaddressre   eConnRefuseds                r   rL   rL      sf   
C!"*2A,%}}VXu5 )DDOOT" *DDOOT"  1+W%&  	
 K E "J IK5 ( -c%j9 #GAJ<<  "%gaj/:$)$6$68M8M#NL:$)$6$6#9L;;%++-[[L0CK sH   3B	E&'CE&E!/ DE!D%#"E!
E!E!!E&c                  v    t         j                  xr t        j                  dk\  xs t        j                  dk\  S )N)      	   )r_   rs   )sixPY2sysversion_infor   r   r   _can_use_snirz      s,    774s''94R8H8HF8RRr   c                 t   t         j                  |j                  dt         j                              }|j                  dt         j                        t         j                  k7  rq|j                  dd       }|j                  dd       }|s|r|j                  ||       n5t        |d      r)|j                  t         j                  j                         |j                  dd       r6|j                  |d   |j                  dd       |j                  d	d              |d   |_        t        r||_        d
|v r|j                  |d
          d|v r|d   \  }}}	|j                  |||	       d|v r|j                  |d          |j!                  | |j                  dd      |j                  dd      |      S )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)
rF   r>   rA   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&&s{{'>'>?zz*d#:JJy$'JJz4(	
 !-G"!/FF9-.v&,\&:#'8'8<vvl34 &

+Dd K#ZZ(>E 	   r   c                    t        t        j                        }|j                  |       t        j
                  j                  d      }|rIt        j                  j                  |      r*|j                  dd       |j                  dd       ||d<   n8|r6t        j                  j                  |      r|j                  dd       ||d<   |d   t        j                  k7  xr |j                  dd      }t               rt        | |||      } n(|j                  dd       t        j                  | fi |} t        s|rt!        | j#                         |       | S )	N)r}   WEBSOCKET_CLIENT_CA_BUNDLEr~   ca_certr   r}   r   T)dictr   CERT_REQUIREDupdateosenvironr   pathisfileisdirr   poprz   r   r   r   match_hostnamegetpeercert)rF   user_ssloptrA   r>   certPathr   s         r   r=   r=      s   C--.F
MM+zz~~:;HBGGNN8,
D19	408%z	bggmmH-5=!)~K(CMM9  fjj$? N ~fhG

#T*t.v.&>t'')84Kr   c                    t        d       d||fz  }|rW|d   rR|d   }|d   r|d|d   z   z  }t        |j                               j                         j	                         }|d|z  z  }|dz  }t        d|       t        | |       	 t        |       \  }}}	|d	k7  rt        d
|z        | S # t        $ r}
t        t        |
            d }
~
ww xY w)NzConnecting proxy...zCONNECT %s:%d HTTP/1.0
r   r   rI   zProxy-Authorization: Basic %s
z
zrequest header   z#failed CONNECT via proxy status: %r)debugbase64encodeencodestripdecodedumpsendr	   	Exceptionrc   rK   )rF   r    r!   r"   connect_headerauth_strencoded_strstatusresp_headersstatus_messager]   s              r   rM   rM     s    	
 1T4L@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7CCc                    d }d }i }t        d       	 t        |       }|j                  d      j                         }|snt        |       |s4|j	                  dd      }t        |d         }t        |      dkD  rX|d   }nR|j	                  dd      }t        |      dk(  r'|\  }}|j                         ||j                         <   nt        d      t        d       |||fS )	Nz--- response header ---zutf-8 rs   r   rI   zInvalid headerz-----------------------)	trace	recv_liner   r   splitintlenlowerr4   )	rF   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!|
U',{{}		$()9::% ( 

#$7N**r   ) __doc__rf   r   rO   rx   rv   _exceptions_logging_socket_ssl_compat_urlPY3base64r   r   r   __all__r5   r   r3   BaseExceptionobjectr   rG   r   rJ   rL   rz   r   r=   rM   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