U
    zbD                     @   s   d dl ZddlmZ ddlmZ ddlmZ ddlmZ e	ej
e	 eddd	Zde	eje	 ejeje	eje f  ejej
e	  e	d
ddZde	e	eje	 eje	 eje e	dddZdS )    N   )_encode_idna)SecurityError)
uri_to_iri)	url_quote)hostnametrusted_listreturnc              	   C   s   | sdS t |tr|g}ttddd}z|| }W n tk
rJ   Y dS X |D ]p}|drp|dd }d}nd}z||}W n tk
r   Y  dS X ||kr dS |rP|d	| rP dS qPdS )
zCheck if a host matches a list of trusted names.

    :param hostname: The name to check.
    :param trusted_list: A list of valid names to match. If a name
        starts with a dot it will match all subdomains.

    .. versionadded:: 0.9
    F)r   r	   c                 S   s    d| kr|  ddd } t| S )N:   r   )rsplitr   )r    r   9/tmp/pip-unpacked-wheel-lj3h0ozw/werkzeug/sansio/utils.py
_normalize   s    z#host_is_trusted.<locals>._normalize.r   NT   .)
isinstancestrbytesUnicodeError
startswithendswith)r   r   r   Zhostname_bytesrefZsuffix_matchZ	ref_bytesr   r   r   host_is_trusted	   s.    	


r   )schemehost_headerservertrusted_hostsr	   c                 C   s   d}|dk	r|}n.|dk	r@|d }|d dk	r@| d|d  }| dkr`| dr`|dd }n| d	kr~| d
r~|dd }|dk	rt||std|d|S )a$  Return the host for the given parameters.

    This first checks the ``host_header``. If it's not present, then
    ``server`` is used. The host will only contain the port if it is
    different than the standard port for the protocol.

    Optionally, verify that the host is trusted using
    :func:`host_is_trusted` and raise a
    :exc:`~werkzeug.exceptions.SecurityError` if it is not.

    :param scheme: The protocol the request used, like ``"https"``.
    :param host_header: The ``Host`` header value.
    :param server: Address of the server. ``(host, port)``, or
        ``(path, None)`` for unix sockets.
    :param trusted_hosts: A list of trusted host names.

    :return: Host, with port if necessary.
    :raise ~werkzeug.exceptions.SecurityError: If the host is not
        trusted.
     Nr   r   r
   >   wshttpz:80>   httpswssz:443zHost z is not trusted.)r   r   r   )r   r   r   r   hostr   r   r   get_host8   s    
r&   )r   r%   	root_pathpathquery_stringr	   c                 C   s   | d|g}|dkr*| d td|S | t|d | d |dkr^td|S | t|d |r| d | t|dd td|S )a  Recreate the URL for a request. If an optional part isn't
    provided, it and subsequent parts are not included in the URL.

    The URL is an IRI, not a URI, so it may contain Unicode characters.
    Use :func:`~werkzeug.urls.iri_to_uri` to convert it to ASCII.

    :param scheme: The protocol the request used, like ``"https"``.
    :param host: The host the request was made to. See :func:`get_host`.
    :param root_path: Prefix that the application is mounted under. This
        is prepended to ``path``.
    :param path: The path part of the URL after ``root_path``.
    :param query_string: The portion of the URL after the "?".
    z://N/r   ?z:&%=+$!*'(),)safe)appendr   joinr   rstriplstrip)r   r%   r'   r(   r)   urlr   r   r   get_current_urlh   s    



r2   )NN)NNN)typingt	_internalr   
exceptionsr   urlsr   r   r   Iterableboolr   OptionalTupleintr&   r   r2   r   r   r   r   <module>   s2   2  3   