
=\•j•+  ã            
   @   s{  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 Td d l Td d l Td d l	 Td d l
 Te j r� d d l m Z n d d l m Z d d d	 g Z y d d l Z e j Z d
 Z Wn$ Gd d „  d e ƒ Z d Z Yn XGd d „  d e ƒ Z d d „  Z d d „  Z d d „  Z d d „  Z d d „  Z d d „  Z d d „  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é   )Ú*)Úencodebytes)ÚencodestringÚ
proxy_infoÚconnectÚread_headersTc               @   s   e  Z d  Z d S)ÚProxyConnectionErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú;/tmp/pip-build-jxowagp5/websocket-client/websocket/_http.pyr	   .   s   r	   Fc               @   s   e  Z d  Z d d „  Z d S)r   c             K   s²   | j  d ƒ p d |  _ |  j d k r3 t d ƒ ‚ | j  d d  ƒ |  _ |  j r“ | j  d d	 ƒ |  _ | j  d
 d  ƒ |  _ | j  d d  ƒ |  _ n d	 |  _ d  |  _ d  |  _ d  S)NÚ
proxy_typeÚhttpÚsocks4Úsocks5Úsocks5hz:proxy_type must be 'http', 'socks4', 'socks5' or 'socks5h'Zhttp_proxy_hostZhttp_proxy_portr   Zhttp_proxy_authZhttp_no_proxy)r   r   r   r   )ÚgetÚtypeÚ
ValueErrorÚhostÚportÚauthÚno_proxy)ÚselfÚoptionsr   r   r   Ú__init__5   s    			zproxy_info.__init__N)r
   r   r   r   r   r   r   r   r   3   s   c       
      C   sF  t  |  ƒ \ } } } } t s* t d ƒ ‚ t j } d } | j d k rQ t j } | j d k ri t j } | j d d k r‚ d } t j | | f d | d	 | j	 d
 | j
 d | d | j rÈ | j d n d  d | j rä | j d n d  d | j d t | j ƒ}	 | r3t r't |	 | j | ƒ }	 n t d ƒ ‚ |	 | | | f f S)NzPySocks module not found.Fr   r   r   ÚhTr   Z
proxy_addrZ
proxy_portZ
proxy_rdnsZproxy_usernamer   Zproxy_passwordÚtimeoutÚsocket_optionszSSL not available.éÿÿÿÿ)Ú	parse_urlÚHAS_PYSOCKSÚWebSocketExceptionÚsocksZSOCKS5r   ZSOCKS4ÚHTTPÚcreate_connectionr   r   r   r   ÚDEFAULT_SOCKET_OPTIONÚsockoptÚHAVE_SSLÚ_ssl_socketÚsslopt)
Úurlr   ÚproxyÚhostnamer   ÚresourceÚ	is_secureÚptypeZrdnsÚsockr   r   r   Ú_open_proxied_socketD   s4    						r4   c             C   sE  | j  r0 | r0 | j d k r0 t |  | | ƒ St |  ƒ \ } } } } | ra | | | | f f St | | | | ƒ \ } }	 }
 | s£ t d | d t | ƒ ƒ ‚ d  } yz t | | j | j	 ƒ } |	 rß t
 | | | |
 ƒ } | rt rt | | j | ƒ } n t d ƒ ‚ | | | | f f SWn | r9| j ƒ  ‚  Yn Xd  S)Nr   zHost not found.: ú:zSSL not available.)r   r   r4   r"   Ú_get_addrinfo_listr$   ÚstrÚ_open_socketr)   r   Ú_tunnelr*   r+   r,   Úclose)r-   r   r.   Úsocketr/   r   r0   r1   Úaddrinfo_listZneed_tunnelr   r3   r   r   r   r   h   s0     
c       	      C   sã   t  |  | | j | j | j | j ƒ \ } } } yx | sg t j |  | d t j t j ƒ } | d d  f S| rs | pv d } t j | | d t j t j ƒ } | d | f SWn4 t j	 k
 rÞ } z t
 | ƒ ‚ WYd  d  } ~ Xn Xd  S)Nr   FéP   T)Zget_proxy_infor   r   r   r   r;   ÚgetaddrinfoÚSOCK_STREAMÚSOL_TCPÚgaierrorZWebSocketAddressException)	r/   r   r1   r.   ZphostZpportZpauthr<   Úer   r   r   r6   Š   s    -!r6   c             C   sÁ  d  } x´|  D] } | d  d … \ } } } t  j  | | | ƒ } | j | ƒ x t D] }	 | j |	 Œ  qU Wx | D] }	 | j |	 Œ  qs W| d }
 d  } x| s¨y | j |
 ƒ Wní t k
 r} z- t t | ƒ ƒ } t |
 d ƒ | _ w� WYd  d  } ~ Xq� t  j	 k
 r£} z~ t |
 d ƒ | _ y t
 j t
 j f } Wn t
 j f } Yn X| j
 t
 j k rpw� n! | j
 | k r‹| } w� n | ‚ WYd  d  } ~ Xq� XPq� Wq Pq W| r½| ‚ | S)Né   é   r   )r;   Ú
