B
    ]b                 @  sl   d dl mZ d dlZd dlZd dlmZmZ ddlm	Z	 ddgZ
ejG dd dZd	Zd
ddddZdS )    )annotationsN)OptionalTuple   )
exceptions	parse_uriWebSocketURIc               @  sn   e Zd ZU dZded< ded< ded< ded< ded	< d
ed< d
ed< eddddZeddddZdS )r   a  
    WebSocket URI.

    Attributes:
        secure: :obj:`True` for a ``wss`` URI, :obj:`False` for a ``ws`` URI.
        host: Normalized to lower case.
        port: Always set even if it's the default.
        path: May be empty.
        query: May be empty if the URI doesn't include a query component.
        username: Available when the URI contains `User Information`_.
        password: Available when the URI contains `User Information`_.

    .. _User Information: https://www.rfc-editor.org/rfc/rfc3986.html#section-3.2.1

    boolsecurestrhostintportpathqueryzOptional[str]usernamepassword)returnc             C  s*   | j r| j }nd}| jr&|d| j 7 }|S )N/?)r   r   )selfresource_name r   -lib/python3.7/site-packages/websockets/uri.pyr   '   s    zWebSocketURI.resource_namezOptional[Tuple[str, str]]c             C  s(   | j d krd S | jd k	st| j | jfS )N)r   r   AssertionError)r   r   r   r   	user_info1   s    
zWebSocketURI.user_infoN)__name__
__module____qualname____doc____annotations__propertyr   r   r   r   r   r   r      s   

z:/?#[]@!$&'()*+,;=r   )urir   c       	      C  sD  t j| }|jdkr"t| d|jdkr8t| d|jdkrNt| d|jdk}|j}|jpn|rldnd	}|j	}|j
}|j}|j}|dk	r|dkrt| d
y| d W n| tk
r.   |d }t jj|td}t jj|td}|dk	r*|dk	s
tt jj|td}t jj|td}Y nX t|||||||S )z
    Parse and validate a WebSocket URI.

    Args:
        uri: WebSocket URI.

    Returns:
        WebSocketURI: Parsed WebSocket URI.

    Raises:
        InvalidURI: if ``uri`` isn't a valid WebSocket URI.

    )Zwswsszscheme isn't ws or wssNzhostname isn't provided z"fragment identifier is meaninglessr#   i  P   z"username provided without passwordasciiZidna)Zsafe)urllibparseZurlparseZschemer   Z
InvalidURIZhostnameZfragmentr   r   r   r   r   encodeUnicodeEncodeErrordecodeZquoteDELIMSr   r   )	r"   Zparsedr
   r   r   r   r   r   r   r   r   r   r   =   s6    




)Z
__future__r   ZdataclassesZurllib.parser'   typingr   r   r$   r   __all__Z	dataclassr   r,   r   r   r   r   r   <module>   s   -