
    NgE              
         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
                    ddddd                    Z ej        d                    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d9d:d!Zd;d#Zd<d(Zd=d.Zd>d/Zd?d1Zd@dAd4Zd@dAd5ZdBd8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}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dS )ParseResultstrr   r   r   
int | Noner   r	   
str | Noner
   r   returnc                    d                     | j        r
| j         dndd| j        v rd| j         dn| j        | j        
d| j         ndg          S )N @:[])joinr   r   r   selfs    K/var/www/html/ai-engine/env/lib/python3.11/site-packages/httpx/_urlparse.pyr   zParseResult.authorityj   sq    ww'+}<4=####"$'49$4$4 DI    $)#'9#8DIb
 
 	
    c                    d                     d| j        v rd| j         dn| j        | j        
d| j         ndg          S )Nr   r   r   r   )r   r   r   r   s    r   netloczParseResult.netloct   sW    ww$'49$4$4 DI    $)#'9#8DIb
 
 	
r   kwargsc                    |s| S | j         | j        | j        | j        | j        d}|                    |           t          di |S )Nr   r   r   )r   r   r	   r
   r   updateurlparse)r   r"   defaultss      r   	copy_withzParseResult.copy_with}   s^     	K kIZ
 
 	''h'''r   c                    | j         }d                    | j        r
| j         dnd|rd| nd| j        | j        
d| j         nd| j        
d| j         ndg          S )Nr   r   //?#)r   r   r   r	   r
   r   )r   r   s     r   __str__zParseResult.__str__   s    N	ww%)[84;!!!!b$-5 Y   2	$(J$: DJ   '+}'@#DM###b
 
 	
r   N)r   r   )r"   r   r   r   )	__name__
__module____qualname____annotations__propertyr   r!   r(   r-    r   r   r   r   a   s         KKKMMMIIIIII
 
 
 X
 
 
 
 X
( ( ( (

 

 

 

 

 

r   r   r   urlr   r"   r   r   c           	     
   t          |           t          k    rt          d          t          d | D                       rFt	          d | D                       }|                     |          }d|d| d}t          |          d|v r1|d         }t          |t                    rt          |          n||d<   d|v r6|	                    d          pd	}|
                    d
          \  |d<   }|d<   d|v sd|v rXt          |	                    dd	          pd	          }t          |	                    dd	          pd	          }	|	r| d
|	 n||d<   d|v r=|	                    d          pd	}
|

                    d          \  |d<   }|d<   |sd |d<   d|v rN|                    d          pd	}d
|v r3|                    d          r|                    d          s	d| d|d<   |                                D ]\  }}|t          |          t          k    rt          d| d          t          d |D                       rIt	          d |D                       }|                    |          }d| d|d| d}t          |          t           |                             |          st          d| d          t$                              |           }|J |                                }|                    d|d                   pd	}|                    d|d                   pd	}|                    d|d                   pd	}|                    d|d                   }|                    d|d                   }t*                              |          }|J |                                }|                    d|d                   pd	}|                    d|d                   pd	}|                    d|d                   }|                                }t          |t.          d
z              }t1          |          }t3          ||          }|d	k    }|d	k    p	|d	k    p|d u}t5          |||!           |s|rt7          |          }d"}t          |t.          |z   d#z              } |d nt          |t.          |z   d$z              }!|d nt          |t.          |z   d%z              }"t9          ||||| |!|"          S )&NzURL too longc              3  h   K   | ]-}|                                 o|                                 V  .d S Nisasciiisprintable.0chars     r   	<genexpr>zurlparse.<locals>.<genexpr>   s>      
E
E4<<>>4$"2"2"4"44
E
E
E
E
E
Er   c              3  j   K   | ].}|                                 |                                *|V  /d S r7   r8   r;   s     r   r>   zurlparse.<locals>.<genexpr>   s@      VVTDLLNNV4CSCSCUCUVDVVVVVVr   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              3  h   K   | ]-}|                                 o|                                 V  .d S r7   r8   r;   s     r   r>   zurlparse.<locals>.<genexpr>   s>      OO4<<>><$*:*:*<*<&<OOOOOOr   c              3  j   K   | ].}|                                 |                                *|V  /d S r7   r8   r;   s     r   r>   zurlparse.<locals>.<genexpr>   sW        !dllnnEIEUEUEWEW     r   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   )#r4   r"   r=   idxerrorr   r!   _rA   rB   rC   	seperatorr   keyvalue	url_matchurl_dictr   r   r	   r
   r   authority_matchauthority_dictr   parsed_schemeparsed_userinfoparsed_hostparsed_portrI   rJ   WHATWG_SAFEparsed_pathparsed_queryparsed_fragments#                                      r   r&   r&      s   
 3xx.  ((( 
E
E
E
E
EEE  VVSVVVVVhhtnnXTXXRUXXX 	  f~&0s&;&;ETv 6H%%+,2,<,<S,A,A)v6&> VzV33J339r::J339r::9AO558555xz V::j))/R5=5G5G5L5L2v	6'? 	#"F7O zz&!!'R$;; 4 4;s9K9K;([[[F6N
 llnn C C
U5zzN** !B3!B!B!BCCC OOOOOOO 	(  %*     jj&&3C 3 33 3,/3 3 3  !''' #3'11%88 C !A3!A!A!ABBB $$I   ""$$H ZZ(8"455;F

