
    @OOfb                        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  ej                   d	      Zd
 Zdd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)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      }t        |t        j                  j                        r|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    W/var/www/premiumrankchecker/venv/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   ParseResultportscheme
urlunparsepathparamsqueryfragment
startswithr   r   )urlr   parsedhostr'   	full_paths         r   r   r      sj   (
 #ujjl3,,'',Cs)C\\''A/CF,,))#.C\\""3'F??,-- %%f-ffll667]]7+F;;Dmmx/sR''	c6;;v||V__MI %9$	t$((==$i//r   c                <    |dk(  rd}t        | ||      }|  d| | S )zs
    Returns a URL string, constructed from the specified components.

    Args:
        All args must be str.
    * z://)hostport)r(   r1   r'   r*   	authoritys        r   unparser8   N   s3     s{t,IXSD6**r   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)=N ).0params     r   	<genexpr>zencode.<locals>.<genexpr>c   s     #XCu$4#Xs   &surrogateescapeerrorsz=&r;   N)anysplitr   r   	urlencodereplace)s
similar_toremove_trailing_equalencodeds       r   r   r   [   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.
    TrA   )keep_blank_valuesrC   )r   r   	parse_qslrI   s    r   r   r   o   s!     <<!!!tDU!VVr   c                F    t         j                  j                  | |d      S )z2
    Returns:
        An ascii-encodable str.
    rA   )saferC   )r   r   r!   )brR   s     r   r!   r!   v   s!    
 <<ad3DEEr   c                D    t         j                  j                  | d      S )z_
    Args:
        s: A surrogate-escaped str
    Returns:
        A surrogate-escaped str
    rA   rB   )r   r   unquoterP   s    r   rU   rU   ~   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   r6   r6      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   rW   rW      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   []   rD   r'   NrA   )r   r   _authority_rematchr   r%   r   groupr.   endswithr   intr   r	   )r7   r   mr1   r'   s        r   parse_authorityrf      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*)r5   )
r(   r   r1   r   r'   rd   r*   r   returnr   )N)rI   zSequence[tuple[str, str]]rJ   z
str | Nonerg   r   )/)rS   r   rR   r   rg   r   )rI   r   rg   r   )r(   r   r1   r   r'   rd   rg   r   )r(   r   rg   z
int | None)r7   r   r   boolrg   ztuple[str, int | None])
__future__r   reurllib.parser   collections.abcr   typingr   mitmproxy.netr   mitmproxy.net.checkr   r   mitmproxy.utils.strutilsr	   compiler`   r   r8   r   r   r!   rU   r6   rW   rf   r<   r   r   <module>rs      sd    " 	  $   - - / 

IJ70t
+(WF=
*#Kr   