Ë
    RPf8E  ã            
      óä  — 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j                  d	«      Z ej                  d
j                  ddddd¬«      «      Z ej                  dj                  ddd¬«      «      Z ej                  d«       ej                  d«       ej                  d«       ej                  d«       ej                  d«       ej                  d«       ej                  d«       ej                  d«      dœZ ej                  d«      Z ej                  d«      Z G d„ dej(                  «      Zd%d&d„Zd'd„Zd(d„Zd)d„Zd*d„Zd+d „Zd,d-d!„Zd,d.d"„Zd,d.d#„Zd/d$„Zy)0aï  
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                  óˆ   — 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„«       Zedd„«       Zdd„Zdd„Zy)ÚParseResultÚstrr   r   r   ú
int | Noner   r	   ú
str | Noner
   r   c                óð   — dj                  | j                  r| j                  › d�ndd| j                  v rd| j                  › d�n| j                  | j                  �d| j                  › �g«      S dg«      S )NÚ ú@ú:ú[ú])Újoinr   r   r   ©Úselfs    úI/var/www/fastapitest/venv/lib/python3.12/site-packages/httpx/_urlparse.pyr   zParseResult.authorityi   sz   € à�w‰wà'+§}¢}�4—=‘=�/ Ñ#¸"Ø$'¨4¯9©9Ñ$4�!�D—I‘I�;˜aÑ ¸$¿)¹)Ø#'§9¡9Ð#8�!�D—I‘I�;�ðó
ð 	
ð ?Aðó
ð 	
ó    c                ó¸   — dj                  d| j                  v rd| j                  › d�n| j                  | j                  �d| j                  › �g«      S dg«      S )Nr   r   r   r   )r   r   r   r   s    r   ÚnetloczParseResult.netlocs   sd   € à�w‰wà$'¨4¯9©9Ñ$4�!�D—I‘I�;˜aÑ ¸$¿)¹)Ø#'§9¡9Ð#8�!�D—I‘I�;�ðó
ð 	
ð ?Aðó
ð 	
r   c                ó¶   — |s| S | j                   | j                  | j                  | j                  | j                  dœ}|j                  |«       t        di |¤ŽS )Nr   ©r   )r   r   r	   r
   r   ÚupdateÚurlparse)r   ÚkwargsÚdefaultss      r   Ú	copy_withzParseResult.copy_with|   sR   € ÙØˆKð —k‘kØŸ™Ø—I‘IØ—Z‘ZØŸ™ñ
ˆð 	�‰˜ÔÜÑ'˜hÑ'Ð'r   c                ó  — | j                   }dj                  | j                  r| j                  › d�nd|rd|› �nd| j                  | j                  �d| j                  › �nd| j
                  �d| j
                  › �g«      S dg«      S )Nr   r   ú//ú?ú#)r   r   r   r	   r
   r   )r   r   s     r   Ú__str__zParseResult.__str__Š   s’   € Ø—N‘Nˆ	Ø�w‰wà%)§[¢[�4—;‘;�-˜qÑ!°bÙ$-�"�Y�KÑ °2Ø—	‘	Ø$(§J¡JÐ$:�!�D—J‘J�<Ñ ÀØ'+§}¡}Ð'@�!�D—M‘M�?Ð#ðó
ð 	
ð GIðó
ð 	
r   N)Úreturnr   )r%   r   r-   r   )	Ú__name__Ú
__module__Ú__qualname__Ú__annotations__Úpropertyr   r    r'   r,   © r   r   r   r   `   sX   … ØƒKØƒMØ
ƒIØ
ÓØ
ƒIØÓØÓàò
ó ð
ð ò
ó ð
ó(ô

r   r   c           	     ó†  — t        | «      t        kD  rt        d«      ‚t        d„ | D «       «      rt        d«      ‚d|v r%|d   }t	        |t
        «      rt        |«      n||d<   d|v r0|j                  d«      xs d}|j                  d«      \  |d<   }|d<   d	|v sd
|v rLt        |j                  d	d«      xs d«      }t        |j                  d
d«      xs d«      }|r|› d|› �n||d<   d|v r7|j                  d«      xs d}|j                  d«      \  |d<   }|d<   |sd |d<   d|v rD|j                  d«      xs d}	d|	v r+|	j                  d«      r|	j                  d«      s	d|	› d�|d<   |j                  «       D ]q  \  }
}|€Œ	t        |«      t        kD  rt        d|
› d�«      ‚t        d„ |D «       «      rt        d|
› d�«      ‚t        |
   j                  |«      rŒdt        d|
