o
    hA                  
   @   s  d Z ddlZddlZddlZddlZddlmZ dZdZdZ	e
dZe
d	jd
dddddZe
djddddZe
d
e
de
de
de
de
de
de
ddZe
dZe
dZG dd dejZd:dedeje defddZdedefd d!Zd"ejejeef  d#edeje fd$d%Zd&ed'ed(eddfd)d*Zd&edefd+d,Zd-edefd.d/Zd;d1ed2edefd3d4Zd;d1ed2edefd5d6Z d7ej!ej"eef  defd8d9Z#dS )<a  
An implementation of `urlparse` that provides URL validation and normalization
as described by RFC3986.

We rely on this implementation rather than the one in Python's stdlib, because:

* It provides more complete URL validation.
* It properly differentiates between an empty querystring and an absent querystring,
  to distinguish URLs with a trailing '?'.
* It handles scheme, hostname, port, and path normalization.
* It supports IDNA hostnames, normalizing them to their encoded form.
* The API supports passing individual components, as well as the complete URL string.

Previously we relied on the excellent `rfc3986` package to handle URL parsing and
validation, but this module provides a simpler alternative, with less indirection
required.
    N   )
InvalidURLi   zBABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~z!$&'()*+,;=z%[A-Fa-f0-9]{2}z(?:(?P<scheme>{scheme}):)?(?://(?P<authority>{authority}))?(?P<path>{path})(?:\?(?P<query>{query}))?(?:#(?P<fragment>{fragment}))?z([a-zA-Z][a-zA-Z0-9+.-]*)?z[^/?#]*z[^?#]*z[^#]*z.*scheme	authoritypathqueryfragmentzA(?:(?P<userinfo>{userinfo})@)?(?P<host>{host}):?(?P<port>{port})?z[^@]*z(\[.*\]|[^:]*))userinfohostport)r   r   r   r   r	   r
   r   r   z ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$z^\[.*\]$c                   @   s   e Zd ZU eed< eed< eed< eje ed< eed< eje ed< eje ed< edefd	d
Z	edefddZ
deje dd fddZdefddZdS )ParseResultr   r
   r   r   r   r   r	   returnc                 C   sV   d | jr| j dndd| jv rd| j dn| j| jd ur'd| j gS dgS )N @:[])joinr
   r   r   self r   E/var/www/html/ai/venv/lib/python3.10/site-packages/httpx/_urlparse.pyr   g   s   zParseResult.authorityc                 C   sB   d d| jv rd| j dn| j| jd urd| j gS dgS )Nr   r   r   r   )r   r   r   r   r   r   r   netlocq   s   zParseResult.netlockwargsc                 K   s:   |s| S | j | j| j| j| jd}|| tdi |S )Nr   r   r   )r   r   r   r   r	   updateurlparse)r   r   defaultsr   r   r   	copy_withz   s   
zParseResult.copy_withc                 C   sl   | j }d| jr| j dnd|rd| nd| j| jd ur$d| j nd| jd ur2d| j gS dgS )Nr   r   //?#)r   r   r   r   r   r	   )r   r   r   r   r   __str__   s   zParseResult.__str__N)__name__
__module____qualname__str__annotations__typingOptionalintpropertyr   r   r   r#   r   r   r   r   r   ^   s   
 	r   r   urlr   r   c                 K   sn  t | tkr
tdtdd | D rtdd|v r,|d }t|tr(t|n||d< d|v rC|dp6d}|d\|d	< }|d< d
|v sKd|v rlt	|d
dpSd}t	|ddp]d}|rh| d| n||d< d|v r|dpvd}|d\|d< }|d< |sd |d< d	|v r|
d	pd}	d|	v r|	dr|	dsd|	 d|d	< | D ]6\}
}|d urt |tkrtd|
 dtdd |D rtd|
 dt|
 |std|
 dqt| }|d usJ | }|
d|d pd}|
d|d pd}|
d|d pd}|
d|d }|
d|d }t|}|d us0J | }|
d|d p>d}|
d	|d	 pId}	|
d|d }| }t	|td d}t|	}t||}|dk}|dkpx|dkpx|d u}t|||d |rt|}t	|td d}|d u rd nt	|td d}|d u rd nt	|td  d}t|||||||S )!NzURL too longc                 s   "    | ]}|  o|  V  qd S Nisasciiisprintable.0charr   r   r   	<genexpr>        zurlparse.<locals>.<genexpr>z,Invalid non-printable ASCII character in URLr   r   r   r   r   usernamepasswordr
   raw_pathr!   r   r   r   r   zURL component 'z
