
    @OOf                        d dl Z d dl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 d d	lmZ d d
lmZ d dlmZ  G d de
      ZdedefdZdededefdZdededee   fdZ G d d      Zy)    N)Sequence)Path)
NamedTuple)	safe_join)ctx)
exceptions)
flowfilter)http)version)
parse_specc                   @    e Zd ZU ej                  ed<   eed<   eed<   y)MapLocalSpecmatchesregex
local_pathN)__name__
__module____qualname__r	   TFilter__annotations__strr        Z/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/mitmproxy/addons/maplocal.pyr   r      s    Jr   r   optionreturnc                 Z   t        |       \  }}}	 t        j                  |       	 t        |      j                         j                  d      }t        |||      S # t        j                  $ r}t	        d|d| d      d }~ww xY w# t        $ r}t	        d| d| d      d }~ww xY w)NzInvalid regular expression z ()T)strictzInvalid file path: )
r   recompileerror
ValueErrorr   
expanduserresolveFileNotFoundErrorr   )r   filterr   replacementepaths         r   parse_map_local_specr+      s    !+F!3FE;H


5DK ++-55T5B t,, 88 H6uir!AFGGH
  D.{m2aSBCCDs.   A )B
 B0BB
	B*B%%B*root	untrustedc                     t        |      j                  }t        | j                         g| }|t	        d      t        |      S )zJoin a Path element with an untrusted str.

    This is a convenience wrapper for werkzeug's safe_join,
    raising a ValueError if the path is malformed.zUntrusted paths.)r   partsr   as_posixr#   )r,   r-   untrusted_partsjoineds       r   _safe_path_joinr3   )   sC    
 9o++Ot}}99F~+,,<r   urlspecc                 l   t        j                  |j                  |       }|sJ |j                         r|j	                  d      }nJt        j
                  |j                  | d      d   }|j                  d      d   }|j                  d      }|r}t        j                  j                  |      }|| dg}t        j                  dd|      }||k7  r|j                  || dg       	 |D cg c]  }t        |j                  |       c}S |j                  d	z  gS c c}w # t        $ r g cY S w xY w)
z
    Get all potential file candidates given a URL and a mapping spec ordered by preference.
    This function already assumes that the spec regex matches the URL.
       )maxsplit?r   /z/index.htmlz[^0-9a-zA-Z\-_.=(),/]_z
index.html)r    searchr   groupsgroupsplitstripurllibparseunquotesubextendr3   r   r#   )r4   r5   msuffixdecoded_suffixsuffix_candidatesescaped_suffixxs           r   file_candidatesrL   5   s    
 			$**c"AH1xxz$**cA6q9c"1%c"--f5+/?{-KL 8#~N^+$$n8H6T%UV	ARSAODOOQ7SS ,.//	 T 	I	s$   ,D% 0D D%  D% %D32D3c                   D    e Zd ZddZd Zd Zdej                  ddfdZy)	MapLocalr   Nc                     g | _         y N)replacements)selfs    r   __init__zMapLocal.__init__S   s
    02r   c                 B    |j                  dt        t           g d       y )N	map_localz
            Map remote resources to a local file using a pattern of the form
            "[/flow-filter]/url-regex/file-or-directory-path", where the
            separator can be any character.
            )
add_optionr   r   )rR   loaders     r   loadzMapLocal.loadV   s"    SM			
r   c                    d|v rNg | _         t        j                  j                  D ])  }	 t	        |      }| j                   j                  |       + y y # t
        $ r!}t        j                  d| d|       |d }~ww xY w)NrU   zCannot parse map_local option z: )	rQ   r   optionsrU   r+   r#   r   OptionsErrorappend)rR   updatedr   r5   r)   s        r   	configurezMapLocal.configureb   s    '! "D++// //7D !!((./ "
 " $1181#Fs   A	A>A99A>flowc                    |j                   s|j                  s|j                  sy |j                  j                  }g }| j
                  D ]  }|j                  |      st        j                  |j                  |      s7|j                  j                         r|j                  g}nt        ||      }|j                  |       d }|D ]  }|j                         s|} n |sdt        j                  i}t!        j"                  t%        |            d   }	|	r|	|d<   	 |j'                         }
t.        j0                  j3                  d|
|      |_          y  |rSt.        j0                  j3                  d      |_         t+        j4                  ddj7                  d	 |D                      y y # t(        $ r#}t+        j,                  d|        Y d }~d }~ww xY w)
NServerr   zContent-TypezCould not read file:    i  z)None of the local file candidates exist: z, c              3   2   K   | ]  }t        |        y wrP   )r   ).0rK   s     r   	<genexpr>z#MapLocal.request.<locals>.<genexpr>   s     EeQRc!fEes   )responser"   liverequest
pretty_urlrQ   r   r    r<   r   r   is_filerL   rE   r   	MITMPROXY	mimetypes
guess_typer   
read_bytesOSErrorloggingwarningr
   Responsemakeinfojoin)rR   r_   r4   all_candidatesr5   
candidates
local_file	candidateheadersmimetypecontentsr)   s               r   rh   zMapLocal.requesto   s   ==DJJdiill%%%% 	D||D!bii

C&@??**,"&//!2J!0d!;J%%j1!
!+ I ((*%.

 '):):;G(33C
ODQGH2:/!#-#8#8#:
 %)MM$6$6sHg$NDM9	:  MM..s3DMLL;DIIEeVdEe<e;fg  # !*?s(CD !s   !F00	G9GG)r   N)	r   r   r   rS   rX   r^   r
   HTTPFlowrh   r   r   r   rN   rN   R   s(    3

/(DMM (d (r   rN   )rp   rl   r    urllib.parserA   collections.abcr   pathlibr   typingr   werkzeug.securityr   	mitmproxyr   r   r	   r
   r   mitmproxy.utils.specr   r   r   r+   r3   listrL   rN   r   r   r   <module>r      s      	  $   '        +: - - - 	$ 	3 	4 	0 0L 0T$Z 0:E Er   