
    kj                       d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d d	lmZ  ej"                  d
      ZddZe	dd       Ze	dd       Zd ZdddZd ZdddZddZddZddZd dZy)!    )annotationsN)Sequence)AnyStr)overload)check)is_valid_host)is_valid_port)
always_strz+^(?P<host>[^:]+|\[.+\])(?::(?P<port>\d+))?$c                `   d }t        | t              r| j                         }  ||       snt        j                  j                  |       } t        |       } t        j                  j                  | d         | d<   t        j                  j                  |       } t        j                  j                  |       }|j                  st        d      |j                  j                  d      }|j                  d      }|j                  }|s|j                  dk(  rdnd}t        j                  j                  d	d	|j                   |j"                  |j$                  |j&                  f      }|j)                  d
      sd
|z   }t+        j,                  |      st        d      |j                  |||fS )ag  
    URL-parsing function that checks that
        - port is an integer 0-65535
        - host is a valid IDNA-encoded hostname with no null-bytes
        - path is valid ASCII

    Args:
        A URL (as bytes or as unicode)

    Returns:
        A (scheme, host, port, path) tuple

    Raises:
        ValueError, if the URL is not properly formatted.
    c                b    t        |       t        t        |       j                               k(  ryy)NTF)lenstrencode)xs    _/home/ubuntu/.cache/pipx/cdb5059130eadca/lib/python3.12/site-packages/mitmproxy/net/http/url.pyascii_checkzparse.<locals>.ascii_check)   s#    q6SQ))       zNo hostname givenidnaascii   https  P   r      /zInvalid Host)
isinstancebytesdecodeurllibparseurlsplitlistquote
urlunspliturlparsehostname
ValueErrorr   portscheme
urlunparsepathparamsqueryfragment
startswithr   r   )urlr   parsedhostparsed_br'   	full_paths          r   r   r      sV   (
 #ujjl3,,'',Cs)C\\''A/CF,,))#.C'-||'<'<S'AF??,--%%f-.4mmG.DH==Doo1sr||..	c8==(//8>>8CTCTUI %9$	t$((??D$	11r   c                     y N r(   r1   r'   r*   s       r   unparser8   N   s    =@r   c                     y r5   r6   r7   s       r   r8   r8   R   s    CFr   c                ^    t        | ||      }t        | t              r	|  d| | S d| ||fz  S )zJ
    Returns a URL string, constructed from the specified components.
    z://s	   %s://%s%s)hostportr   r   )r(   r1   r'   r*   	authoritys        r   r8   r8   V   sC     t,I&#YKv..vy$777r   c                    d}|r!t        d |j                  d      D              }t        j                  j	                  | dd      }|r!|r|j                  dd      }|d   dk(  r|d	d }|S )
z
    Takes a list of (key, value) tuples and returns a urlencoded string.
    If similar_to is passed, the output is formatted similar to the provided urlencoded string.
    Fc              3  $   K   | ]  }d |v 
 yw)=Nr6   ).0params     r   	<genexpr>zencode.<locals>.<genexpr>j   s     #XCu$4#Xs   &surrogateescapeerrorsz=&r?   N)anysplitr   r   	urlencodereplace)s
similar_toremove_trailing_equalencodeds       r   r   r   b   sx     " ##X*BRBRSVBW#X Xll$$Q6G$HG(//$,2;#crlGNr   c                F    t         j                  j                  | dd      S )z`
    Takes a urlencoded string and returns a list of surrogate-escaped (key, value) tuples.
    TrD   )keep_blank_valuesrF   )r   r   	parse_qslrL   s    r   r   r   v   s!     <<!!!tDU!VVr   c                F    t         j                  j                  | |d      S )z2
    Returns:
        An ascii-encodable str.
    rD   )saferF   )r   r   r"   )brU   s     r   r"   r"   }   s!    
 <<ad3DEEr   c                D    t         j                  j                  | d      S )z_
    Args:
        s: A surrogate-escaped str
    Returns:
        A surrogate-escaped str
    rD   rE   )r   r   unquoterS   s    r   rX   rX      s     <<*;<<r   c                ^    t        |       |k(  r|S t        |t              rd||fz  S d||fz  S )zJ
    Returns the host component, with a port specification if needed.
    s   %s:%dz%s:%d)default_portr   r   )r(   r1   r'   s      r   r;   r;      s>     Ft#dE"tTl**dD\))r   c                0    dddddj                  | d       S )Nr   r   )https   httphttpsr   )get)r(   s    r   rZ   rZ      s&    	
 
c&$r   c                Z   	 t        | t              rPt        j                  | j	                  d            }|st
        |d   j                  d      j	                  d      }n.t        j                  |       }|st
        |j                  d      }|j                  d      r|j                  d      r|dd }t        |      st
        |j                  d      r/t        |j                  d            }t        |      st
        ||fS |d	fS # t
        $ r |r t        | dd
      d	fcY S w xY w)zExtract the host and port from host header/authority information

    Raises:
        ValueError, if check is True and the authority information is malformed.
    zutf-8r1   r   []   rG   r'   NrD   )r   r   _authority_rematchr   r&   r   groupr.   endswithr   intr	   r
   )r<   r   mr1   r'   s        r   parse_authorityri      s   Ki'##I$4$4W$=>A  V9##G,33F;D##I.A  776?D??3DMM#$6":DT"776?qwwv'D &  :: Ki2CDdJJ	Ks   DD D D*)D*)r/   zstr | bytesreturnztuple[bytes, bytes, int, bytes])r(   r   r1   r   r'   rg   rj   r   )r(   r   r1   r   r'   rg   rj   r   r5   )rL   zSequence[tuple[str, str]]rM   z
str | Nonerj   r   )/)rV   r   rU   r   rj   r   )rL   r   rj   r   )r(   r   r1   r   r'   rg   rj   r   )r(   r   rj   z
int | None)r<   r   r   boolrj   ztuple[str, int | None])
__future__r   reurllib.parser   collections.abcr   typingr   r   mitmproxy.netr   mitmproxy.net.checkr   r	   mitmproxy.utils.strutilsr
   compilerc   r   r8   r   r   r"   rX   r;   rZ   ri   r6   r   r   <module>rv      s    " 	  $    - - / 

IJ62r 
 @ 
 @ 
 F 
 F	8(WF=
*#Kr   