› d�«      ‚ t         j#                  | «      }|€J ‚|j%                  «       }|j                  d|d   «      xs d}|j                  d|d   «      xs d}|j                  d|d   «      xs d}|j                  d|d   «      }|j                  d|d   «      }t&        j#                  |«      }|€J ‚|j%                  «       }|j                  d|d   «      xs d}|j                  d|d   «      xs d}	|j                  d|d   «      }|j)                  «       }t        |t*        dz   ¬«      }t-        |	«      }t/        ||«      }|dk7  }|dk7  xs |dk7  xs |d u}t1        |||¬«       |rt3        |«      }t        |t*        dz   ¬«      }|€d nt        |t*        dz   ¬«      }|€d nt        |t*        dz   ¬«      }t5        |||||||«      S ) NzURL too longc              3  ób   K  — | ]'  }|j                  «       xr |j                  «        –— Œ) y ­w©N©ÚisasciiÚisprintable©Ú.0Úchars     r   ú	<genexpr>zurlparse.<locals>.<genexpr>¡   s*   è ø€ Ò
E¸ˆ4�<‰<‹>Ò4 $×"2Ñ"2Ó"4Ð4Ó4Ñ
Eùó   ‚-/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              3  ób   K  — | ]'  }|j                  «       xr |j                  «        –— Œ) y ­wr6   r7   r:   s     r   r=   zurlparse.<locals>.<genexpr>Î   s*   è ø€ ÒOÀ�4—<‘<“>Ò<¨$×*:Ñ*:Ó*<Ð&<Ó<ÑOùr>   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   )Úurlr%   r   r    Ú_r?   r@   rA   Ú	seperatorr   ÚkeyÚvalueÚ	url_matchÚurl_dictr   r   r	   r
   r   Úauthority_matchÚauthority_dictr   Úparsed_schemeÚparsed_userinfoÚparsed_hostÚparsed_portrF   rG   Úparsed_pathÚparsed_queryÚparsed_fragments                                  r   r$   r$   —   s+  € ô
 ˆ3ƒx”.Ò Ü˜Ó(Ð(ô Ñ
EÀÔ
EÔEÜÐGÓHÐHð �ÑØ�f‰~ˆÜ&0°´sÔ&;œ˜TœÀˆˆv‰ð �6ÑØ—‘˜HÓ%Ò+¨ˆØ,2×,<Ñ,<¸SÓ,AÑ)ˆˆv‰˜˜6 &™>ð �VÑ˜z¨VÑ3Ü˜Ÿ™ J°Ó3Ò9°rÓ:ˆÜ˜Ÿ™ J°Ó3Ò9°rÓ:ˆÙ9A ˜z¨¨8¨*Ñ5ÀxˆˆzÑð �VÑØ—:‘:˜jÓ)Ò/¨RˆØ5=×5GÑ5GÈÓ5LÑ2ˆˆv‰˜	 6¨'¡?ÙØ"ˆF�7‰Oð �ÑØ�z‰z˜&Ó!Ò' RˆØ�$‰; §¡°Ô 4¸¿¹ÀsÔ9KØ    a˜[ˆF�6‰Nð
 —l‘l“nò C‰
ˆˆUØÑÜ�5‹zœNÒ*Ü  ?°3°%°zÐ!BÓCÐCô ÑOÈÔOÔOÜ ØNÈsÈeÐSTÐUóð ô
 # 3Ñ'×1Ñ1°%Õ8Ü Ð#:¸3¸%¸qÐ!AÓBÐBðCô" —‘ Ó$€IØÐ Ð Ð Ø×"Ñ"Ó$€Hð �Z‰Z˜ (¨8Ñ"4Ó5Ò;¸€FØ—
‘
˜;¨°Ñ(=Ó>ÒDÀ"€IØ�:‰:�f˜h vÑ.Ó/Ò5°2€DØ�J‰J�w ¨Ñ 1Ó2€EØ�z‰z˜* h¨zÑ&:Ó;€Hô &×+Ñ+¨IÓ6€OØÐ&Ð&Ð&Ø$×.Ñ.Ó0€Nð �z‰z˜* n°ZÑ&@ÓAÒGÀR€HØ�:‰:�f˜n¨VÑ4Ó5Ò;¸€DØ�:‰:�f˜n¨VÑ4Ó5€Dð
  Ÿ™›€MÜ  ´
¸SÑ0@ÔA€OÜ" 4Ó(€KÜ,¨T°6Ó:€Kà "Ñ$€Jà˜2ÑÒM °Ñ!2ÒM°kÈÐ6Mð ô �$ :¸]ÕKÙÜ˜dÓ#ˆô ˜T¬
°WÑ(<Ô=€Kð �‰¤5¨´ZÀ(Ñ5JÔ#Kð ð
 Ð ‰¤e¨H¼:È	Ñ;QÔ&Rð ô ØØØØØØØóð r   c                ój  — | syt         j                  | «      r	 t        j                  | «       | S t        j                  | «      r	 t        j                  | dd «       | dd S | j                  «       rt        | j                  «       t        ¬«      S 	 t        j                  | j                  «       «      j                  d«      S # t        j                  $ r t        d| ›�«      ‚w xY w# t        j                  $ r t        d| ›�«      ‚w xY w# t        j                  $ r t        d| ›�«      ‚w xY w)	Nr   zInvalid IPv4 address: r   éÿÿÿÿzInvalid IPv6 address: rD   ÚasciizInvalid IDNA hostname: )ÚIPv4_STYLE_HOSTNAMErW   Ú	ipaddressÚIPv4AddressÚAddressValueErrorr   ÚIPv6_STYLE_HOSTNAMEÚIPv6Addressr8   rO   rZ   r[   ÚidnaÚencodeÚdecodeÚ	IDNAError)r   s    r   r\   r\     s(  € ÙØä	×	"Ñ	" 4Ô	(ð	@Ü×!Ñ! $Ô'ð ˆä	×	"Ñ	" 4Ô	(ð	@Ü×!Ñ! $ q¨ *Ô-ð �A�bˆzÐà	�‰Œô �T—Z‘Z“\¬
Ô3Ð3ð=Ü�{‰{˜4Ÿ:™:›<Ó(×/Ñ/°Ó8Ð8øô; ×*Ñ*ò 	@ÜÐ5°d°XÐ>Ó?Ð?ð	@ûô ×*Ñ*ò 	@ÜÐ5°d°XÐ>Ó?Ð?ð	@ûô �>‰>ò =ÜÐ2°4°(Ð;Ó<Ð<ð=ús#   šC ÁC+ Â1D Ã"C(Ã+"DÄ"D2c                óž   — | �| dk(  ry 	 t        | «      }ddddddœj                  |«      }||k(  ry |S # t        $ r t        d| ›�«      ‚w xY w)Nr   zInvalid port: é   éP   i»  )ÚftpÚhttpÚhttpsÚwsÚwss)rL   Ú
ValueErrorr   rP   )r   r   Úport_as_intÚdefault_ports       r   r]   r]   L  sv   € ð €|�t˜r’zØð4Ü˜$“iˆð
  r°C¸rÈ#ÑN×RÑRØó€Lð �lÒ"ØØÐøô ò 4Ü˜>¨$¨Ð2Ó3Ð3ð4ús	   Š4 ´Ac                ó¾   — |r | r| j                  d«      st        d«      ‚yy| j                  d«      rt        d«      ‚| j                  d«      r|st        d«      ‚yy)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)rQ   r   )r	   rF   rG   s      r   r^   r^   g  sp   € ñ ñ ˜Ÿ™¨Ô,ÜÐVÓWÐWð -ˆ4ð
 �?‰?˜4Ô ÜØXóð ð
 �?‰?˜3Ô©
ÜØTóð ð )3Ðr   c                óÆ   — | j                  d«      }g }|D ]9  }|dk(  rŒ	|dk(  r|sŒ|dgk7  sŒ|j                  «        Œ)|j                  |«       Œ; dj                  |«      S )zˆ
    Drop "." and ".." segments from a URL path.

    For example:

        normalize_path("/path/./to/somewhere/..") == "/path/to"
    r‰   ú.z..r   )ÚsplitrM   Úappendr   )r	   Ú
