U
    ÈZj"  ã                   @   sê   d Z ddlmZmZmZmZ ddlmZ ddlZddl	Z	ddl
Z
ddlmZ ddlmZmZmZmZmZ e
jdk r”dd	lmZmZ dd
lmZmZ nddlmZmZmZmZ ddd„Zdd„ Zdd„ Ze  de¡ ddd„Z!ddd„Z"dS )z‡
Functions to convert unicode IRIs into ASCII byte string URIs and back. Exports
the following items:

 - iri_to_uri()
 - uri_to_iri()
é    )Úunicode_literalsÚdivisionÚabsolute_importÚprint_function)ÚidnaNé   )Úunwrap)Úbyte_clsÚstr_clsÚ	type_nameÚbytes_to_listÚ	int_types)é   )ÚurlsplitÚ
urlunsplit)ÚquoteÚunquote)r   Úunquote_to_bytesr   r   Fc                 C   s$  t | tƒsttdt| ƒƒƒ‚d}tjdk rž|  d¡sž|  d¡sžd}t 	d| ¡}|rp| 
d¡}d| t|ƒd…  } t| ƒ}|r¦|| dd…  } t|dd	… ƒ}nt| ƒ}|dkr¸t|jƒ}|j}|dk	rÐ| d
¡}t|jdd�}t|jdd�}|j}	|	dk	�r
t|	ƒ d¡}	d}
|dk	�r:|
|7 }
|�r2|
d| 7 }
|
d7 }
|dk	�rL|
|7 }
|	dk	�r˜|dk�of|	dk}|dk�ox|	dk}|�rŒ|�s˜|�s˜|
d|	 7 }
t|jdd�}t|jdd�}t|jdd�}|�rê|dk�rê|dk�rê|dk�rêd}|dk�rød}t||
|||fƒ}t |tƒ�r | d¡}|S )zö
    Encodes a unicode IRI into an ASCII byte string URI

    :param value:
        A unicode string of an IRI

    :param normalize:
        A bool that controls URI normalization

    :return:
        A byte string of the ASCII-encoded URI
    z@
            value must be a unicode string, not %s
            N)é   é   zhttp://zhttps://z	^[^:]*://r   r   éýÿÿÿr   z!$&'()*+,;=©ÚsafeÚasciió    ó   :ó   @s   https   80s   httpss   443z/!$&'()*+,;=@:z/?!$&'()*+,;=@:ó   /Ú Úlatin1)Ú
isinstancer
   Ú	TypeErrorr   r   ÚsysÚversion_infoÚ
startswithÚreÚmatchÚgroupÚlenr   Ú	_urlquoteÚschemeÚhostnameÚencodeÚusernameÚpasswordÚportÚpathÚqueryÚfragmentr   )ÚvalueÚ	normalizer*   Úreal_prefixZprefix_matchÚparsedr+   r-   r.   r/   ÚnetlocZdefault_httpZdefault_httpsr0   r1   r2   Úoutput© r9   úR/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/asn1crypto/_iri.pyÚ
iri_to_uri%   sf    
ü






$

r;   c                 C   s(  t | tƒsttdt| ƒƒƒ‚t| ƒ}|j}|dk	r<| d¡}t|j	ddgd�}t|j
ddgd�}|j}|rt| d¡}|j}|r’t |tƒs’| d¡}d}|dk	r¾||7 }|r¶|d| 7 }|d7 }|dk	rÎ||7 }|dk	ræ|dt|ƒ 7 }t|jd	gd
d�}t|jddgd
d�}	t|jƒ}
t||||	|
fƒS )z³
    Converts an ASCII URI byte string into a unicode IRI

    :param value:
        An ASCII-encoded byte string of the URI

    :return:
        A unicode string of the IRI
    z=
            value must be a byte string, not %s
            Nr   ú:ú@)Úremapr   r   ú/T)r>   Úpreserveú&ú=)r    r	   r!   r   r   r   r*   ÚdecodeÚ_urlunquoter-   r.   r+   r/   r   r
   r0   r1   r2   r   )r3   r6   r*   r-   r.   r+   r/   r7   r0   r1   r2   r9   r9   r:   Ú
