
    @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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"                  e      Zg dZ G d d      Zy)    N)Hashable)Sequence)Any)command)ctx)
exceptions)flow)hooks)http)io)server_replay_ignore_contentserver_replay_ignore_hostserver_replay_ignore_params#server_replay_ignore_payload_paramsserver_replay_ignore_portserver_replay_use_headersc                   X   e Zd ZU eeeej                     f   ed<   e	ed<   d Z
d Z ej                  d      deej                     ddfd	       Z ej                  d
      deej                     ddfd       Z ej                  d      dej&                  j(                  ddfd       Z ej                  d      dd       Z ej                  d      defd       Zdej                  defdZdej                  dej                  dz  fdZd ZddZdej                  ddfdZy)ServerPlaybackflowmap
configuredc                      i | _         d| _        y )NF)r   r   selfs    `/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/mitmproxy/addons/serverplayback.py__init__zServerPlayback.__init__!   s        c                    |j                  dt        dd       |j                  dt        ddg d       |j                  d	t        dd
       |j                  dt        dd       |j                  dt        dd       |j                  dt        t           g d       |j                  dt        t           g d       |j                  dt        dd       |j                  dt        t           g d       |j                  dt        t           g d       |j                  dt        dd       |j                  dt        dd       y )Nserver_replay_kill_extraFzKill extra requests during replay (for which no replayable response was found).[Deprecated, prefer to use server_replay_extra='kill']server_replay_extraforwardzBehaviour for extra requests during replay for which no replayable response was found. Setting a numeric string value will return an empty HTTP response with the respective status code.)r    kill204400404500)choicesserver_replay_reusez
            Don't remove flows from server replay state after use. This makes it
            possible to replay same response multiple times.
            server_replay_nopopzE
            Deprecated alias for `server_replay_reuse`.
            server_replay_refreshTz
            Refresh server replay responses by adjusting date, expires and
            last-modified headers, as well as adjusting cookie expiration.
            r   zt
            Request headers that need to match while searching for a saved flow
            to replay.
            server_replayz*Replay server responses from a saved file.r   zBIgnore request content while searching for a saved flow to replay.r   zr
            Request parameters to be ignored while searching for a saved flow
            to replay.
            r   z
            Request payload parameters (application/x-www-form-urlencoded or
            multipart/form-data) to be ignored while searching for a saved flow
            to replay.
            r   zq
            Ignore request destination host while searching for a saved flow
            to replay.
            r   zq
            Ignore request destination port while searching for a saved flow
            to replay.
            )
add_optionboolstrr   )r   loaders     r   loadzServerPlayback.load%   s~   &E		
 	!qC 	 	
 	!		
 	!		
 	#		
 	'SM		
 	SM8		
 	*P		
 	)SM		
 	1SM			
 	'		
 	'		
r   zreplay.serverflowsreturnNc                 4    i | _         | j                  |       y)z5
        Replay server responses from flows.
        N)r   	add_flows)r   r0   s     r   
load_flowszServerPlayback.load_flows   s    
 ur   zreplay.server.addc                 8   |D ]Y  }t        |t        j                        s| j                  j	                  | j                  |      g       }|j                  |       [ t        j                  j                  j                  t        j                  g              y)zA
        Add responses from flows to server replay list.
        N)
isinstancer   HTTPFlowr   
setdefault_hashappendr   masteraddonstriggerr
   
UpdateHook)r   r0   flsts       r   r3   zServerPlayback.add_flows   so    
  	A!T]]+ll--djjmR@

1	 	

!!%"2"22"67r   zreplay.server.filepathc                     	 t        j                  |g      }| j                  |       y # t        j                  $ r#}t        j                  t        |            d }~ww xY wN)r   read_flows_from_pathsr   FlowReadExceptionCommandErrorr-   r4   )r   rA   r0   es       r   	load_filezServerPlayback.load_file   sT    	2,,dV4E 	 ++ 	2))#a&11	2s   * A AA zreplay.server.stopc                     i | _         t        j                  j                  j	                  t        j                  g              y)z%
        Stop server replay.
        N)r   r   r;   r<   r=   r
   r>   r   s    r   clearzServerPlayback.clear   s.    
 

!!%"2"22"67r   zreplay.server.countc                 V    t        d | j                  j                         D              S )Nc              3   2   K   | ]  }t        |        y wrC   )len).0is     r   	<genexpr>z'ServerPlayback.count.<locals>.<genexpr>   s     9a3q69s   )sumr   valuesr   s    r   countzServerPlayback.count   s     94<<#6#6#8999r   r	   c                 "   |j                   }t        j                  j                  |j                        \  }}}}}}t        j                  j                  |d      }t        |j                        t        |j                        t        |      g}t        j                  j                  st        j                  j                  r?|j                  r3|j                  d |j                  j                  d      D               n}t        j                  j                  r?|j                   r3|j                  d |j                   j                  d      D               n$|j#                  t        |j$                               t        j                  j&                  s|j#                  |j(                         t        j                  j*                  s|j#                  |j,                         g }t        j                  j.                  xs g }	|D ]  }
|
d   |	vs|j#                  |
        |D ]*  }
|j#                  |
d          |j#                  |
d          , t        j                  j0                  r`g }t        j                  j0                  D ]0  }|j2                  j5                  |      }|j#                  ||f       2 |j#                  |       t7        j8                  t;        |      j=                  dd	            j?                         S )
z>
        Calculates a loose hash of the flow request.
        T)keep_blank_valuesc              3      K   | ]7  \  }}|j                  d       t        j                  j                  vr||f 9 yw)replace)errorsN)decoder   optionsr   rN   kvs      r   rP   z'ServerPlayback._hash.<locals>.<genexpr>   sA      1xxyx1;;JJK Fs   =?)multic              3   b   K   | ]'  \  }}|t         j                  j                  vr||f ) y wrC   )r   rZ   r   r[   s      r   rP   z'ServerPlayback._hash.<locals>.<genexpr>   s2      1 O OO Fs   -/r      utf8surrogateescape) requesturllibparseurlparseurl	parse_qslr-   schememethodr   rZ   r   r   multipart_formextenditemsurlencoded_formr:   raw_contentr   pretty_hostr   portr   r   headersgethashlibsha256reprencodedigest)r   r	   r_rA   queryqueriesArraykeyfilteredignore_paramsprr   rO   r]   s                 r   r9   zServerPlayback._hash   sG    LL"(,,"7"7">1dAua||--et-Lahh-QXXD	B{{77{{>>1CSCS

  ! 0 0 6 6T 6 B  @@QEVEV

  ! 1 1 7 7d 7 C  

3q}}-.{{44JJq}}%{{44JJqvv??E2 	#At=("	#  	AJJqtJJqt	 ;;00G[[:: 'IIMM!$1v&' JJw~~d3i..v7HIJQQSSr   c                    | j                  |      }|| j                  v rt        j                  j                  st        j                  j
                  r t        d | j                  |   D        d      S | j                  |   j                  d      }|j                  sI| j                  |   r| j                  |   j                  d      }n| j                  |= y|j                  sI| j                  |   s| j                  |= |S y)z^
        Returns the next flow object, or None if no matching flow was
        found.
        c              3   :   K   | ]  }|j                   s|  y wrC   )response)rN   r	   s     r   rP   z+ServerPlayback.next_flow.<locals>.<genexpr>   s     JdDMMTJs   Nr   )	r9   r   r   rZ   r'   r(   nextpopr   )r   r	   hashrets       r   	next_flowzServerPlayback.next_flow   s    
 zz$4<<{{..#++2Q2QJdll4&8JD  ll4(,,Q/,,||D)"ll4044Q7 LL.# ,, ||D)T*
r   c                 ^   t         j                  j                  rt        j	                  d       t         j                  j
                  rt        j                  d       | j                  s`t         j                  j                  rFd| _        	 t        j                  t         j                  j                        }| j                  |       t!        fdt"        D              r| j%                          y y # t        j                  $ r#}t        j                  t        |            d }~ww xY w)Nzjserver_replay_kill_extra has been deprecated, please update your config to use server_replay_extra='kill'.zWserver_replay_nopop has been renamed to server_replay_reuse, please update your config.Tc              3   &   K   | ]  }|v  
 y wrC    )rN   optionupdateds     r   rP   z+ServerPlayback.configure.<locals>.<genexpr>  s     <Vv <s   )r   rZ   r   loggerwarningr(   errorr   r*   r   rD   r   rE   OptionsErrorr-   r4   anyHASH_OPTIONSrecompute_hashes)r   r   r0   rG   s    `  r   	configurezServerPlayback.configure   s    ;;//NNO ;;**LLi 3;;#<#<"DO6001J1JK OOE"<|<<!!# = // 6 --c!f556s   -C6 6D,	D''D,c                     | j                   j                         D cg c]  }|D ]  }|  }}}| j                  |       yc c}}w )z
        Rebuild flowmap if the hashing method has changed during execution,
        see https://github.com/mitmproxy/mitmproxy/issues/4506
        N)r   rR   r4   )r   r@   r	   r0   s       r   r   zServerPlayback.recompute_hashes  sB    
 "&!4!4!6G#3G4GGG Hs   Ar?   c                 ~   | j                   r| j                  |      }|ra|j                  sJ |j                  j                         }t        j
                  j                  r|j                          ||_        d|_        y t        j
                  j                  st        j
                  j                  dk(  rIt        j                  dj                  |j                  j                               |j!                          y t        j
                  j                  dk7  rt        j                  dj                  t        j
                  j                  |j                  j                               t"        j$                  j'                  t)        t        j
                  j                              |_        d|_        y y y )Nr   r!   z-server_playback: killed non-replay request {}r    z2server_playback: returned {} non-replay request {})r   r   r   copyr   rZ   r)   refresh	is_replayr   r   loggingr   formatrc   rg   r!   r   Responsemakeint)r   r?   rflowr   s       r   rc   zServerPlayback.request  s)   <<NN1%E~~%~ >>..0;;44$$&%
(44;;22f<CJJ		
 00I=HOO77
 "]]//CKK4S4S0TU
( >' r   )r1   N)__name__
__module____qualname__dictr   listr   r7   __annotations__r,   r   r/   r   r   r	   Flowr4   r3   	mitmproxytypesPathrH   rJ   r   rS   r9   r   r   r   rc   r   r   r   r   r      su   (D//00 c
J W___% 3   & W__()8x		2 8t 8 *8 W__)*ioo22 t  + W__)*8 +8 W__*+:s : ,:.T$-- .TH .T`dmm 0D 2$() )4 )r   r   )rt   r   rd   collections.abcr   r   typingr   mitmproxy.typesr   r   r   r   r	   r
   r   r   	getLoggerr   r   r   r   r   r   r   <module>r      sT       $ $          			8	$T) T)r   