componentsÚoutputÚ	components       r   r_   r_   ‚  si   € ð —‘˜C“€JØ€FØò %ˆ	Ø˜ÒØØ˜$ÒÚ˜& R D›.Ø—
‘
•à�M‰M˜)Õ$ð%ð �8‰8�FÓÐr   c                óŒ   — dj                  | j                  d«      D �cg c]  }d|d›�‘Œ
 c}«      j                  «       S c c}w )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   zutf-8ú%Ú02x)r   rz   Úupper)r<   Úbytes     r   Úpercent_encoder–   ˜  s;   € ð �7‰7¨t¯{©{¸7Ó/CÖD t�a˜˜S�z’NÒDÓE×KÑKÓMÐMùÒDs   ŸAc                ó6   — t         |z   dz   }| D ]  }||vsŒ y y)z<
    Determine if a given string is already quote-safe.
    r’   FT)ÚUNRESERVED_CHARACTERS©ÚstringrE   ÚNON_ESCAPED_CHARSr<   s       r   Úis_saferœ   ¦  s6   € ô .°Ñ4°sÑ:Ðð ò ˆØÐ(Ò(Ùðð r   c                ó˜   — t        | |¬«      r| S t        |z   }dj                  | D �cg c]  }||v r|n
t        |«      ‘Œ c}«      S c c}w )z1
    Use percent-encoding to quote a string.
    rD   r   )rœ   r˜   r   r–   r™   s       r   Úpercent_encodedrž   ´  sR   € ô ˆv˜DÕ!Øˆä-°Ñ4ÐØ�7‰7ØQWÖXÈ�Ð*Ñ*‰´¸tÓ0DÑ	DÒXóð ùÚXs   ¨Ac                óœ  — g }d}t        j                  t        | «      D ]l  }|j                  «       |j	                  «       }}|j                  d«      }||k7  r!| || }|j                  t        ||¬«      «       |j                  |«       |}Œn |t        | «      k7  r!| |d }	|j                  t        |	|¬«      «       dj                  |«      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   rD   Nr   )
