o
    0cD                     @   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 de	dej
e	 d	efd
dZ		dde	deje	 dejeje	eje f  dejej
e	  d	e	f
ddZ			dde	de	deje	 deje	 deje d	e	f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}dtdtfdd}z|| }W n
 ty%   Y dS w |D ]7}|dr8|dd }d	}nd}z||}W n tyK   Y  dS w ||krS d	S |r_|d
| r_ d	S q(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
    Fr   r	   c                 S   s    d| v r|  ddd } t| S )N:   r   )rsplitr   )r    r   K/var/www/html/gps/gps/lib/python3.10/site-packages/werkzeug/sansio/utils.py
_normalize   s   z#host_is_trusted.<locals>._normalize.r   NT   .)
isinstancestrbytesUnicodeError
startswithendswith)r   r   r   hostname_bytesrefsuffix_match	ref_bytesr   r   r   host_is_trusted	   s4   	

r   schemehost_headerservertrusted_hostsc                 C   s   d}|dur	|}n|dur |d }|d dur | d|d  }| dv r0| dr0|dd }n| d	v r?| d
r?|dd }|durPt||sPt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>   wsshttpsz:443zHost z is not trusted.)r   r   r   )r   r   r   r    hostr   r   r   get_host8   s   
r)   r(   	root_pathpathquery_stringc                 C   s   | d|g}|du r| d td|S | t|d | d |du r/td|S | t|d |rI| 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   



r5   )NN)NNN)typingt	_internalr   
exceptionsr   urlsr   r   r   Iterableboolr   OptionalTupleintr)   r   r5   r   r   r   r   <module>   sF    2
3