;(=>>D"I::fhv.//52DJJw 122Ezz*hz&:;;H &++I66O&&&$..00N zz*nZ&@AAGRH::fnV455;D::fnV455D
  M 
S0@AAAO"4((K,T6::K"$J2M!2Mk6M  $:]KKKK $] $d##
 K T
[(@7(JKKKK = 	5zK7(BCCC   	8*{":Y"FGGG    r   r   c                   | sdS t                               |           r=	 t          j        |            n%# t          j        $ r t          d|           w xY w| S t                              |           rM	 t          j        | dd                    n%# t          j        $ r t          d|           w xY w| dd         S |                                 r-d}t          | 
                                t          |z             S 	 t          j        | 
                                                              d          S # t          j        $ r t          d	|           w xY w)
Nr   zInvalid IPv4 address: r   zInvalid IPv6 address: z"`{}%|\rG   asciizInvalid IDNA hostname: )IPv4_STYLE_HOSTNAMEr\   	ipaddressIPv4AddressAddressValueErrorr   IPv6_STYLE_HOSTNAMEIPv6Addressr9   rT   r_   r`   idnaencodedecode	IDNAError)r   rs   s     r   ra   ra   /  s    %Br		"	"4	(	( "B	@!$''''* 	@ 	@ 	@>d>>???	@		"	"4	(	( B	@!$qt*----* 	@ 	@ 	@>d>>???	@AbDz	 B !TZZ\\
[(@AAAA={4::<<((//888> = = =;4;;<<<=s!   5 "A7B "B68D> >"E r   str | int | Noner   r   c                    | | dk    rd S 	 t          |           }n # t          $ r t          d|           w xY wdddddd                    |          }||k    rd S |S )Nr   zInvalid port:    P   i  )ftphttphttpswswss)rQ   
ValueErrorr   rU   )r   r   port_as_intdefault_ports       r   rb   rb   ^  s     |trzzt4$ii 4 4 42$223334 rCr#NNRR L l""ts    9r	   rI   boolrJ   Nonec                    |r&| r$|                      d          st          d          |sJ|sJ|                      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)rV   r   )r	   rI   rJ   s      r   rc   rc   y  s      X  	X,, 	XVWWW 	Sm 	S ??4   	TRSSS ??3 	SQRRR	S 	S 	S 	S	S 	Sr   c                   d| vr| S |                      d          }d|vrd|vr| S g }|D ]B}|dk    r	|dk    r|r|dgk    r|                                 -|                    |           Cd                    |          S )z
    Drop "." and ".." segments from a URL path.

    For example:

        normalize_path("/path/./to/somewhere/..") == "/path/to"
    r@   r   z..r   )splitrR   appendr   )r	   
componentsoutput	components       r   rd   rd     s     $CJ *Z!7!7 F % %	$ &RD..

MM)$$$$88Fr   stringc                f    d                     d |                     d          D                       S )Nr   c                    g | ]}d |d	S )%02Xr3   )r<   bytes     r   
<listcomp>zPERCENT.<locals>.<listcomp>  s     FFFtNNNNFFFr   zutf-8)r   r   )r   s    r   PERCENTr     s/    77FFv}}W/E/EFFFGGGr   r   rH   c                    t           |z   |                               s| S d                    fd| D                       S )z1
    Use percent-encoding to quote a string.
    r   c                :    g | ]}|v r|nt          |          S r3   )r   )r<   r=   NON_ESCAPED_CHARSs     r   r   z#percent_encoded.<locals>.<listcomp>  s.    QQQ$***QQQr   )UNRESERVED_CHARACTERSrstripr   )r   rH   r   s     @r   percent_encodedr     sY     .4 ==*++ 77QQQQ&QQQ  r   c                    g }d}t          j        t          |           D ]}|                                |                                }}|                    d          }||k    r.| ||         }|                    t          ||                     |                    |           |}|t          |           k    r.| |d         }	|                    t          |	|                     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   rG   Nr   )
refinditerPERCENT_ENCODED_REGEXstartendgroupr   r   rK   r   )
r   rH   partscurrent_positionr\   start_positionend_positionmatched_textleading_texttrailing_texts
             r   rT   rT     s     E2F;; 
( 
(',{{}}eiikk{{1~~---!"2>"ABLLLDAAABBB 	\"""' 3v;;&&/001_]>>>???775>>r   rX   list[tuple[str, str]]c                @    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                `    g | ]+\  }}t          |d           dz   t          |d           z   ,S )r   rG   =)r   )r<   kvs      r   r   zurlencode.<locals>.<listcomp>  sP     	
 	
 	
1 AB'''#-0K0K0KK	
 	
 	
r   )r   )rX   s    r   	urlencoder     s6     88	
 	
	
 	
 	
  r   r$   )r4   r   r"   r   r   r   )r   r   r   r   )r   r   r   r   r   r   )r	   r   rI   r   rJ   r   r   r   )r	   r   r   r   )r   r   r   r   )r   )r   r   rH   r   r   r   )rX   r   r   r   )__doc__
__future__r   r{   r   typingr   _exceptionsr   rL   r   r`   compiler   formatr[   r^   rY   rz   r~   
NamedTupler   r&   ra   rb   rc   rd   r   r   rT   r   r3   r   r   <module>r      s   $ # " " " " "     				   # # # # # # I  
"
#455  BJ	*
 f+    	& "*Tf 	   	 	  bj566I&&BJx  RZ  
4  
7##BJ)**BJt	 	 !bj!DEE  bj-- 4
 4
 4
 4
 4
&# 4
 4
 4
nT T T T Tn,= ,= ,= ,=^   6S S S S2   >H H H H        B     r   