
    'g                        d dl mZ 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dZ	 	 d	 	 	 	 	 	 	 	 	 dd	Z	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd
Z	 	 d	 	 	 	 	 ddZy)    )annotationsN)quote   )
_plain_int)SecurityError)
uri_to_iric                   | sy	 | j                  d      d   j                  d      j                  d      } t	        |t
              r|g}|D ]n  }|j                  d      r|dd }d	}nd}	 |j                  d      d   j                  d      j                  d      }|| k(  s|sY| j                  d|       sn y	 y# t        $ r Y yw xY w# t        $ r Y  yw xY w)
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   idnaascii.   NT)	partitionencodedecodeUnicodeEncodeError
isinstancestr
startswithendswith)hostnametrusted_listrefsuffix_matchs       M/var/www/html/knws/venv/lib/python3.12/site-packages/werkzeug/sansio/utils.pyhost_is_trustedr      s     %%c*1-44V<CCGL ,$$~ >>#ab'CL L	--$Q'..v6==gFC (?|0A0AAcU)0L +   " 		s#   2B> +2C>	C
	C
	CCc                   d}||}n(|&|d   }d|v r|d   dk7  rd| d}|d   
| d|d    }| dv r|j                  d	      r|dd
 }n| dv r|j                  d      r|dd }|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.

    .. versionchanged:: 3.1.3
        If ``SERVER_NAME`` is IPv6, it is wrapped in ``[]``.
     Nr   r
   []r   >   wshttpz:80>   wsshttpsz:443zHost z is not trusted.)r   r   r   )schemehost_headerservertrusted_hostshosts        r   get_hostr,   1   s    : D		ay $;47c>tfA;D!9 V1VAYK(DDMM%$8CRy	#	#f(=CRy t]3%x/? @AAK    c                   | d|g}|+|j                  d       t        dj                  |            S |j                  t        |j	                  d      d             |j                  d       |t        dj                  |            S |j                  t        |j                  d      d             |r-|j                  d       |j                  t        |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:///r   z!$&'()*+,/:;=@%)safe?z!$&'()*+,/:;=?@%)appendr   joinr   rstriplstrip)r'   r+   	root_pathpathquery_stringurls         r   get_current_urlr:   i   s    ( 5$
C

3"''#,'' JJuY%%c*1BCDJJsO|"''#,''JJuT[[%,=>?

3

5,>?@bggcl##r-   c                \    |dk(  s| y	 t        dt        |             S # t        $ r Y yw xY w)a  Return the ``Content-Length`` header value as an int. If the header is not given
    or the ``Transfer-Encoding`` header is ``chunked``, ``None`` is returned to indicate
    a streaming request. If the value is not an integer, or negative, 0 is returned.

    :param http_content_length: The Content-Length HTTP header.
    :param http_transfer_encoding: The Transfer-Encoding HTTP header.

    .. versionadded:: 2.2
    chunkedNr   )maxr   
ValueError)http_content_lengthhttp_transfer_encodings     r   get_content_lengthrA      s?     *.A.I1j!4566 s    	++)r   
str | Noner   zt.Iterable[str]returnbool)NN)
r'   r   r(   rB   r)   ztuple[str, int | None] | Noner*   zt.Iterable[str] | NonerC   r   )NNN)r'   r   r+   r   r6   rB   r7   rB   r8   zbytes | NonerC   r   )r?   rB   r@   rB   rC   z
int | None)
__future__r   typingturllib.parser   	_internalr   
exceptionsr   urlsr   r   r,   r:   rA    r-   r   <module>rM      s    "   " & #R -1,0	555 *5 *	5
 	5v !!%($($
($ ($ 	($
 ($ 	($X '+)-#& r-   