o
    _ii                     @  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   R/sda-disk/www/egybert/egybert_env/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.

    )socks5hsocks5socks4a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)r;   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)always_include_portHostz
User-AgentzProxy-AuthorizationzCONNECT z HTTP/1.1
)
r   r   r   rD   r   r   r   r   r6   	serialize)r"   rI   rJ   r   headersr   r   r   prepare_connect_request   s   
rP   )r"   r   r   r   )r;   r
   r   r   )r"   r   rI   r
   rJ   r   r   rK   )
__future__r   dataclassesurllib.parser/   urllib.requestdatastructuresr   
exceptionsr   rO   r   r   http11r   r;   r	   r
   __all__	dataclassr   r   r   rP   r   r   r   r   <module>   s     

2'