o
    )if8E                  
   @  s^  d Z 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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dEdFd!d"ZdGd$d%ZdHd*d+ZdId1d2ZdJd3d4ZdKd6d7ZdLdMd;d<ZdLdNd=d>ZdLdNd?d@ZdOdCdDZdS )Pa  
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.
    )annotationsN   )
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(\[.*\]|[^:@]*))userinfohostportz[^@]*z(\[.*\]|[^:]*))r   r   r   r	   r
   r   r   r   z ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$z^\[.*\]$c                   @  sv   e Zd ZU ded< ded< ded< ded< ded< ded	< ded
< edddZedddZdddZdddZdS )ParseResultstrr   r   r   
int | Noner   r   
str | Noner	   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   H/var/www/html/corbot_env/lib/python3.10/site-packages/httpx/_urlparse.pyr   i   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   netlocs   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_with|   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)r   r   )r   r   r   r   )	__name__
__module____qualname____annotations__propertyr   r   r#   r'   r   r   r   r   r   `   s   
 	
r   r   urlr   r   r   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
isinstanceintr   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_HOSTNAMErO   	ipaddressIPv4AddressAddressValueErrorr   IPv6_STYLE_HOSTNAMEIPv6Addressr1   rG   rR   rS   idnaencodedecode	IDNAError)r   r   r   r   rT     s.   

	rT   r   str | int | Noner   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)rD   
ValueErrorr   rH   )r   r   port_as_intdefault_portr   r   r   rU   L  s   
rU   r   r>   boolr?   Nonec                 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)rI   r   )r   r>   r?   r   r   r   rV   g  s   
rV   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   )splitrE   appendr   )r   
componentsoutput	componentr   r   r   rW     s   
	
rW   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   rp   upper)r5   r   r   r   percent_encode  s   r   r   stringr=   c                 C  s(   t | d }| D ]	}||vr dS qdS )z<
    Determine if a given string is already quote-safe.
    r   FT)UNRESERVED_CHARACTERS)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 )z1
    Use percent-encoding to quote a string.
    r<   r   c                   s    g | ]}| v r
|nt |qS r   )r   r3   r   r   r   r     s     z#percent_encoded.<locals>.<listcomp>)r   r   r   )r   r=   r   r   r   percent_encoded  s   r   c           
      C  s   g }d}t t| D ]*}| | }}|d}||kr-| || }|t||d || |}q
|t| krJ| |d }	|t|	|d d	|S )a  
    Use percent-encoding to quote a string, omitting existing '%xx' escape sequences.

    See: https://www.rfc-editor.org/rfc/rfc3986#section-2.1

    * `string`: The string to be percent-escaped.
    * `safe`: A string containing characters that may be treated as safe, and do not
        need to be escaped. Unreserved characters are always treated as safe.
        See: https://www.rfc-editor.org/rfc/rfc3986#section-2.3
    r   r<   Nr   )
refinditerPERCENT_ENCODED_REGEXstartendgroupr   r   r@   r   )
r   r=   partscurrent_positionrO   start_positionend_positionmatched_textleading_texttrailing_textr   r   r   rG     s   


rG   rK   list[tuple[str, str]]c                 C  s   d dd | D S )am  
    We can use a much simpler version of the stdlib urlencode here because
    we don't need to handle a bunch of different typing cases, such as bytes vs str.

    https://github.com/python/cpython/blob/b2f7b2ef0b5421e01efb8c7bee2ef95d3bab77eb/Lib/urllib/parse.py#L926

    Note that we use '%20' encoding for spaces. and '%2F  for '/'.
    This is slightly different than `requests`, but is the behaviour that browsers use.

    See
    - https://github.com/encode/httpx/issues/2536
    - https://github.com/encode/httpx/issues/2721
    - https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode
    &c                 S  s,   g | ]\}}t |d dd t |d d qS )r   r<   =)r   )r4   kvr   r   r   r     s    zurlencode.<locals>.<listcomp>)r   )rK   r   r   r   	urlencode  s
   r   r   )r-   r   r   r   r   r   )r   r   r   r   )r   rs   r   r   r   r   )r   r   r>   r~   r?   r~   r   r   )r   r   r   r   )r5   r   r   r   )r   )r   r   r=   r   r   r~   )r   r   r=   r   r   r   )rK   r   r   r   ) __doc__
__future__r   rj   r   typingro   _exceptionsr   rA   r   rS   compiler   formatrN   rQ   rL   ri   rm   
NamedTupler   r!   rT   rU   rV   rW   r   r   r   rG   r   r   r   r   r   <module>   sj    


7 

.


!