settimeoutr(   Ú
setsockoptr   r	   ÚWebSocketProxyExceptionr7   Z	remote_ipÚerrorÚerrnoZECONNREFUSEDZWSAECONNREFUSEDZEINTR)r<   r)   r   ÚerrZaddrinfoÚfamilyÚsocktypeÚprotor3   ÚoptsÚaddressrH   ZeConnRefusedr   r   r   r8   ¡   sH    
	r8   c               C   s%   t  j r t j d k p$ t j d k S)Né   é   é	   rC   )rP   rQ   rR   )rC   rP   )ÚsixÚPY2ÚsysÚversion_infor   r   r   r   Ú_can_use_sniÎ   s    rW   c       
      C   s§  t  j | j d t  j ƒ ƒ } | j d t  j ƒ t  j k r§ | j d d  ƒ } | j d d  ƒ } | sl | r… | j d | d | ƒ n" t | d ƒ r§ | j t  j j	 ƒ | j d d  ƒ rè | j
 | d | j d	 d  ƒ | j d
 d  ƒ ƒ | d | _ t r| | _ d | k r!| j | d ƒ d | k rS| d \ } } }	 | j
 | | |	 ƒ d | k rp| j | d ƒ | j |  d | j d d ƒ d | j d d ƒ d | ƒS)NÚssl_versionÚ	cert_reqsÚca_certsÚca_cert_pathÚcafileÚcapathÚload_default_certsÚcertfileÚkeyfileÚpasswordÚciphersZ
cert_chainZ
ecdh_curveÚdo_handshake_on_connectTÚsuppress_ragged_eofsÚ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)
r3   r,   r/   rq   Úcontextr\   r]   r_   r`   ra   r   r   r   Ú_wrap_sni_socketÒ   s8    	rv   c             C   sL  t  d t j ƒ } | j | ƒ t j j d ƒ } | r† t j j | ƒ r† | j d d  ƒ d  k r† | j d d  ƒ d  k r† | | d <n: | rÀ t j j	 | ƒ rÀ | j d d  ƒ d  k rÀ | | d <| d t j
 k oâ | j d d ƒ } t ƒ  rt |  | | | ƒ }  n" | j d d ƒ t j |  | � }  t rH| rHt |  j ƒ  | ƒ |  S)NrY   ZWEBSOCKET_CLIENT_CA_BUNDLErZ   Zca_certr[   rq   T)Údictrf   ÚCERT_REQUIREDÚupdateÚosÚenvironr   ÚpathÚisfileÚisdirri   ÚpoprW   rv   rt   rp   Úmatch_hostnameÚgetpeercert)r3   Zuser_ssloptr/   r,   ZcertPathrq   r   r   r   r+   ÷   s&    
	r+   c             C   s3  t  d ƒ d | | f } | d | | f 7} | rœ | d rœ | d } | d rd | d | d 7} t | j ƒ  ƒ j ƒ  j ƒ  j d d ƒ } | d	 | 7} | d
 7} t d | ƒ t |  | ƒ y t |  ƒ \ } } }	 Wn7 t	 k
 r}
 z t
 t |
 ƒ ƒ ‚ WYd  d  }
 ~
 Xn X| d k r/t
 d | ƒ ‚ |  S)NzConnecting proxy...zCONNECT %s:%d HTTP/1.1
zHost: %s:%d
r   r   r5   Ú
Ú zProxy-Authorization: Basic %s
z
zrequest headeréÈ   z#failed CONNECT via proxy status: %r)ÚdebugÚbase64encodeÚencodeÚstripÚdecodeÚreplaceÚdumpÚsendr   Ú	ExceptionrG   r7   )r3   r   r   r   Zconnect_headerÚauth_strZencoded_strÚstatusZresp_headersÚstatus_messagerB   r   r   r   r9     s(    


*
%r9   c       	      C   sM  d  } d  } i  } t  d ƒ xt |  ƒ } | j d ƒ j ƒ  } | sG Pt  | ƒ | s˜ | j d d ƒ } t | d ƒ } t | ƒ d k r2| d } q | j d d ƒ } t | ƒ d k r&| \ } } | j ƒ  d k r| j d ƒ r| j d ƒ d | j ƒ  | d <q2| j ƒ  | | j ƒ  <q t	 d	 ƒ ‚ q Wt  d
 ƒ | | | f S)Nz--- response header ---zutf-8ú rP   r   r5   z
set-cookiez; zInvalid headerz-----------------------)
ÚtraceZ	recv_liner‰   rˆ   ÚsplitÚintÚlenÚlowerr   r$   )	r3   r�   r�   ÚheadersÚlineZstatus_infoÚkvÚkeyÚvaluer   r   r   r   0  s0    

!$
) Ú__doc__rI   rz   r;   rU   rS   Ú_exceptionsZ_loggingÚ_socketZ_ssl_compatZ_urlÚPY3Úbase64r   r†   r   Ú__all__r%   r	   r#   ÚBaseExceptionÚobjectr   r4   r   r6   r8   rW   rv   r+   r9   r   r   r   r   r   Ú<module>   s>   




		
$"-%