U
    WiE                  
   @  s  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d	Zed
jddddddZedjddddZededededededededdZedZedZG dd dejZd>dddddd Zddd!d"d#Zd$dd%d&d'd(Zdd)d)d*d+d,d-Zddd.d/d0Zddd1d2d3Zd?dddd5d6d7Zd@dddd5d8d9Zd:dd;d<d=ZdS )Aa  
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                   @  s   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ddZeddddZdd dddZddddZdS )ParseResultstrr   r   r   
int | Noner   r   
str | Noner	   r
   )returnc                 C  sR   d | jr| j dndd| jkr0d| j dn| j| jd k	rJd| j ndgS )N @:[])joinr   r   r   self r   U/home/afrizal/public_html/fastapi/venv/lib/python3.8/site-packages/httpx/_urlparse.pyr   j   s    zParseResult.authorityc                 C  s>   d d| jkrd| j dn| j| jd k	r6d| j ndgS )Nr   r   r   r   )r   r   r   r   r   r   r   netloct   s
    zParseResult.netloc)kwargsr   c                 K  s6   |s| S | j | j| j| j| jd}|| td|S )Nr   r   )r   )r   r   r   r	   r
   updateurlparse)r   r   defaultsr   r   r   	copy_with}   s    
zParseResult.copy_withc                 C  sh   | j }d| jr| j dnd|r,d| nd| j| jd k	rHd| j nd| jd k	r`d| j ndgS )Nr   r   //?#)r   r   r   r   r	   r
   )r   r   r   r   r   __str__   s    zParseResult.__str__N)	__name__
__module____qualname____annotations__propertyr   r   r"   r&   r   r   r   r   r   a   s   
	r   r   r   r   )urlr   r   c           #      K  s   t | tkrtdtdd | D r\tdd | D }| |}d|d| d}t|d|kr|d }t|tr~t|n||d< d	|kr|	d	pd
}|
d\|d< }|d< d|ksd|kr
t|	dd
pd
}t|	dd
pd
}	|	r| d|	 n||d< d|krJ|	dp"d
}
|

d\|d< }|d< |sJd |d< d|kr|dpbd
}d|kr|dr|dsd| d|d< | D ]\}}|d k	rt |tkrtd| dtdd |D rtdd |D }||}d| d|d| d}t|t| |std| dqt| }|d k	sZt| }|d|d pvd
}|d|d pd
}|d|d pd
}|d|d }|d |d  }t|}|d k	st| }|d|d pd
}|d|d pd
}|d|d }| }t|td d!}t|}t||}|d
k}|d
kpl|d
kpl|d k	}t|||d" |s|rt|}d#}t|t| d$ d!} |d krd nt|t| d% d!}!|d krd nt|t| d& d!}"t||||| |!|"S )'NzURL too longc                 s  s    | ]}|  o|  V  qd S Nisasciiisprintable.0charr   r   r   	<genexpr>   s     zurlparse.<locals>.<genexpr>c                 s  s"   | ]}|  r| s|V  qd S r-   r.   r1   r   r   r   r4      s       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                 s  s    | ]}|  o|  V  qd S r-   r.   r1   r   r   r   r4      s     c                 s  s"   | ]}|  r| s|V  qd S r-   r.   r1   r   r   r   r4      s      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AssertionError	groupdictAUTHORITY_REGEXlower
SUB_DELIMSencode_hostnormalize_portvalidate_pathnormalize_pathr   )#r,   r   r3   idxerrorr   r   _r6   r7   r8   Z	seperatorr   keyvalueZ	url_matchZurl_dictr   r   r   r	   r
   Zauthority_matchZauthority_dictr   Zparsed_schemeZparsed_userinfoparsed_hostparsed_portr<   r=   WHATWG_SAFEZparsed_pathZparsed_queryZparsed_fragmentr   r   r   r       s    


"




r    )r   r   c                 C  s   | sdS t | rJzt|  W n$ tjk
rD   td| Y nX | S t| rzt| dd  W n$ tjk
r   td| Y nX | dd S |  rd}t	| 
 t| dS zt| 
 dW S  tjk
 r   td	| Y nX d S )
Nr   zInvalid IPv4 address: r   zInvalid IPv6 address: z"`{}%|\r:   asciizInvalid IDNA hostname: )IPv4_STYLE_HOSTNAMErO   	ipaddressIPv4AddressAddressValueErrorr   IPv6_STYLE_HOSTNAMEIPv6Addressr/   rG   rS   rT   idnaencodedecode	IDNAError)r   r`   r   r   r   rU   /  s*    

	rU   zstr | int | Noner   )r   r   r   c                 C  sj   | d ks| dkrd S zt | }W n" tk
rB   td| Y nX dddddd|}||krfd S |S )Nr   zInvalid port:    P   i  )ftphttphttpswswss)rD   
ValueErrorr   rH   )r   r   Zport_as_intdefault_portr   r   r   rV   ^  s    
rV   boolNone)r   r<   r=   r   c                 C  sJ   |r| r|  dstd|sF|sF|  dr4td|  drFtd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)rI   r   )r   r<   r=   r   r   r   rW   y  s    

rW   )r   r   c                 C  sv   d| kr| S |  d}d|kr*d|kr*| S g }|D ]8}|dkr@q2|dkr`|rj|dgkrj|  q2|| q2d|S )z
    Drop "." and ".." segments from a URL path.

    For example:

        normalize_path("/path/./to/somewhere/..") == "/path/to"
    r5   rx   z..r   )splitrE   appendr   )r   
componentsoutput	componentr   r   r   rX     s    	

rX   )stringr   c                 C  s   d dd | dD S )Nr   c                 S  s   g | ]}d |dqS )%Z02Xr   )r2   byter   r   r   
<listcomp>  s     zPERCENT.<locals>.<listcomp>zutf-8)r   rj   )r~   r   r   r   PERCENT  s    r   rx   )r~   r;   r   c                   s.   t |  |  s| S d fdd| D S )z1
    Use percent-encoding to quote a string.
    r   c                   s    g | ]}| kr|nt |qS r   )r   r1   ZNON_ESCAPED_CHARSr   r   r     s     z#percent_encoded.<locals>.<listcomp>)UNRESERVED_CHARACTERSrstripr   )r~   r;   r   r   r   percent_encoded  s    
r   c           
      C  s   g }d}t t| D ]T}| |  }}|d}||krZ| || }|t||d || |}q|t| kr| |d }	|t|	|d 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   r:   Nr   )
refinditerPERCENT_ENCODED_REGEXstartendgrouprz   r   r>   r   )
r~   r;   partscurrent_positionrO   Zstart_positionZend_positionZmatched_textZleading_textZtrailing_textr   r   r   rG     s    

rG   zlist[tuple[str, str]])rK   r   c                 C  s   d 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                 S  s,   g | ]$\}}t |d dd t |d d qS )r   r:   =)r   )r2   kvr   r   r   r     s   zurlencode.<locals>.<listcomp>)r   )rK   r   r   r   	urlencode  s
    r   )r   )rx   )rx   )__doc__
__future__r   rd   r   typingri   _exceptionsr   r?   r   rT   compiler   formatrN   rR   rL   rc   rg   
NamedTupler   r    rU   rV   rW   rX   r   r   rG   r   r   r   r   r   <module>   sf   


7 /!