3
¥YðiD  ã               @   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r¢dS |rP|jd	| ƒrPdS qPW dS )
zôCheck 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-8om4l6ph/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	r t||ƒs t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.  