o
    Ð­ji  ã                   @  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   úM/var/www/html/CropPilot/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s�J ‚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'ý