ÚreÚfinditerÚPERCENT_ENCODED_REGEXÚstartÚendÚgroupr�   rž   rH   r   )
rš   rE   ÚpartsÚcurrent_positionrW   Ústart_positionÚend_positionÚmatched_textÚleading_textÚtrailing_texts
             r   rO   rO   Á  sÆ   € ð €EØÐÜ—‘Ô2°FÓ;ò 
(ˆØ',§{¡{£}°e·i±i³k˜ˆØ—{‘{ 1“~ˆàÐ-Ò-Ø!Ð"2°>ÐBˆLØ�L‰Lœ¨¸DÔAÔBð 	�‰�\Ô"Ø'Ñð
(ð œ3˜v›;Ò&ØÐ/Ð0Ð1ˆØ�‰”_ ]¸Ô>Ô?à�7‰7�5‹>Ðr   c                óŽ   — dj                  | D ��cg c]#  \  }}t        |d¬«      dz   t        |d¬«      z   ‘Œ% c}}«      S c c}}w )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
    ú&r   rD   ú=)r   rž   )rS   ÚkÚvs      r   Ú	urlencoder²   â  sN   € ð �8‰8ð ÷	
á��1ô ˜A BÔ'¨#Ñ-´ÀÈÔ0KÓKó	
óð ùó	
s   ‘(A
r"   )r`   r   r%   r   r-   r   )r   r   r-   r   )r   zstr | int | Noner   r   r-   r   )r	   r   rF   ÚboolrG   r³   r-   ÚNone)r	   r   r-   r   )r<   r   r-   r   )r‰   )rš   r   rE   r   r-   r³   )rš   r   rE   r   r-   r   )rS   zlist[tuple[str, str]]r-   r   ) Ú__doc__Ú
__future__r   rt   r    Útypingry   Ú_exceptionsr   rI   r˜   r[   Úcompiler¢   ÚformatrV   rY   rT   rs   rw   Ú
NamedTupler   r$   r\   r]   r^   r_   r–   rœ   rž   rO   r²   r3   r   r   ú<module>r¼      s•  ðñõ" #ã Û 	Û ã å #à€ð Ið ð €
à"˜Ÿ
™
Ð#4Ó5Ð ð ˆB�J‰Jð	*÷
 �fØ+ØØØØð ó ó€	ð& �"—*‘*àTß�fØØ àð	 ó ó	€ð  ˆb�j‰jÐ5Ó6Ø�—‘˜IÓ&ØˆB�J‰J�xÓ ØˆR�Z‰Z˜Ó Ø�—
‘
˜4Ó Ø�—
‘
˜7Ó#ØˆB�J‰JÐ)Ó*ØˆB�J‰J�tÓñ	€ð !�b—j‘jÐ!DÓEÐ Ø �b—j‘j Ó-Ð ô4
�&×#Ñ#ô 4
ônDóN+=ó\ó6ó6ó,Nôô
ôôBr   