
     @g8E              
         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d;d<d!Zd=d#Zd>d(Zd?d.Zd@d/ZdAd1ZdBdCd5ZdBdDd6ZdBdDd7ZdEd:ZdS )Fa  
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    C/var/www/piapp/venv/lib/python3.11/site-packages/httpx/_urlparse.pyr   zParseResult.authorityi   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.netlocs   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   `   s         KKKMMMIIIIII
 
 
 X
 
 
 
 X
( ( ( (

 

 

 

 

 

r   r   r   urlr   r"   r   r   c           	     &	   t          |           t          k    rt          d          t          d | D                       rt          d          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                       rt          d|
 d          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             }t-          |	          }t/          ||          }|dk    }|dk    p	|dk    p|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  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   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  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   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   )r4   r"   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*   
 3xx.  ((( 
E
E
E
E
EEE IGHHH 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  UsUUU  
 #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## T
W(<===K 5Z(5J#K#K#K 
  eH:	;Q&R&R&R    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(t          | 
                                t                    S 	 t          j        | 
                                                              d          S # 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IPv6Addressr9   rO   rZ   r[   idnaencodedecode	IDNAError)r   s    r   r\   r\     s    $4r		"	"4	(	( !4	@!$''''* 	@ 	@ 	@>d>>???	@		"	"4	(	( 4	@!$qt*----* 	@ 	@ 	@>d>>???	@AbDz	 4 TZZ\\
3333={4::<<((//888> = = =;4;;<<<=s!   5 "A7B "B6 8D9 9"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)rL   
ValueErrorr   rP   )r   r   port_as_intdefault_ports       r   r]   r]   L  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	   rF   boolrG   Nonec                    |r*| r$|                      d          st          d          dS dS |                      d          rt          d          |                      d          r|st          d          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*   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  s        	X,, 	XVWWW	X 	X 	X 	X
 ??4   	X  
 ??3 	
 	T  	 	 	 	r   c                    |                      d          }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   .z..r   )splitrM   appendr   )r	   
componentsoutput	components       r   r_   r_     s     CJF % %	$ &RD..

MM)$$$$88Fr   r=   c                    d                     d |                     d          D                                                       S )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   c                    g | ]}d |d	S )%02xr3   )r<   bytes     r   
<listcomp>z"percent_encode.<locals>.<listcomp>  s     DDDtNNNNDDDr   zutf-8)r   ry   upper)r=   s    r   percent_encoder     s=     77DDt{{7/C/CDDDEEKKMMMr   r   stringrE   c                8    t           |z   dz   }| D ]	}||vr dS 
dS )z<
    Determine if a given string is already quote-safe.
    r   FT)UNRESERVED_CHARACTERS)r   rE   NON_ESCAPED_CHARSr=   s       r   is_safer     sD     .4s:   (((55 ) 4r   c                    t          | |          r| S t          |z   d                    fd| D                       S )z1
    Use percent-encoding to quote a string.
    rD   r   c                :    g | ]}|v r|nt          |          S r3   )r   )r<   r=   r   s     r   r   z#percent_encoded.<locals>.<listcomp>  s0    XXX***t0D0DXXXr   )r   r   r   )r   rE   r   s     @r   percent_encodedr     sX     vD!!! -477XXXXQWXXX  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   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2F;; 
( 
(',{{}}eiikk{{1~~---!"2>"ABLLLDAAABBB 	\"""' 3v;;&&/001_]>>>???775>>r   rS   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   rD   =)r   )r<   kvs      r   r   zurlencode.<locals>.<listcomp>  sP     	
 	
 	
1 AB'''#-0K0K0KK	
 	
 	
r   )r   )rS   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   rF   r   rG   r   r   r   )r	   r   r   r   )r=   r   r   r   )r   )r   r   rE   r   r   r   )r   r   rE   r   r   r   )rS   r   r   r   ) __doc__
__future__r   rs   r   typingrx   _exceptionsr   rI   r   r[   compiler   formatrV   rY   rT   rr   rv   
NamedTupler   r&   r\   r]   r^   r_   r   r   r   rO   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D D D D DN+= += += +=\   6   6   ,N N N N    
 
 
 
 
    B     r   