U
    /v¶h  ã                   @  sJ  d dl mZ d dlZd dlZd dl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lmZ dd	lmZ d
ddœdd„Ze de¡ ddddœdd„Zeedƒd-˜ƒ ¡ ZedeƒZeded ƒZeded ƒZeded ƒZdddœd d!„Zddd"œd#d$„Zd%ejjk�r&ejj d%¡ ddd&œd'd(„Zd)dd*œd+d,„Z dS ).é    )ÚannotationsN)Úquote)Úunquote)Ú	urlencode)Úurlsplit)Ú
urlunsplité   )Úiter_multi_itemsÚUnicodeErrorztuple[str, int])ÚeÚreturnc                 C  s$   t | j| j| j… dd�}|| jfS )zRUsed in :func:`uri_to_iri` after unquoting to re-quote any
    invalid bytes.
    Ú ©Úsafe)r   ÚobjectÚstartÚend)r   Úout© r   ú1/tmp/pip-unpacked-wheel-c3xdgso7/werkzeug/urls.pyÚ_codec_error_url_quote   s    r   úwerkzeug.url_quoteÚstrzt.Callable[[str], str])ÚnameÚcharsr   c                   sR   d  dd„ t|ƒD ƒ¡}t d|› d�tj¡‰ dddœ‡ fdd	„}d
| › �|_|S )zÑCreate a function that unquotes all percent encoded characters except those
    given. This allows working with unquoted characters if possible while not changing
    the meaning of a given part of a URL.
    ú|c                 s  s   | ]}t |ƒd ›V  qdS )Z02XN)Úord)Ú.0Úcr   r   r   Ú	<genexpr>"   s     z%_make_unquote_part.<locals>.<genexpr>z((?:%(?:z))+)r   )Úvaluer   c                   sH   t ˆ  | ¡ƒ}g }|D ]&}| t|ddƒ¡ | t|dƒ¡ qd |¡S )Nzutf-8r   r   )ÚiterÚsplitÚappendr   ÚnextÚjoin)r    Úpartsr   Úpart©Úpatternr   r   Ú_unquote_partial%   s    z,_make_unquote_part.<locals>._unquote_partialZ	_unquote_)r%   ÚsortedÚreÚcompileÚIÚ__name__)r   r   Úchoicesr*   r   r(   r   Ú_make_unquote_part   s
    
r1   é!   é%   é   ÚfragmentÚqueryz&=+#Úpathz/?#Úuserz:@/?#)Úurir   c                 C  s¶   t | ƒ}t|jƒ}t|jƒ}t|jƒ}|jr8t|jƒ}nd}d|krPd|› d�}|j	rf|› d|j	› �}|j
r¢t|j
ƒ}|jr”t|jƒ}|› d|› �}|› d|› �}t|j||||fƒS )a-  Convert a URI to an IRI. All valid UTF-8 characters are unquoted,
    leaving all reserved and invalid characters quoted. If the URL has
    a domain, it is decoded from Punycode.

    >>> uri_to_iri("http://xn--n3h.net/p%C3%A5th?q=%C3%A8ry%DF")
    'http://\u2603.net/p\xe5th?q=\xe8ry%DF'

    :param uri: The URI to convert.

    .. versionchanged:: 3.0
        Passing a tuple or bytes, and the ``charset`` and ``errors`` parameters,
        are removed.

    .. versionchanged:: 2.3
        Which characters remain quoted is specific to each part of the URL.

    .. versionchanged:: 0.15
        All reserved and invalid characters remain quoted. Previously,
        only some reserved characters were preserved, and invalid bytes
        were replaced instead of left quoted.

    .. versionadded:: 0.6
    r   ú:ú[ú]ú@)r   Ú_unquote_pathr7   Ú_unquote_queryr6   Ú_unquote_fragmentr5   ÚhostnameÚ_decode_idnaÚportÚusernameÚ_unquote_userÚpasswordr   Úscheme)r9   r&   r7   r6   r5   ÚnetlocÚauthrF   r   r   r   Ú
uri_to_iri=   s$    




rJ   )Úirir   c                 C  sÒ   t | ƒ}t|jdd�}t|jdd�}t|jdd�}|jrL|j d¡ d¡}nd}d|krdd	|› d
�}|jrz|› d|j› �}|j	r¾t|j	dd�}|j
r°t|j
dd�}|› d|› �}|› d|› �}t|j||||fƒS )a,  Convert an IRI to a URI. All non-ASCII and unsafe characters are
    quoted. If the URL has a domain, it is encoded to Punycode.

    >>> iri_to_uri('http://\u2603.net/p\xe5th?q=\xe8ry%DF')
    'http://xn--n3h.net/p%C3%A5th?q=%C3%A8ry%DF'

    :param iri: The IRI to convert.

    .. versionchanged:: 3.0
        Passing a tuple or bytes, the ``charset`` and ``errors`` parameters,
        and the ``safe_conversion`` parameter, are removed.

    .. versionchanged:: 2.3
        Which characters remain unquoted is specific to each part of the URL.

    .. versionchanged:: 0.15
        All reserved characters remain unquoted. Previously, only some reserved
        characters were left unquoted.

    .. versionchanged:: 0.9.6
       The ``safe_conversion`` parameter was added.

    .. versionadded:: 0.6
    z%!$&'()*+,/:;=@r   z%!$&'()*+,/:;=?@z%!#$&'()*+,/:;=?@ÚidnaÚasciir   r:   r;   r<   z%!$&'()*+,;=r=   )r   r   r7   r6   r5   rA   ÚencodeÚdecoderC   rD   rF   r   rG   )rK   r&   r7   r6   r5   rH   rI   rF   r   r   r   Ú
iri_to_uriq   s$    rP   zitms-services)Údomainr   c              	   C  s¢   z|   d¡}W n tk
r&   |  Y S X z| d¡W S  tk
rH   Y nX g }| d¡D ]>}z| | d¡¡ W qX tk
r”   | | d¡¡ Y qXX qXd |¡S )NrM   rL   ó   .Ú.)rN   ÚUnicodeEncodeErrorrO   ÚUnicodeDecodeErrorr"   r#   r%   )rQ   Údatar&   r'   r   r   r   rB   ¯   s    
rB   z1t.Mapping[str, str] | t.Iterable[tuple[str, str]])r6   r   c                 C  s   dd„ t | ƒD ƒ}t|dd�S )Nc                 S  s   g | ]}|d  dk	r|‘qS )r   Nr   )r   Úxr   r   r   Ú
<listcomp>É   s      z_urlencode.<locals>.<listcomp>z!$'()*,/:;?@r   )r	   r   )r6   Úitemsr   r   r   Ú
_urlencodeÈ   s    rZ   )r3   r4   )!Ú
__future__r   Úcodecsr,   ÚtypingÚtÚurllib.parseÚurllibr   r   r   r   r   Zdatastructuresr	   r   Úregister_errorr1   ÚbytesÚrangerO   Z_always_unsafer@   r?   r>   rE   rJ   rP   ÚparseÚuses_netlocr#   rB   rZ   r   r   r   r   Ú<module>   s0   

4: