xL irH NdZddlmZddlZddlZddlZddlZddlmZdZ dZ dZ ejd Z d jed d Dcgc]}|d vse|c}Zd jed d Dcgc]}|dvse|c}Zd jed d Dcgc]}|dvre|c}Zd jed d Dcgc]}|dvre|c}Zd jed d Dcgc]}|dvre|c}Zd jed d Dcgc]}|dvre|c}Zejdj/dddddZejdj/dddZejdejdejdejdejdejdejdejddZejdZejd ZGd!d"ej:Zd+d,d#Zd-d$Z d.d%Z!d/d&Z"d0d'Z#d1d(Z$d2d)Z%d2d*Z&ycc}wcc}wcc}wcc}wcc}wcc}w)3a 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) InvalidURLizBABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~z !$&'()*+,;=z%[A-Fa-f0-9]{2} )r"<>`)rr #r r ) rr r r r ?r {})rr r r r rr rr/:;=@[\]^|)rr r r r rr rrrrrrrrrrrz(?:(?P{scheme}):)?(?://(?P{authority}))?(?P{path})(?:\?(?P{query}))?(?:#(?P{fragment}))?z([a-zA-Z][a-zA-Z0-9+.-]*)?z[^/?#]*z[^?#]*z[^#]*z.*scheme authoritypathqueryfragmentzA(?:(?P{userinfo})@)?(?P{host}):?(?P{port})?z(\[.*\]|[^:@]*))userinfohostportz[^@]*z(\[.*\]|[^:]*))rrrrr r!r"r#z ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$z^\[.*\]$ceZdZUded<ded<ded<ded<ded<ded <ded <edd Zedd Zdd ZddZy) ParseResultstrrr!r" int | Noner#r str | Nonerr cdj|jr|jdndd|jvrd|jdn |j|jd|jgSdgS)Nr@:[])joinr!r"r#selfs U/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/httpx/_urlparse.pyrzParseResult.authorityszww'+}}4==/#"$'499$4!DII;a $))#'99#8!DII;   ?A   cdjd|jvrd|jdn |j|jd|jgSdgS)Nrr+r,r-)r.r"r#r/s r1netloczParseResult.netlocsdww$'499$4!DII;a $))#'99#8!DII;   ?A   r2c |s|S|j|j|j|j|jd}|j |t di|S)Nrr)rrrrr updateurlparse)r0kwargsdefaultss r1 copy_withzParseResult.copy_withsRKkkIIZZ   'h''r2c|j}dj|jr|jdnd|rd|nd|j|jd|jnd|j d|j gSdgS)Nrr+//?#)rr.rrrr )r0rs r1__str__zParseResult.__str__sNN ww%)[[4;;-q!b$-"YK 2 $(JJ$:!DJJ< '+}}'@!DMM?#    GI    r2N)returnr&)r9r(rAr%) __name__ __module__ __qualname____annotations__propertyrr4r;r@r2r1r%r%sX KM I  I       (  r2r%c 8t|tkDr tdtd|Dr7t d|D}|j |}d|d|d}t|d|vr%|d}t |tr t|n||d<d|vr0|jdxsd }|jd \|d <}|d<d |vsd |vrXt|jd d xsd t}t|jd d xsd t} | r|d | n||d<d|vr7|jdxsd } | jd\|d<} |d<| sd|d<d |vrD|jd xsd } d | vr+| jdr| j!ds d| d|d <|j#D]\} }| t|tkDrtd| dtd|Dr:t d|D}|j |}d| d|d|d}t|t$| j'|rtd| dt(j+|}|J|j-}|jd|dxsd }|jd|dxsd }|jd|dxsd }|jd|d}|jd |d }t.j+|}|J|j-}|jd|dxsd }|jd |d xsd } |jd|d}|j1}t|t2}t5| }t7||}|d k7}|d k7xs |d k7xs|du}t9|||!|s|r t;|}t|t<}|dnt|t>} |dnt|t@}!tC|||||| |!S)"Nz URL too longc3bK|]'}|jxr|j )ywNisascii isprintable.0chars r1 zurlparse..s* E4<<> 4$"2"2"44 4 E-/c3dK|](}|js|jr%|*ywrJrKrNs r1rQzurlparse..s#VTDLLN4CSCSCUDV 000z.Invalid non-printable ASCII character in URL, z at position .r#r4rr+r"usernamepasswordsafer!raw_pathr>rrr,r-zURL component 'z ' too longc3bK|]'}|jxr|j )ywrJrKrNs r1rQzurlparse..s*O4<<><$*:*:*<&<<OrRc3dK|](}|js|jr%|*ywrJrKrNs r1rQzurlparse..s(!dllnTEUEUEWDrTz-Invalid non-printable ASCII character in URL z component, zInvalid URL component ''rrr ) has_scheme has_authority)"lenMAX_URL_LENGTHranynextfind isinstanceintr&pop partitionquote USERNAME_SAFE PASSWORD_SAFEget startswithendswithitemsCOMPONENT_REGEX fullmatch URL_REGEXmatch groupdictAUTHORITY_REGEXlower USERINFO_SAFE encode_hostnormalize_port validate_pathnormalize_path PATH_SAFE QUERY_SAFE FRAG_SAFEr%)"urlr9rPidxerrorr#r4_rVrWrZ seperatorr"keyvalue url_matchurl_dictrrrrfragauthority_matchauthority_dictr! parsed_schemeparsed_userinfo parsed_host parsed_portr^r_ parsed_path parsed_query parsed_frags" r1r8r8s  3x. (( E EEVSVVhhtnVzV3J39r NJ39r N9Az8*5xzV::j)/R5=5G5G5L2v 6'?"F7Ozz&!'R $; 4s9K a[F6N llnC U  5zN* ?3%z!BCCOOO%*jj&CC5 hmC53!''#3'11%8 #:3%q!ABB)C.$I   ""$HZZ(8"4 5 ;F ;(=>D"I ::fhv. / 52D JJw 1 2E ::j(:"6 7D&++I6O  && &$..0Nzz*nZ&@AGRH ::fnV4 5 ;D ::fnV4 5D  M  >O"4(K,T6:K"$J2M!2Mk6M$:]K]d#T 2K',}t%J:WL&*ldd8SK  r2ct|sytj|r tj||St j|r tj|dd|ddS|jr$d}t|jt|zS tj|jjdS#tj$rt d|wxYw#tj$rt d|wxYw#tj$rt d |wxYw) NrzInvalid IPv4 address: rzInvalid IPv6 address: z"`{}%|\rXasciizInvalid IDNA hostname: )IPv4_STYLE_HOSTNAMErs ipaddress IPv4AddressAddressValueErrorrIPv6_STYLE_HOSTNAME IPv6AddressrLrirv SUB_DELIMSidnaencodedecode IDNAError)r" WHATWG_SAFEs r1rxrx\s2   " "4 (  @  ! !$ '  " "4 ( @  ! !$q* -Abz  ! TZZ\ [(@AA={{4::<(//88=** @5dX>? ? @** @5dX>? ? @ >>=24(;<<=s#C C01D "C-0"D"D7c||dk(ry t|}ddddddj|}||k(ry|S#t$rtd|wxYw)NrzInvalid port: Pi)ftphttphttpswswss)rf ValueErrorrrl)r#r port_as_int default_ports r1ryrysv |trz4$i rCr#NRRLl"  4>$2334s 4A c|r|r|jds td|s<|s9|jdr td|jdr tdyyy)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)rmr)rr^r_s r1rzrzsh ,VW W m ??4 RS S ??3 QR R ,:r2cd|vr|S|jd}d|vrd|vr|Sg}|D]9}|dk(r |dk(r|s|dgk7s|j)|j|;dj|S)z Drop "." and ".." segments from a URL path. For example: normalize_path("/path/./to/somewhere/..") == "/path/to" rUrz..r)splitrgappendr.)r componentsoutput components r1r{r{s $ CJ *Z!7 F%    $ &RD. MM) $% 88F r2cpdj|jdDcgc]}d|d c}Scc}w)Nrzutf-8%02X)r.r)stringbytes r1PERCENTrs0 77v}}W/EFtaSzNF GGFs 3ct|z}|j|s|Sdj|Dcgc]}||vr|n t|c}Scc}w)z1 Use percent-encoding to quote a string. r)UNRESERVED_CHARACTERSrstripr.r)rrYNON_ESCAPED_CHARSrPs r1percent_encodedrsV.4 ==* + 77JPQ$** =Q QsA cg}d}tjt|D]l}|j|j }}|j d}||k7r!|||}|j t|||j ||}n|t|k7r!||d} |j t| |dj|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 rrXNr) refinditerPERCENT_ENCODED_REGEXstartendgrouprrr`r.) rrYpartscurrent_positionrsstart_position end_position matched_text leading_text trailing_texts r1riris E2F; (',{{}eiik {{1~ - -!"2>BL LLDA B  \"' (3v;&/01  _]>? 775>r2r6)rr&r9r(rAr%)r"r&rAr&)r#zstr | int | Nonerr&rAr')rr&r^boolr_rrANone)rr&rAr&)rr&rAr&)rr&rYr&rAr&)'__doc__ __future__rrrtypingr _exceptionsrrarrcompilerr.rangechrr~r}r|rjrkrwformatrrrurprr NamedTupler%r8rxryrzr{rrri)is0r1rs$# #I " #45 GG4&R!3Q*QSVR  WW4&R!3Q*QSVR GGtT" M M A  tT" G G A  tT" G G A  tT" A A A  " BJJ *  f+     &"**T f     bjj56I& BJJx RZZ  4  7# BJJ) * BJJt  !bjj!DE bjj-4 &##4 nDN,=^6S2>H KS S s0 J  J > J J/JJJ?J"