o
    _a                     @   sx   d Z 	 ddlZddlZddlZddlmZmZ ddgZdd ZddgZ	d	d
 Z
dd Zdd Zdd Z		dddZdS )z

    N)unquoteurlparse	parse_urlget_proxy_infoc                 C   s   d| vrt d| dd\}} t| dd}|jr|j}nt dd}|jr)|j}d}|d	kr4|s3d
}n|dkr?d}|s>d}nt d| |jrL|j}nd}|jrX|d|j 7 }||||fS )z
    parse url and the result is tuple of
    (hostname, port, resource path and the flag of secure mode)

    Parameters
    ----------
    url: str
        url string.
    :zurl is invalid   http)schemezhostname is invalidr   FZwsP   ZwssTi  zscheme %s is invalid/?)
ValueErrorsplitr   hostnameportpathZquery)Zurlr	   Zparsedr   r   	is_secureZresource r   0/usr/lib/python3/dist-packages/websocket/_url.pyr   !   s6   
Z	localhostz	127.0.0.1c                 C   s(   zt |  W dS  t jy   Y dS w )NFT)socket	inet_atonerror)addrr   r   r   _is_ip_addressR   s   r   c                 C   sL   z|  d\}}t|odt|  kodk W S   W S  ty%   Y dS w )Nr   r       F)r   r   intr   )r   r   netmaskr   r   r   _is_subnet_address[   s   (r   c                 C   sZ   t dt| d }|d\}}t dt|d }ddt| > d@ }||@ |kS )Nz!Ir   r   l    r   )structunpackr   r   r   r   )ZipZnetZipaddrZnetaddrr   r   r   r   _is_address_in_networkc   s
   r    c                    s   |st jdt jdddd}|r|d}|st}d|v r#dS  |v r)dS t r8t fdd	|D S d
d	 |D D ]
} |rI dS q?dS )Nno_proxyZNO_PROXY  ,*Tc                    s   g | ]}t |rt |qS r   )r   r    ).0Zsubnetr   r   r   
<listcomp>y   s    z%_is_no_proxy_host.<locals>.<listcomp>c                 S   s   g | ]	}| d r|qS ).)
startswith)r&   domainr   r   r   r(   z   s    F)	osenvirongetreplacer   DEFAULT_NO_PROXY_HOSTr   anyendswith)r   r!   vr+   r   r'   r   _is_no_proxy_hostl   s"    

r4   r   c                 C   s   t | |rdS |r|}|}|||fS dg}	|r|	dd |	D ]2}
tj|
tj|
 ddd}|rQt|}|jrFt	|jt	|j
fnd}|j|j|f  S qdS )a  
    Try to retrieve proxy host and port from environment
    if not provided in options.
    Result is (proxy_host, proxy_port, proxy_auth).
    proxy_auth is tuple of username and password
    of proxy authentication information.

    Parameters
    ----------
    hostname: str
        Websocket server name.
    is_secure: bool
        Is the connection secure? (wss) looks for "https_proxy" in env
        before falling back to "http_proxy"
    proxy_host: str
        http proxy host name.
    http_proxy_port: str or int
        http proxy port.
    http_no_proxy: list
        Whitelisted host names that don't use the proxy.
    http_proxy_auth: tuple
        HTTP proxy auth information. Tuple of username and password. Default is None.
    proxy_type: str
        Specify the proxy protocol (http, socks4, socks4a, socks5, socks5h). Default is "http".
        Use socks4a or socks5h if you want to send DNS requests through the proxy.
    )Nr   NZ
http_proxyr   Zhttps_proxyr"   r#   N)r4   insertr,   r-   r.   upperr/   r   Zusernamer   Zpasswordr   r   )r   r   Z
proxy_hostZ
proxy_portZ
proxy_authr!   Z
proxy_typer   ZauthZenv_keyskeyvalueproxyr   r   r   r      s"   

$)Nr   NNr   )__doc__r,   r   r   Zurllib.parser   r   __all__r   r0   r   r   r    r4   r   r   r   r   r   <module>   s     .		