o
    í6WjrH  ã                
   @  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dFdGd*d+„ZdHd-d.„ZdId3d4„Z dJd:d;„Z!dKd<d=„Z"dLd?d@„Z#dMdBdC„Z$dMdDdE„Z%dS )Naï  
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  ó   g | ]
}|d vrt |ƒ‘qS ))é    é"   é<   é>   é`   ©Úchr©Ú.0Úi© r   ú^/home/esfera/Documents/content_generation/venv/lib/python3.10/site-packages/httpx/_urlparse.pyÚ
<listcomp>,   ó    r   r   é   c                 C  r   ))r   r   é#   r	   r
   r   r   r   r   r   r   2   r   c                 C  r   ))	r   r   r   r	   r
   é?   r   é{   é}   r   r   r   r   r   r   8   s
    þc                 C  r   ©)r   r   r   r	   r
   r   r   r   r   é/   é:   é;   é=   é@   é[   é\   é]   é^   é|   r   r   r   r   r   r   C   ó    ÿþc                 C  r   r   r   r   r   r   r   r   M   r%   c                 C  r   ))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   r%   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 )Nr   ú@ú:ú[ú])Újoinr,   r-   r.   ©Úselfr   r   r   r(   §   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   r5   r6   r7   )r8   r-   r.   r9   r   r   r   Únetloc±   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   r5   ú//ú?ú#)r(   r8   r'   r)   r*   r+   )r:   r(   r   r   r   Ú__str__È   s   ûÿûÿzParseResult.__str__N)r3   r0   )r<   r2   r3   r/   )	Ú__name__Ú
__module__Ú__qualname__Ú__annotations__Úpropertyr(   r;   rA   rE   r   r   r   r   r/   ž   s   
 	
r/   Úurlr0   r<   r2   r3   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 r‡t| 	dd
¡pjd
td�}t| 	dd
¡pvd
td�}	|	rƒ|› d|	› �n||d< d|v r¤| 	d¡p‘d
}
|
 
d¡\|d< }|d< |s¤d |d< d|v rÅ| d¡p®d
}d|v rÅ| d¡r½| d¡sÅd|› d�|d< | ¡ D ]O\}}|d u�rt |ƒtkràtd|› d�ƒ‚tdd„ |D ƒƒ�rtdd„ |D ƒƒ}| |¡}d|› d|›d|› d�}t|ƒ‚t|  |¡�std|› d�ƒ‚qÉt | ¡}|d u�s%J ‚| ¡ }| d|d ¡�p3d
}| d |d  ¡�p>d
}| d|d ¡�pId
}| d|d ¡}| d!|d! ¡}t |¡}|d u�sfJ ‚| ¡ }| d|d ¡�ptd
}| d|d ¡�pd
}| d|d ¡}| ¡ }t|td�}t|ƒ}t||ƒ}|d
k}|d
k�p¬|d
k�p¬|d u}t|||d"� |�sº|�r¾t|ƒ}t|td�}|d u �rËd nt|td�} |d u �rØd nt|t d�}!t!|||||| |!ƒS )#NzURL too longc                 s  ó"   � | ]}|  ¡ o| ¡  V  qd S ©N©ÚisasciiÚisprintable©r   Úcharr   r   r   Ú	<genexpr>ß   ó   €  zurlparse.<locals>.<genexpr>c                 s  ó$   � | ]}|  ¡ r| ¡ s|V  qd S rM   rN   rQ   r   r   r   rS   à   s   €" z.Invalid non-printable ASCII character in URL, z at position Ú.r.   r;   r   r5   r-   ÚusernameÚpassword©Úsafer,   Úraw_pathrC   r)   r*   r6   r7   zURL component 'z
' too longc                 s  rL   rM   rN   rQ   r   r   r   rS     rT   c                 s  rU   rM   rN   rQ   r   r   r   rS     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Úintr0   Ú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/   )"rK   r<   rR   ÚidxÚerrorr.   r;   Ú_rW   rX   r[   Ú	seperatorr-   ÚkeyÚvalueÚ	url_matchÚurl_dictr'   r(   r)   r*   ÚfragÚauthority_matchÚauthority_dictr,   Úparsed_schemeÚparsed_userinfoÚparsed_hostÚparsed_portr]   r^   Úparsed_pathÚparsed_queryÚparsed_fragr   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"`{}%|\rY   ÚasciizInvalid IDNA hostname: )ÚIPv4_STYLE_HOSTNAMErr   Ú	ipaddressÚIPv4AddressÚAddressValueErrorr   ÚIPv6_STYLE_HOSTNAMEÚIPv6AddressrO   rh   ru   Ú
SUB_DELIMSÚidnaÚencodeÚdecodeÚ	IDNAError)r-   ÚWHATWG_SAFEr   r   r   rw   \  s0   
þÿ
	ÿÿrw   r.   ústr | int | Noner'   r1   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)re   Ú
ValueErrorr   rk   )r.   r'   Úport_as_intÚdefault_portr   r   r   rx   ‹  s   
ÿÿrx   r)   r]   Úboolr^   Ú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 '/'rB   z3Relative URLs cannot have a path starting with '//'r5   z2Relative URLs cannot have a path starting with ':'N)rl   r   )r)   r]   r^   r   r   r   ry   ¦  s   

÷ry   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"
    rV   r«   z..r   )Úsplitrf   Úappendr8   )r)   Ú
componentsÚoutputÚ	componentr   r   r   rz   ¿  s   	
€
rz   Ústringc                 C  s   d  dd„ |  d¡D ƒ¡S )Nr   c                 S  s   g | ]}d |d›�‘qS )ú%Ú02Xr   )r   Úbyter   r   r   r   ß  s    zPERCENT.<locals>.<listcomp>zutf-8)r8   rš   )r±   r   r   r   ÚPERCENTÞ  s   rµ   rZ   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µ   rQ   ©ÚNON_ESCAPED_CHARSr   r   r   í  s     z#percent_encoded.<locals>.<listcomp>)ÚUNRESERVED_CHARACTERSÚrstripr8   )r±   rZ   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   rY   Nr   )
ÚreÚfinditerÚPERCENT_ENCODED_REGEXÚstartÚendÚgroupr­   rº   r_   r8   )
r±   rZ   ÚpartsÚcurrent_positionrr   Ústart_positionÚend_positionÚmatched_textÚleading_textÚtrailing_textr   r   r   rh   ñ  s   


rh   r=   )rK   r0   r<   r2   r3   r/   )r-   r0   r3   r0   )r.   rž   r'   r0   r3   r1   )r)   r0   r]   r©   r^   r©   r3   rª   )r)   r0   r3   r0   )r±   r0   r3   r0   )r±   r0   rZ   r0   r3   r0   )&Ú__doc__Ú
__future__r   r“   r»   Útypingr™   Ú_exceptionsr   r`   r¸   r˜   Úcompiler½   r8   Úranger}   r|   r{   ri   rj   rv   Úformatrq   rt   ro   r’   r–   Ú
NamedTupler/   r?   rw   rx   ry   rz   rµ   rº   rh   r   r   r   r   Ú<module>   sš    ÿ
ÿÿþÿþÿ
þÿþÿõÿúÿø

7 

/



