
    @OOfG                         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defdZ G d d      Zy)    N)Sequence)Path)
NamedTuple)ctx)
exceptions)
flowfilter)http)Headers)strutils)
parse_specc                   L    e Zd ZU ej                  ed<   eed<   eed<   defdZy)
ModifySpecmatchessubjectreplacement_strreturnc                     | j                   j                  d      r4t        | j                   dd       j                         j	                         S t        j                  | j                         S )z
        Process the replacement str. This usually just involves converting it to bytes.
        However, if it starts with `@`, we interpret the rest as a file path to read from.

        Raises:
            - IOError if the file cannot be read.
        @   N)r   
startswithr   
expanduser
read_bytesr   escaped_str_to_bytesselfs    _/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/mitmproxy/addons/modifyheaders.pyread_replacementzModifySpec.read_replacement   s[     **3/,,QR01<<>IIKK 001E1EFF    N)	__name__
__module____qualname__r   TFilter__annotations__bytesstrr    r   r   r   r      s'    NG% Gr   r   optionsubject_is_regexr   c                 `   t        |       \  }}}t        j                  |      }|r	 t        j                  |       t        |||      }	 |j                          |S # t        j
                  $ r}t        d|d| d      d }~ww xY w# t        $ r}t        d|dd   d| d      d }~ww xY w)NzInvalid regular expression z ()zInvalid file path: r   )
r   r   r   recompileerror
ValueErrorr   r   OSError)r'   r(   flow_filtersubject_strreplacementr   especs           r   parse_modify_specr5   $   s    ,6v,>)Kk++K8G	NJJw k7K8DH K xx 	N:7+Rs!LMM	N  H.{12.?r!AFGGHs/   A B
 B0BB
	B-B((B-c                   T    e Zd ZddZd Zd Zd Zd Zdej                  d	e
ddfd
Zy)ModifyHeadersr   Nc                     g | _         y N)replacementsr   s    r   __init__zModifyHeaders.__init__9   s
    .0r   c                 B    |j                  dt        t           g d       y )Nmodify_headersa9  
            Header modify pattern of the form "[/flow-filter]/header-name/[@]header-value", where the
            separator can be any character. The @ allows to provide a file path that is used to read
            the header value string. An empty header-value removes existing header-name headers.
            )
add_optionr   r%   )r   loaders     r   loadzModifyHeaders.load<   s"    SM			
r   c                    d|v rOg | _         t        j                  j                  D ]*  }	 t	        |d      }| j                   j                  |       , y y # t
        $ r!}t        j                  d| d|       |d }~ww xY w)Nr=   Fz#Cannot parse modify_headers option z: )	r:   r   optionsr=   r5   r.   r   OptionsErrorappend)r   updatedr'   r4   r3   s        r   	configurezModifyHeaders.configureH   s    w& "D++44 /,VU;D
 !!((./ '
 " $11=fXRsKs   A	A?A::A?c                     |j                   s|j                  s|j                  sy | j                  ||j                  j
                         y r9   )responser-   liverunrequestheadersr   flows     r   rK   zModifyHeaders.requestT   s0    ==DJJdiit||++,r   c                     |j                   s|j                  sy | j                  ||j                  j                         y r9   )r-   rI   rJ   rH   rL   rM   s     r   rH   zModifyHeaders.responseY   s*    ::TYYt}},,-r   rN   hdrsc                    g }| j                   D ]"  }|j                  |j                  |             $ t        | j                         D ]'  \  }}||   s|j	                  |j
                  d        ) t        | j                         D ];  \  }}||   s	 |j                         }|s |j                  |j
                  |       = y # t        $ r"}t        j                  d|        Y d }~ed }~ww xY w)Nz!Could not read replacement file: )r:   rD   r   	enumeratepopr   r   addr/   loggingwarning)r   rN   rP   r   r4   ir2   r3   s           r   rJ   zModifyHeaders.run^   s     %% 	/DNN4<<-.	/ !!2!23 	-GAtqzt,	- !!2!23 		<GAtqz<"&"7"7"9K
 #{;		<  OO&Gs$KLs   C	C2C--C2)r   N)r   r    r!   r;   r@   rF   rK   rH   r	   HTTPFlowr
   rJ   r&   r   r   r7   r7   8   s9    1


/-
.
< <W < <r   r7   )rU   r+   collections.abcr   pathlibr   typingr   	mitmproxyr   r   r   r	   mitmproxy.httpr
   mitmproxy.utilsr   mitmproxy.utils.specr   r   r%   boolr5   r7   r&   r   r   <module>ra      s[     	 $         " $ +G G(c T j (=< =<r   