3
eD                 @   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}y|| }W n tk
rH   dS X xp|D ]h}|jdrp|dd }d}nd}y||}W n tk
r   dS X ||krdS |rP|jd	| rPdS qPW d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| j ddd } t| S )N:   r   )rsplitr   )r    r   9/tmp/pip-build-3irwxpxt/Werkzeug/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`|j dr`|dd }n| dkr~|j 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
   httpwsz:80   httpswssz:443   zHost z is not trusted.>   r    r   >   r"   r#   )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*|j d tdj|S |j t|jd |j d |dkr^tdj|S |j t|jd |r|j d |j t|dd tdj|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    



r4   )NN)NNN)typingtZ	_internalr   
exceptionsr   urlsr   r   r   Iterableboolr   OptionalTupleintr(   r   r4   r   r   r   r   <module>   s   2 2.  