a
    _grH                  
   @  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d
dd eddD Zd
dd eddD Zd
dd eddD Zd
dd eddD Zd
dd eddD Zd
dd edd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dBd%d&d$d'd(d)Zd%d%d*d+d,Zd-d%d.d/d0d1Z d%d2d2d3d4d5d6Z!d%d%d7d8d9Z"d%d%d:d;d<Z#d%d%d%d=d>d?Z$d%d%d%d=d@dAZ%dS )Ca  
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} c                 C  s   g | ]}|d vrt |qS ))    "   <   >   `   chr.0i r   ]/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/httpx/_urlparse.py
<listcomp>,       r   r      c                 C  s   g | ]}|d vrt |qS ))r   r   #   r   r	   r   r   r   r   r   r   2   r   c                 C  s   g | ]}|d vrt |qS ))	r   r   r   r   r	   ?   r
   {   }   r   r   r   r   r   r   8   s   c                 C  s   g | ]}|d vrt |qS )r   r   r   r   r	   r   r
   r   r   /   :   ;   =   @   [   \   ]   ^   |   r   r   r   r   r   r   C   s
   c                 C  s   g | ]}|d vrt |qS r   r   r   r   r   r   r   M   s
   c                 C  s   g | ]}|d vrt |qS ))r   r   r   r   r	   r   r
   r   r   r   r   r   r   r   r    r!   r"   r#   r   r   r   r   r   r   Z   s
   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                   @  s   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dZeddddZdd dddZddddZdS )ParseResultstrr%   r*   r+   
int | Noner,   r'   
str | Noner(   r)   )returnc                 C  sR   d | jr| j dndd| jv r0d| j dn| j| jd urJd| j ndgS )Nr   @:[])joinr*   r+   r,   selfr   r   r   r&      s    zParseResult.authorityc                 C  s>   d d| jv rd| j dn| j| jd ur6d| j ndgS )Nr   r3   r4   r5   )r6   r+   r,   r7   r   r   r   netloc   s
    zParseResult.netloc)kwargsr1   c                 K  s:   |s| S | j | j| j| j| jd}|| tdi |S )Nr$   r   )r   )r%   r&   r'   r(   r)   updateurlparse)r8   r:   defaultsr   r   r   	copy_with   s    
