o
    Þ­jþE  ã                
   @  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   úL/var/www/html/CropPilot/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 rƒt| 	dd
¡pjd
ƒ}t| 	dd
¡ptd
ƒ}	|	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 ¡�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¸|�r¼t|ƒ}d#}t|t| d$ d!�} |d u �rÏd n	t|t| d% d!�}!|d u �ràd 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 

/


!