o
     Ka-                     @   s  d Z ddlZddlZddlZddlZddlT ddlT ddlT ddlT ddl	T ddl
mZ g dZzddlmZ ddlT ddlmZ d	ZW n   d
ZG dd deZG dd deZG dd deZY G d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 )#a_  
_http.py
websocket - WebSocket client library for Python

Copyright 2021 engn33r

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
    N   )*)encodebytes)
proxy_infoconnectread_headers)Proxy)	ProxyTypeTFc                   @      e Zd ZdS )
ProxyErrorN__name__
__module____qualname__ r   r   1/usr/lib/python3/dist-packages/websocket/_http.pyr   *       r   c                   @   r
   )ProxyTimeoutErrorNr   r   r   r   r   r   -   r   r   c                   @   r
   )ProxyConnectionErrorNr   r   r   r   r   r   0   r   r   c                   @   s   e Zd Zdd ZdS )r   c                 K   s   | dd | _| jr8| dd| _| dd | _| dd | _| dd| _| dd | _| jd	vr6td
d S d| _d | _d | _d| _d S )NZhttp_proxy_hostZhttp_proxy_portr   Zhttp_proxy_authZhttp_no_proxy
proxy_typehttptimeout)r   socks4socks4asocks5socks5hz7Only http, socks4, socks5 proxy protocols are supported)get
proxy_host
proxy_portauthno_proxyproxy_protocolproxy_timeoutr   )selfoptionsr   r   r   __init__6   s   

zproxy_info.__init__N)r   r   r   r%   r   r   r   r   r   4   s    r   c                 C   s   t stdt| \}}}}|jdkrd}tj}|jdkr"d}tj}|jdkr,d}tj}|jdkr6d}tj}tj||j	t
|j|jrG|jd nd |jrP|jd	 nd |d
}	|	j|||jd}
|rjtrjt|
|j|}
n|rptd|
|||ffS )Nz>Python Socks is needed for SOCKS proxying but is not availabler   Fr   r   Tr   r   r   )r   hostportZusernamepasswordrdns)r   SSL not available.)HAVE_PYTHON_SOCKSWebSocketException	parse_urlr!   r	   ZSOCKS5ZSOCKS4r   Zcreater   intr   r   r   r"   HAVE_SSL_ssl_socketsslopt)urlr$   proxyhostnamer'   resource	is_securer)   r   Zws_proxysockr   r   r   _start_proxied_socketH   s:   



r8   c                 C   s   |j r|s|jdkst| ||S t| \}}}}|r!||||ffS t||||\}}	}
|s9td| d t| d }z)t||j|j	}|	rMt
||||
}|r]trYt||j|}ntd||||ffW S    |rn|   )Nr   zHost not found.: :r*   )r   r!   r8   r-   _get_addrinfo_listr,   str_open_socketsockoptr   _tunnelr/   r0   r1   close)r2   r$   r3   socketr4   r'   r5   r6   addrinfo_listZneed_tunnelr   r7   r   r   r   r   n   s4   
r   c           	   
   C   s   t | ||j|j|j|j\}}}z*|s$t| |dtjtj}|dd fW S |r(|p)d}t||dtjtj}|d|fW S  tj	yK } zt
|d }~ww )Nr   FP   T)Zget_proxy_infor   r   r   r    r@   ZgetaddrinfoZSOCK_STREAMZSOL_TCPZgaierrorZWebSocketAddressException)	r4   r'   r6   r3   ZphostZpportZpauthrA   er   r   r   r:      s    
r:   c                 C   s  d }| D ]}|d d \}}}t  |||}|| tD ]}	|j|	  q|D ]}	|j|	  q'|d }
d }|sz
||
 W 	  |S  t jy } z9t|
d |_ztj	tj
f}W n   tj	f}Y |jtjkrnW Y d }~q5|j|v r{|}W Y d }~q5|r|  |d }~ww q|r||S )N      r   )r@   Z
settimeoutZDEFAULT_SOCKET_OPTIONZ
setsockoptr   errorr;   Z	remote_iperrnoZECONNREFUSEDZWSAECONNREFUSEDZEINTRr?   )rA   r=   r   errZaddrinfoZfamilyZsocktypeprotor7   ZoptsZaddressrF   ZeConnRefusedr   r   r   r<      sJ   


r<   c           
      C   sn  | dd }|st| dtj}| dtjtjkr@| dd }| dd }|s,|r4|j||d nt|dr@|tjj	 | dd rW|
|d | d	d | d
d  | dtjtjkro| ddsod|_tj|_n| dd|_| dtj|_d|v r||d  d|v r|d \}}}	|
|||	 d|v r||d  |j| | dd| dd|dS )NcontextZssl_version	cert_reqsca_certsca_cert_path)cafilecapathload_default_certscertfilekeyfiler(   check_hostnameFTZciphersZ
cert_chainZ
ecdh_curvedo_handshake_on_connectsuppress_ragged_eofs)rT   rU   server_hostname)r   sslZ
SSLContextZPROTOCOL_TLS_CLIENTZ	CERT_NONEZload_verify_locationshasattrrP   ZPurposeZSERVER_AUTHZload_cert_chainrS   Zverify_modeCERT_REQUIREDZset_ciphersZset_ecdh_curveZwrap_socket)
r7   r1   r4   rS   rJ   rN   rO   rQ   rR   r(   r   r   r   _wrap_sni_socket   sD   


 	


rZ   c                 C   s   t tjd}|| tjd}|r&tj|r&|dd d u r&||d< n|r:tj	|r:|dd d u r:||d< |dd rD|d }|dd}t
| |||} | S )N)rK   ZWEBSOCKET_CLIENT_CA_BUNDLErL   rM   rV   rS   T)dictrW   rY   updateosenvironr   pathisfileisdirrZ   )r7   Zuser_ssloptr4   r1   ZcertPathrS   r   r   r   r0     s    

r0   c              
   C   s   t d d||f }|d||f 7 }|r<|d r<|d }|d r(|d|d  7 }t|   dd}|d	| 7 }|d
7 }td| t| | z	t| \}}}	W n t	ye }
 zt
t|
d }
~
ww |dkrpt
d| | S )NzConnecting proxy...zCONNECT %s:%d HTTP/1.1
zHost: %s:%d
r   r   r9   
 zProxy-Authorization: Basic %s
z
zrequest header   z#failed CONNECT via proxy status: %r)debugbase64encodeencodestripdecodereplacedumpsendr   	ExceptionZWebSocketProxyExceptionr;   )r7   r&   r'   r   Zconnect_headerZauth_strZencoded_strstatusZresp_headersstatus_messagerC   r   r   r   r>     s.   

r>   c           	      C   s   d }d }i }t d 	 t| }|d }|snTt | |s6|dd}t|d }t|dkr5|d }n6|dd}t|dkrh|\}}| dkr_|dr_|dd	 |  |d< n| || < nt	d
qt d |||fS )Nz--- response header ---Tzutf-8    r   r9   z
set-cookiez; zInvalid headerz-----------------------)
ZtraceZ	recv_lineri   rh   splitr.   lenlowerr   r,   )	r7   rn   ro   ZheaderslineZstatus_infoZkvkeyvaluer   r   r   r   4  s4   
r   )!__doc__rG   r]   r@   sys_exceptionsZ_loggingZ_socketZ_ssl_compatZ_urlbase64r   rf   __all__Zpython_socks.syncr   Zpython_socks._errorsZpython_socks._typesr	   r+   rm   r   r   r   r   r8   r   r:   r<   rZ   r0   r>   r   r   r   r   r   <module>   s>    &%+-