' too longc                 s   r.   r/   r0   r3   r   r   r   r6      r7   z8Invalid non-printable ASCII character in URL component ''zInvalid URL component 'r   r   r	   safe)
has_schemehas_authorityz:/[]@z:?[]@z:/?#[]@)lenMAX_URL_LENGTHr   any
isinstancer+   r'   pop	partitionquoteget
startswithendswithitemsCOMPONENT_REGEX	fullmatch	URL_REGEXmatch	groupdictAUTHORITY_REGEXlower
SUB_DELIMSencode_hostnormalize_portvalidate_pathnormalize_pathr   )r-   r   r   r   _r8   r9   r:   	seperatorr   keyvalue	url_matchurl_dictr   r   r   r   r	   authority_matchauthority_dictr
   parsed_schemeparsed_userinfoparsed_hostparsed_portr>   r?   parsed_pathparsed_queryparsed_fragmentr   r   r   r      s   



r   r   c                 C   s   | sdS t | r!zt|  W | S  tjy    td| w t| rGzt| dd  W n tjy@   td| w | dd S |  rSt	| 
 tdS zt| 
 dW S  tjym   td| w )	Nr   zInvalid IPv4 address: r   zInvalid IPv6 address: r<   asciizInvalid IDNA hostname: )IPv4_STYLE_HOSTNAMErN   	ipaddressIPv4AddressAddressValueErrorr   IPv6_STYLE_HOSTNAMEIPv6Addressr1   rF   rQ   rR   idnaencodedecode	IDNAError)r   r   r   r   rS     s.   

	rS   r   r   c                 C   sd   | d u s| dkr
d S zt | }W n ty   td| w dddddd|}||kr0d S |S )Nr   zInvalid port:    P   i  )ftphttphttpswswss)r+   
ValueErrorr   rG   )r   r   port_as_intdefault_portr   r   r   rT   L  s   rT   r   r>   r?   c                 C   sR   |r| r|  dstddS dS |  drtd|  dr%|s'tddS dS )z
    Path validation rules that depend on if the URL contains a scheme or authority component.

    See https://datatracker.ietf.org/doc/html/rfc3986.html#section-3.3
    /z7For absolute URLs, path must be empty or begin with '/'r    zFURLs with no authority component cannot have a path starting with '//'r   zBURLs with no scheme component cannot have a path starting with ':'N)rH   r   )r   r>   r?   r   r   r   rU   i  s   
rU   c                 C   sV   |  d}g }|D ]}|dkrq	|dkr |r|dgkr|  q	|| q	d|S )z
    Drop "." and ".." segments from a URL path.

    For example:

        normalize_path("/path/./to/somewhere/..") == "/path/to"
    r|   .z..r   )splitrD   appendr   )r   
componentsoutput	componentr   r   r   rV     s   
	
rV   r5   c                 C   s   d dd | dD  S )a  
    Replace a single character with the percent-encoded representation.

    Characters outside the ASCII range are represented with their a percent-encoded
    representation of their UTF-8 byte sequence.

    For example:

        percent_encode(" ") == "%20"
    r   c                 S   s   g | ]}d |dqS )%02xr   )r4   byter   r   r   
<listcomp>  s    z"percent_encode.<locals>.<listcomp>zutf-8)r   ro   upper)r5   r   r   r   percent_encode  s   r   r|   stringr=   c                 C   s<   t | d }| D ]	}||vr dS q| dtt| kS )z<
    Determine if a given string is already quote-safe.
    r   F)UNRESERVED_CHARACTERScountr@   PERCENT_ENCODED_REGEXfindall)r   r=   NON_ESCAPED_CHARSr5   r   r   r   is_safe  s   r   c                    s0   t | |dr| S t|  d fdd| D S )z=
    Use percent-encoding to quote a string if required.
    r<   r   c                    s    g | ]}| v r
|nt |qS r   )r   r3   r   r   r   r     s     zquote.<locals>.<listcomp>)r   r   r   )r   r=   r   r   r   rF     s   rF   rJ   c                 C   s   d dd | D S )N&c                 S   s,   g | ]\}}t |d dd t |d d qS )r   r<   =)rF   )r4   kvr   r   r   r     s   , zurlencode.<locals>.<listcomp>)r   )rJ   r   r   r   	urlencode  s   r   r   )r|   )$__doc__ri   rer)   rn   _exceptionsr   rA   r   rR   compiler   formatrM   rP   rK   rh   rl   
NamedTupler   r'   r*   r   rS   Unionr+   rT   boolrU   rV   r   r   rF   ListTupler   r   r   r   r   <module>   sr    


7 
.
&