uri_to_irix   s>    
ü



rE   c                 C   s4   t | j| j| j… ƒ}dd„ |D ƒ}d |¡| jfS )a>  
    Error handler for decoding UTF-8 parts of a URI into an IRI. Leaves byte
    sequences encoded in %XX format, but as part of a unicode string.

    :param exc:
        The UnicodeDecodeError exception

    :return:
        A 2-element tuple of (replacement unicode string, integer index to
        resume at)
    c                 S   s   g | ]}d | ‘qS )ú%%%02xr9   )Ú.0Únumr9   r9   r:   Ú
<listcomp>º   s     z,_iri_utf8_errors_handler.<locals>.<listcomp>r   )r   ÚobjectÚstartÚendÚjoin)ÚexcZbytes_as_intsÚreplacementsr9   r9   r:   Ú_iri_utf8_errors_handler¬   s    rP   Úiriutf8r   c                    s®   | dks| dkrdS g ‰ t  d| ¡rX‡fdd„}t  d|| ¡} ‡ fdd„}t  d|| ¡} t|  d	¡ˆ d	¡d
�}t|tƒs„| d¡}tˆ ƒdkrª‡ fdd„}t  d||¡}|S )a  
    Quotes a unicode string for use in a URL

    :param string:
        A unicode string

    :param safe:
        A unicode string of character to not encode

    :return:
        None (if string is None) or an ASCII byte string of the quoted string
    Nr   z%[0-9a-fA-F]{2}c                    s@   t |  d¡ƒ}| dd¡}tˆ ƒD ]}| |dt|ƒ ¡}q"|S )Nr   úutf-8rQ   rF   )r   r'   rC   ÚlistÚreplaceÚord)r&   Úbyte_stringZunicode_stringZ	safe_charr   r9   r:   Ú_try_unescapeÙ   s
    z _urlquote.<locals>._try_unescapez(?:%[0-9a-fA-F]{2})+c                    s   ˆ   |  d¡ d¡¡ dS )Nr   r   ú )Úappendr'   r,   )r&   ©Úescapesr9   r:   Ú_extract_escapeã   s    z"_urlquote.<locals>._extract_escaperR   r   r   r   c                    s
   ˆ   d¡S )Nr   )Úpop)Ú_rZ   r9   r:   Ú_return_escapeî   s    z!_urlquote.<locals>._return_escapes   %00)r%   ÚsearchÚsubÚurlquoter,   r    r	   r(   )Ústringr   rW   r\   r8   r_   r9   )r[   r   r:   r)   Á   s    

r)   c           	      C   sÊ   | dkr| S | dkrdS |rbdddddg}i }|D ].}|  d	¡}|||< |  | d
¡| d
¡¡} q2t| ƒ} |r˜|D ]$}|  | d
¡dt|ƒ  d
¡¡} qr|  dd¡}|rÆ| ¡ D ]\}}| ||¡}q°|S )a  
    Unquotes a URI portion from a byte string into unicode using UTF-8

    :param byte_string:
        A byte string of the data to unquote

    :param remap:
        A list of characters (as unicode) that should be re-mapped to a
        %XX encoding. This is used when characters are not valid in part of a
        URL.

    :param preserve:
        A bool - indicates that the chars to be remapped if they occur in
        non-hex form, should be preserved. E.g. / for URL path.

    :return:
        A unicode string
    Nr   r   úúúúúr   r   rF   rR   rQ   )r]   rT   r,   r   rU   rC   Úitems)	rV   r>   r@   rO   Zpreserve_unmapÚcharÚreplacementr8   Úoriginalr9   r9   r:   rD   õ   s(    
"rD   )F)r   )NN)#Ú__doc__Ú
__future__r   r   r   r   Ú	encodingsr   Úcodecsr%   r"   Ú_errorsr   Ú_typesr	   r
   r   r   r   r#   Úurlparser   r   Úurllibr   rb   r   r   Úurllib.parser;   rE   rP   Úregister_errorr)   rD   r9   r9   r9   r:   Ú<module>   s"   

S4
4