zParseResult.copy_withc                 C  sh   | j }d| jr| j dnd|r,d| nd| j| jd urHd| j nd| jd ur`d| j ndgS )Nr   r3   //?#)r&   r6   r%   r'   r(   r)   )r8   r&   r   r   r   __str__   s    zParseResult.__str__N)	__name__
__module____qualname____annotations__propertyr&   r9   r>   rB   r   r   r   r   r-      s   
	r-   r.   r0   )urlr:   r1   c           "      K  s  t | tkrtdtdd | D r\tdd | D }| |}d|d| d}t|d|v r|d }t|tr~t|n||d< d	|v r|	d	pd
}|
d\|d< }|d< d|v sd|v rt|	dd
pd
td}t|	dd
pd
td}	|	r
| d|	 n||d< d|v rR|	dp*d
}
|

d\|d< }|d< |sRd |d< d|v r|dpjd
}d|v r|dr|dsd| d|d< | D ]\}}|d urt |tkrtd| dtdd |D r&tdd |D }||}d| d|d| d}t|t| |std| dqt| }|d usbJ | }|d|d p~d
}|d |d  pd
}|d|d pd
}|d|d }|d!|d! }t|}|d usJ | }|d|d p d
}|d|d pd
}|d|d }| }t|td}t|}t||}|d
k}|d
kpp|d
kpp|d u}t|||d" |s|rt|}t|td}|d u rd n
t|td} |d u rd n
t|t d}!t!|||||| |!S )#NzURL too longc                 s  s    | ]}|  o|  V  qd S Nisasciiisprintabler   charr   r   r   	<genexpr>   r   zurlparse.<locals>.<genexpr>c                 s  s"   | ]}|  r| s|V  qd S rI   rJ   rM   r   r   r   rO      r   z.Invalid non-printable ASCII character in URL, z at position .r,   r9   r   r3   r+   usernamepasswordsafer*   raw_pathr@   r'   r(   r4   r5   zURL component 'z
' too longc                 s  s    | ]}|  o|  V  qd S rI   rJ   rM   r   r   r   rO     r   c                 s  s"   | ]}|  r| s|V  qd S rI   rJ   rM   r   r   r   rO     s   z-Invalid non-printable ASCII character in URL z component, zInvalid URL component ''r%   r&   r)   )
has_schemehas_authority)"lenMAX_URL_LENGTHr   anynextfind
isinstanceintr.   pop	partitionquoteUSERNAME_SAFEPASSWORD_SAFEget
startswithendswithitemsCOMPONENT_REGEX	fullmatch	URL_REGEXmatch	groupdictAUTHORITY_REGEXlowerUSERINFO_SAFEencode_hostnormalize_portvalidate_pathnormalize_path	PATH_SAFE
QUERY_SAFE	FRAG_SAFEr-   )"rH   r:   rN   idxerrorr,   r9   _rQ   rR   rU   Z	seperatorr+   keyvalueZ	url_matchZurl_dictr%   r&   r'   r(   fragZauthority_matchZauthority_dictr*   Zparsed_schemeZparsed_userinfoZparsed_hostZparsed_portrW   rX   Zparsed_pathZparsed_queryZparsed_fragr   r   r   r<      s    


"




r<   )r+   r1   c                 C  s   | sdS t | rHzt|  W n" tjyB   td| Y n0 | S t| rzt| dd  W n" tjy   td| Y n0 | dd S |  rd}t	| 
 t| dS zt| 
 dW S  tjy   td	| Y n0 d S )
Nr   zInvalid IPv4 address: r   zInvalid IPv6 address: z"`{}%|\rS   asciizInvalid IDNA hostname: )IPv4_STYLE_HOSTNAMErl   	ipaddressIPv4AddressAddressValueErrorr   IPv6_STYLE_HOSTNAMEIPv6AddressrK   rb   ro   
SUB_DELIMSidnaencodedecode	IDNAError)r+   ZWHATWG_SAFEr   r   r   rq   \  s*    

	rq   zstr | int | Noner/   )r,   r%   r1   c                 C  sh   | d u s| dkrd S zt | }W n  ty@   td| Y n0 dddddd|}||krdd S |S )Nr   zInvalid port:    P   i  )ftphttphttpswswss)r_   
ValueErrorr   re   )r,   r%   Zport_as_intdefault_portr   r   r   rr     s    
rr   boolNone)r'   rW   rX   r1   c                 C  sJ   |r| r|  dstd|sF|sF|  dr4td|  drFtd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 '//'r3   z2Relative URLs cannot have a path starting with ':'N)rf   r   )r'   rW   rX   r   r   r   rs     s    

rs   )r'   r1   c                 C  sv   d| vr| S |  d}d|vr*d|vr*| S g }|D ]8}|dkr@q2|dkr`|rj|dgkrj|  q2|| q2d|S )z
    Drop "." and ".." segments from a URL path.

    For example:

        normalize_path("/path/./to/somewhere/..") == "/path/to"
    rP   r   z..r   )splitr`   appendr6   )r'   
componentsoutput	componentr   r   r   rt     s    	

rt   )stringr1   c                 C  s   d dd | dD S )Nr   c                 S  s   g | ]}d |dqS )%Z02Xr   )r   byter   r   r   r     r   zPERCENT.<locals>.<listcomp>zutf-8)r6   r   )r   r   r   r   PERCENT  s    r   )r   rT   r1   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   rM   ZNON_ESCAPED_CHARSr   r   r     r   z#percent_encoded.<locals>.<listcomp>)UNRESERVED_CHARACTERSrstripr6   )r   rT   r   r   r   percent_encoded  s    
r   c           
      C  s   g }d}t t| D ]T}| |  }}|d}||krZ| || }|t||d || |}q|t| kr| |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   rS   Nr   )
refinditerPERCENT_ENCODED_REGEXstartendgroupr   r   rY   r6   )
r   rT   partscurrent_positionrl   Zstart_positionZend_positionZmatched_textZleading_textZtrailing_textr   r   r   rb     s    

rb   )r   )&__doc__
__future__r   r   r   typingr   _exceptionsr   rZ   r   r   compiler   r6   rangerw   rv   ru   rc   rd   rp   formatrk   rn   ri   r   r   
NamedTupler-   r<   rq   rr   rs   rt   r   r   rb   r   r   r   r   <module>   s   



7 /