
    @OOf                     >   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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 d dlmZ ededefd       Zededed   fd       Z G d d      Zy)    N)Sequence)datetime)	lru_cache)Path)Literal)Optional)command)ctx)dns)
exceptions)flow)
flowfilter)http)io)tcp)udp)ALERTpathreturnc                 l    | j                  d      r| dd } t        j                  j                  |       S )zLExtract the path from a path spec (which may have an extra "+" at the front)+   N)
startswithosr   
expanduserr   s    V/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/mitmproxy/addons/save.py_pathr      s0     sABx77d##    )abwbc                 (    | j                  d      ryy)z?Extract the writing mode (overwrite or append) from a path specr   r    r!   )r   r   s    r   _moder#   !   s     sr   c                   t   e Zd ZddZd Zd ZddZdej                  ddfdZ	dd	Z
 ej                  d
      deej                     dej                  j                  ddfd       Zdej$                  fdZdej$                  fdZdej$                  fdZdej.                  fdZdej.                  fdZdej.                  fdZdej8                  fdZdej8                  fdZdej8                  fdZdej8                  fdZ de!jD                  fdZ#de!jD                  fdZ$de!jD                  fdZ%y)Saver   Nc                 L    d | _         d | _        t               | _        d | _        y N)streamfiltsetactive_flowscurrent_path)selfs    r   __init__zSave.__init__+   s"    48/3	,/E(,r   c                     |j                  dt        t           d d       |j                  dt        t           d d       y )Nsave_stream_filea  
            Stream flows to file as they arrive. Prefix path with + to append.
            The full path can use python strftime() formating, missing
            directories are created as needed. A new file is opened every time
            the formatted string changes.
            save_stream_filterz'Filter which flows are written to file.)
add_optionr   str)r-   loaders     r   loadz	Save.load1   sB    SM	
	
 	 SM5		
r   c                 R   d|v rUt         j                  j                  r4	 t        j                  t         j                  j                        | _        nd | _        d|v sd|v rft         j                  j                  r;	 | j                          | j                  sJ | j
                  | j                  _        y | j                          y y # t        $ r$}t        j                  t        |            |d }~ww xY w# t        $ r$}t        j                  t        |            |d }~ww xY w)Nr1   r0   )r
   optionsr1   r   parser)   
ValueErrorr   OptionsErrorr3   r0   maybe_rotate_to_new_fileOSErrorr(   fltdone)r-   updatedes      r   	configurezSave.configureD   s    7*{{--A * 0 01O1O PDI !	(,@G,K{{++A113 {{"{"&))		 -L	 " A$11#a&9q@A  A$11#a&9q@As/   2C	 =C9 		C6C11C69	D&D!!D&c                 &   t        j                         j                  t        t        j
                  j                              }| j                  |k(  ry | j                  r+| j                  j                  j                          d | _        t        |      }|j                  j                  dd       |j                  t        t        j
                  j                              }t!        j"                  || j$                        | _        || _        y )NT)parentsexist_ok)r   todaystrftimer   r
   r7   r0   r,   r(   focloser   parentmkdiropenr#   r   FilteredFlowWriterr)   )r-   r   new_log_filefs       r   r;   zSave.maybe_rotate_to_new_fileX   s    ~~((s{{/K/K)LM$;;KKNN  "DKDz!!$!>eCKK$@$@AB++Atyy9 r   r   c                 `   | j                   sy	 | j                          | j                   j                  |       | j                  j	                  |       y# t
        $ rN}t        j                  j                  d| j                   d|        t        j                  d       Y d}~yd}~ww xY w)zc
        Write the flow to the stream, but first check if we need to rotate to a new file.
        NzError while writing to z: r   )r(   r;   addr+   discardr<   sysstderrwriter,   exit)r-   r   r@   s      r   	save_flowzSave.save_flowh   s     {{
	,))+KKOOD! %%d+  	 JJ6t7H7H6IA3OPHHQKK	s   +A 	B-AB((B-c                    | j                   ry| j                  D ]  }| j                   j                  |        | j                  j                          d | _        | j                   j
                  j                          d | _         y y r'   )r(   r+   rP   clearr,   rG   rH   )r-   rN   s     r   r>   z	Save.donez   sh    ;;&& #"###% $DKKNN  "DK r   z	save.fileflowsr   c                    	 t        t        |      t        |            5 }t        j                  |      }|D ]  }|j                  |        	 ddd       |j                  d      s|j                  d      rt        j                  t        d       yt        j                  t        dt        |       d       y# 1 sw Y   nxY w# t        $ r}t        j                  |      |d}~ww xY w)z
        Save flows to a file. If the path starts with a +, flows are
        appended to the file, otherwise it is over-written.
        Nz.harz.zharzLSaved as mitmproxy dump file. To save HAR files, use the `save.har` command.zSaved z flows.)rK   r   r#   r   
FlowWriterrP   r<   r   CommandErrorendswithlogginglogr   len)r-   rY   r   rN   r(   ir@   s          r   savez	Save.save   s    	4eDk5;/ "1q) "AJJqM"" == DMM'$:KK^
 KKE
|7;<" "  	4))!,!3	4s.   C .B<C <CC 	C,C''C,c                 T    | j                   r| j                  j                  |       y y r'   r(   r+   rP   r-   r   s     r   	tcp_startzSave.tcp_start   "    ;;!!$' r   c                 &    | j                  |       y r'   rV   re   s     r   tcp_endzSave.tcp_end       tr   c                 &    | j                  |       y r'   )rj   re   s     r   	tcp_errorzSave.tcp_error       Tr   c                 T    | j                   r| j                  j                  |       y y r'   rd   re   s     r   	udp_startzSave.udp_start   rg   r   c                 &    | j                  |       y r'   ri   re   s     r   udp_endzSave.udp_end   rk   r   c                 &    | j                  |       y r'   )rr   re   s     r   	udp_errorzSave.udp_error   rn   r   c                 &    | j                  |       y r'   ri   re   s     r   websocket_endzSave.websocket_end   rk   r   c                 T    | j                   r| j                  j                  |       y y r'   rd   re   s     r   requestzSave.request   rg   r   c                 @    |j                   | j                  |       y y r'   )	websocketrV   re   s     r   responsezSave.response   s     >>!NN4  "r   c                 &    | j                  |       y r'   )r{   re   s     r   errorz
Save.error   s    dr   c                 T    | j                   r| j                  j                  |       y y r'   rd   re   s     r   dns_requestzSave.dns_request   rg   r   c                 &    | j                  |       y r'   ri   re   s     r   dns_responsezSave.dns_response   rk   r   c                 &    | j                  |       y r'   ri   re   s     r   	dns_errorzSave.dns_error   rk   r   )r   N)&__name__
__module____qualname__r.   r5   rA   r;   r   FlowrV   r>   r	   r   	mitmproxytypesr   rb   r   TCPFlowrf   rj   rm   r   UDPFlowrp   rr   rt   r   HTTPFlowrv   rx   r{   r}   r   DNSFlowr   r   r    r   r   r%   r%   *   sI   -
&(! ,dii ,D ,$ W__[!=(499- =Y__5I5I =d = "=((ckk (CKK ckk (ckk (CKK ckk $-- (DMM (!T]] !$-- ( ( ckk r   r%   ) r^   os.pathr   rR   collections.abcr   r   	functoolsr   pathlibr   typingr   r   mitmproxy.typesr   r	   r
   r   r   r   r   r   r   r   r   mitmproxy.logr   r3   r   r#   r%   r   r   r   <module>r      s      
 $                    $ $ $ $  
+  [ [r   