
    hrH              
         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d
                    d  edd          D                       Zd
                    d  edd          D                       Zd
                    d  edd          D                       Zd
                    d  edd          D                       Zd
                    d  edd          D                       Zd
                    d  edd          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@d0Z dAd6Z!dBd7Z"dCd9Z#dDd;Z$dDd<Z%dS )Ea  
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} c                4    g | ]}|d vt          |          S ))    "   <   >   `   chr.0is     Q/var/www/html/prod/cognitive/venv/lib/python3.11/site-packages/httpx/_urlparse.py
<listcomp>r   ,   )    RRR!3Q*Q*QSVV*Q*Q*Q    r      c                4    g | ]}|d vt          |          S ))r   r	   #   r
   r   r   r   s     r   r   r   2   r   r   c                4    g | ]}|d vt          |          S ))	r   r	   r   r
   r   ?   r   {   }   r   r   s     r   r   r   8   s4       MMM 	AMMMr   c                4    g | ]}|d vt          |          S )r   r	   r   r
   r   r   r   r   r   /   :   ;   =   @   [   \   ]   ^   |   r   r   s     r   r   r   C   F       GG G 	AG G Gr   c                4    g | ]}|d vt          |          S r   r   r   s     r   r   r   M   r)   r   c                4    g | ]}|d vt          |          S ))r   r	   r   r
   r   r   r   r   r   r   r!   r"   r#   r$   r%   r&   r'   r(   r   r   s     r   r   r   Z   sF       AA A 	AA A Ar   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/   r0   r1   r2   r3   r4   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-   r2   r3   
int | Noner4   r/   
str | Noner0   r1   returnc                    d                     | j        r
| j         dndd| j        v rd| j         dn| j        | j        
d| j         ndg          S )Nr   @:[])joinr2   r3   r4   selfs    r   r.   zParseResult.authority   sq    ww'+}<4=####"$'49$4$4 DI    $)#'9#8DIb
 
 	
r   c                    d                     d| j        v rd| j         dn| j        | j        
d| j         ndg          S )Nr   r=   r>   r?   )r@   r3   r4   rA   s    r   netloczParseResult.netloc   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/   r0   r1   updateurlparse)rB   rE   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/   r0   r1   )rB   r.   s     r   __str__zParseResult.__str__   s    N	ww%)[84;!!!!b$-5 Y   2	$(J$: DJ   '+}'@#DM###b
 
 	
r   N)r:   r7   )rE   r9   r:   r6   )	__name__
__module____qualname____annotations__propertyr.   rD   rK   rP    r   r   r6   r6      s         KKKMMMIIIIII
 
 
 X
 
 
 
 X
( ( ( (

 

 

 

 

 

r   r6   urlr7   rE   r9   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 rft          |	                    dd	          pd	t                    }t          |	                    dd	          pd	t                    }	|	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          |t2                    }t5          |          }t7          ||          }|d	k    }|d	k    p	|d	k    p|d u}t9          |||!           |s|rt;          |          }t          |t<                    }|d nt          |t>                    } |d nt          |t@                    }!tC          |||||| |!          S )"NzURL too longc              3  h   K   | ]-}|                                 o|                                 V  .d S Nisasciiisprintabler   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 rZ   r[   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 .r4   rD   r   r=   r3   usernamepasswordsafer2   raw_pathrN   r/   r0   r>   r?   zURL component 'z
' too longc              3  h   K   | ]-}|                                 o|                                 V  .d S rZ   r[   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 rZ   r[   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.   r1   )
has_schemehas_authority)"lenMAX_URL_LENGTHr   anynextfind
isinstanceintr7   pop	partitionquoteUSERNAME_SAFEPASSWORD_SAFEget
startswithendswithitemsCOMPONENT_REGEX	fullmatch	URL_REGEXmatch	groupdictAUTHORITY_REGEXlowerUSERINFO_SAFEencode_hostnormalize_portvalidate_pathnormalize_path	PATH_SAFE
QUERY_SAFE	FRAG_SAFEr6   )"rW   rE   r_   idxerrorr4   rD   _rc   rd   rg   	seperatorr3   keyvalue	url_matchurl_dictr-   r.   r/   r0   fragauthority_matchauthority_dictr2   parsed_schemeparsed_userinfoparsed_hostparsed_portrk   rl   parsed_pathparsed_queryparsed_frags"                                     r   rI   rI      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NNNJ339rNNN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::j(:"677D &++I66O&&&$..00N zz*nZ&@AAGRH::fnV455;D::fnV455D
  M >>>O"4((K,T6::K"$J2M!2Mk6M  $:]KKKK $] $d##T	222K',}tt%J:W:W:WL&*lddd8S8S8SK   r   r3   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"`{}%|\re   asciizInvalid IDNA hostname: )IPv4_STYLE_HOSTNAMEr   	ipaddressIPv4AddressAddressValueErrorr   IPv6_STYLE_HOSTNAMEIPv6Addressr\   rv   r   
SUB_DELIMSidnaencodedecode	IDNAError)r3   WHATWG_SAFEs     r   r   r   \  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 r4   str | int | Noner-   r8   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)rs   
ValueErrorr   ry   )r4   r-   port_as_intdefault_ports       r   r   r     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/   rk   boolrl   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 '/'rM   z3Relative URLs cannot have a path starting with '//'r=   z2Relative URLs cannot have a path starting with ':'N)rz   r   )r/   rk   rl   s      r   r   r     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"
    rb   r   z..r   )splitrt   appendr@   )r/   
componentsoutput	components       r   r   r     s     $CJ *Z!7!7 F % %	$ &RD..

MM)$$$$88Fr   stringc                f    d                     d |                     d          D                       S )Nr   c                    g | ]}d |d	S )%02XrV   )r   bytes     r   r   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   rf   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 rV   )r   )r   r_   NON_ESCAPED_CHARSs     r   r   z#percent_encoded.<locals>.<listcomp>  s.    QQQ$***QQQr   )UNRESERVED_CHARACTERSrstripr@   )r   rf   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   re   Nr   )
refinditerPERCENT_ENCODED_REGEXstartendgroupr   r   rm   r@   )
r   rf   partscurrent_positionr   start_positionend_positionmatched_textleading_texttrailing_texts
             r   rv   rv     s     E2F;; 
( 
(',{{}}eiikk{{1~~---!"2>"ABLLLDAAABBB 	\"""' 3v;;&&/001_]>>>???775>>r   rG   )rW   r7   rE   r9   r:   r6   )r3   r7   r:   r7   )r4   r   r-   r7   r:   r8   )r/   r7   rk   r   rl   r   r:   r   )r/   r7   r:   r7   )r   r7   r:   r7   )r   r7   rf   r7   r:   r7   )&__doc__
__future__r   r   r   typingr   _exceptionsr   rn   r   r   compiler   r@   ranger   r   r   rw   rx   r   formatr   r   r}   r   r   
NamedTupler6   rI   r   r   r   r   r   r   rv   rV   r   r   <module>r      s   $ # " " " " "     				   # # # # # # I  
"
#455  GGRRUU4&&RRR 	 WWRRUU4&&RRR 
 GG tT""   	  tT""  	 	  tT""  	 	  tT""  	 	" 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S S S S2   >H H H H        r   