o
    "`^hE                  
   @  sR  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dBdCd!d"ZdDd$d%ZdEd*d+ZdFd1d2ZdGd3d4ZdHd6d7ZdIdJd:d;ZdIdJd<d=ZdKd@dAZdS )La  
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   M/home/air/shanriGPT/back/venv/lib/python3.10/site-packages/httpx/_urlparse.pyr   j   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   netloct   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   a   s   
 	
r   r   urlr   r   r   r   c           #      K  s  t | tkr
tdtdd | D r.tdd | D }| |}d|d| d}t|d|v rC|d }t|tr?t|n||d< d	|v rZ|	d	pMd
}|
d\|d< }|d< d|v sbd|v rt|	dd
pjd
}t|	dd
ptd
}	|	r| d|	 n||d< d|v r|	dpd
}
|

d\|d< }|d< |sd |d< d|v r|dpd
}d|v r|dr|dsd| d|d< | D ]O\}}|d urt |tkrtd| dtdd |D rtdd |D }||}d| d|d| d}t|t| |std| dqt| }|d us!J | }|d|d p/d
}|d|d p:d
}|d|d pEd
}|d|d }|d |d  }t|}|d usbJ | }|d|d ppd
}|d|d p{d
}|d|d }| }t|td d!}t|}t||}|d
k}|d
kp|d
kp|d u}t|||d" |s|rt|}d#}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>c                 s  $    | ]}|  r| s|V  qd S r/   r0   r3   r   r   r   r6      s   " z.Invalid non-printable ASCII character in URL, z at position .r   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   c                 s  r8   r/   r0   r3   r   r   r   r6      s    
z-Invalid non-printable ASCII character in URL z component, zInvalid URL component ''r   r   r
   safe)
has_schemehas_authorityz`{}%|^\"z:/[]@z:/?[]@z:/?#[]@)lenMAX_URL_LENGTHr   anynextfind
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   r5   idxerrorr   r   _r:   r;   r<   	seperatorr   keyvalue	url_matchurl_dictr   r   r   r	   r
   authority_matchauthority_dictr   parsed_schemeparsed_userinfoparsed_hostparsed_portr@   rA   WHATWG_SAFE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 |  rWd}t	| 
 t| dS zt| 
 dW S  tjyq   td	| w )
Nr   zInvalid IPv4 address: r   zInvalid IPv6 address: z"`{}%|\r>   asciizInvalid IDNA hostname: )IPv4_STYLE_HOSTNAMErS   	ipaddressIPv4AddressAddressValueErrorr   IPv6_STYLE_HOSTNAMEIPv6Addressr1   rK   rV   rW   idnaencodedecode	IDNAError)r   rj   r   r   r   rX   /  s0   

	rX   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)rH   
ValueErrorr   rL   )r   r   port_as_intdefault_portr   r   r   rY   ^  s   
rY   r   r@   boolrA   Nonec                 C  sR   |r| r|  dstd|s#|s%|  drtd|  dr'tddS 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$   z3Relative URLs cannot have a path starting with '//'r   z2Relative URLs cannot have a path starting with ':'N)rM   r   )r   r@   rA   r   r   r   rZ   y  s   

rZ   c                 C  sv   d| vr| S |  d}d|vrd|vr| S g }|D ]}|dkr q|dkr0|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"
    r9   r   z..r   )splitrI   appendr   )r   
componentsoutput	componentr   r   r   r[     s   	

r[   stringc                 C  s   d dd | dD S )Nr   c                 S  s   g | ]}d |dqS )%02Xr   )r4   byter   r   r   
<listcomp>  s    zPERCENT.<locals>.<listcomp>zutf-8)r   rw   )r   r   r   r   PERCENT  s   r   r   r?   c                   s.   t |  |  s| S d fdd| D S )z1
    Use percent-encoding to quote a string.
    r   c                   s    g | ]}| v r
|nt |qS r   )r   r3   NON_ESCAPED_CHARSr   r   r     s     z#percent_encoded.<locals>.<listcomp>)UNRESERVED_CHARACTERSrstripr   )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   rB   r   )
r   r?   partscurrent_positionrS   start_positionend_positionmatched_textleading_texttrailing_textr   r   r   rK     s   


rK   rO   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   )rO   r   r   r   	urlencode  s
   r   r   )r-   r   r   r   r   r   )r   r   r   r   )r   rz   r   r   r   r   )r   r   r@   r   rA   r   r   r   )r   r   r   r   )r   r   r   r   )r   )r   r   r?   r   r   r   )rO   r   r   r   )__doc__
__future__r   rq   r   typingrv   _exceptionsr   rC   r   rW   compiler   formatrR   rU   rP   rp   rt   
NamedTupler   r!   rX   rY   rZ   r[   r   r   rK   r   r   r   r   r   <module>   sh    


7 

/


!