o
    Yii                     @  s   d dl mZ d dlZd dlZd dlZddlmZ ddlm	Z	 ddl
mZmZ ddlmZ ddlmZmZ g d	ZejG d
d dZdddZdddZefdddZdS )    )annotationsN   )Headers)InvalidProxy)build_authorization_basic
build_host)
USER_AGENT)DELIMSWebSocketURI)	get_proxyparse_proxyProxyc                   @  sP   e Zd ZU dZded< ded< ded< dZded	< dZded
< edddZdS )r   a  
    Proxy address.

    Attributes:
        scheme: ``"socks5h"``, ``"socks5"``, ``"socks4a"``, ``"socks4"``,
            ``"https"``, or ``"http"``.
        host: Normalized to lower case.
        port: Always set even if it's the default.
        username: Available when the proxy address contains `User Information`_.
        password: Available when the proxy address contains `User Information`_.

    .. _User Information: https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1

    strschemehostintportN
str | Noneusernamepasswordreturntuple[str, str] | Nonec                 C  s(   | j d u rd S | jd usJ | j | jfS )N)r   r   )self r   J/home/kim/smarthome/.venv/lib/python3.10/site-packages/websockets/proxy.py	user_info(   s   
zProxy.user_info)r   r   )	__name__
__module____qualname____doc____annotations__r   r   propertyr   r   r   r   r   r      s   
 r   proxyr   r   c                 C  s8  t j| }|jdvrt| d|j d|jdu rt| d|jdvr)t| d|jdkr3t| d	|jdkr=t| d
|j}|j}|j	pN|jdkrMdnd}|j
}|j}|durb|du rbt| dz| d W n* ty   |d }|dur|dusJ t jj|td}t jj|td}Y nw t|||||S )z
    Parse and validate a proxy.

    Args:
        proxy: proxy.

    Returns:
        Parsed proxy.

    Raises:
        InvalidProxy: If ``proxy`` isn't a valid proxy.

    )Zsocks5hZsocks5Zsocks4aZsocks4httpshttpzscheme z isn't supportedNzhostname isn't provided) /zpath is meaninglessr%   zquery is meaninglesszfragment is meaninglessr#   i  P   z"username provided without passwordasciiidna)safe)urllibparseurlparser   r   hostnamepathqueryfragmentr   r   r   encodeUnicodeEncodeErrordecodequoter	   r   )r"   parsedr   r   r   r   r   r   r   r   r   0   s:   









	r   urir
   r   c                 C  s   t j| j d| j rdS t j }| jrg d}ng d}|D ] }||}|durB|dkr>|dr>d|dd  }|  S q"dS )	zU
    Return the proxy to use for connecting to the given WebSocket URI, if any.

    :N)wsssocksr#   )wsr:   r#   r$   r:   zhttp://z
socks5h://   )	r+   requestproxy_bypassr   r   
getproxiessecureget
startswith)r7   proxiesschemesr   r"   r   r   r   r   b   s   


r   ws_uriuser_agent_headerbytesc                 C  s   t |j|j|jdd}t }t |j|j|j|d< |d ur!||d< | jd ur6| jd us-J t| j| j|d< d| d |	  S )NT)Zalways_include_portHostz
User-AgentzProxy-AuthorizationzCONNECT z HTTP/1.1
)
r   r   r   r@   r   r   r   r   r2   	serialize)r"   rE   rF   r   headersr   r   r   prepare_connect_request   s   
rK   )r"   r   r   r   )r7   r
   r   r   )r"   r   rE   r
   rF   r   r   rG   )
__future__r   dataclassesurllib.parser+   urllib.requestZdatastructuresr   
exceptionsr   rJ   r   r   Zhttp11r   r7   r	   r
   __all__	dataclassr   r   r   rK   r   r   r   r   <module>   s     

2'