
    @OOf(                       d dl m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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 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jX                  e-      Z. G d de j$                  j^                        Z0 G d de!jb                        Z2 G d d       Z3y)!    )annotationsN)Sequence)TracebackType)cast)Literal)command)ctx)
exceptions)flow)http)io)ConnectionState)Server)
UpdateHook)ALERT)Options)commands)events)layers)server)Context)CommandGenerator)HTTPMode)UpstreamMode)asyncio_utilsc                  8     e Zd ZU dZded<   d fdZddZ xZS )
MockServerz
    A mock HTTP "server" that just pretends it received a full HTTP request,
    which is then processed by the proxy core.
    http.HTTPFlowr   c                H    t         |   ||j                         || _        y N)super__init__clientr   )selfr   context	__class__s      `/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/mitmproxy/addons/clientplayback.pyr"   zMockServer.__init__,   s    '..1	    c              #  V  K   t        |t        j                        r| j                  j                  j
                  }t        j                         x| j                  j                  _        | j                  j                  _        t        j                  j                  t        j                  j                  d| j                  j                  |xs  | j                  j                  j                   | j                               |r?t        j                  j                  t        j                  j                  d|             | j                  j                  j                  r]t        j                  j                  t        j                  j                  d| j                  j                  j                               t        j                  j                  t        j                  j!                  d             y t        |t        j                  j"                  t        j                  j$                  t        j                  j&                  t        j                  j(                  t        j                  j*                  f      ry t,        j/                  d|        y w)N   )
end_streamreplay_flowz Unexpected event during replay: )
isinstancer   Startr   requestraw_contenttimetimestamp_starttimestamp_endr   r   ReceiveHttpRequestHeaderstrailersRequestDataRequestTrailersRequestEndOfMessageResponseHeadersResponseDataResponseTrailersResponseEndOfMessageResponseProtocolErrorloggerwarning)r$   eventcontents      r'   _handle_eventzMockServer._handle_event0   s    eV\\*ii''33G		DII-		0A0A0O ++))**II%%$+$Ityy/@/@/I/IJ $			 +   kk--fkk.E.Ea.QRRyy  ))kk--KK//4993D3D3M3MN  ++))&++*I*I!*LMM++((,,0011	
 NN=eWEFs   J'J))r   r   r%   r   )rA   zevents.EventreturnzCommandGenerator[None])__name__
__module____qualname____doc____annotations__r"   rC   __classcell__r&   s   @r'   r   r   $   s    
 "Gr(   r   c                  l     e Zd ZU ded<   d fdZd	dZej                  df	 	 	 	 	 	 	 d
dZddZ	 xZ
S )ReplayHandlerzlayers.HttpLayerlayerc                v   |j                   j                         }t        j                  |_        t        ||      }t        |j                  j                  |j                  j                  f      |_
        |j                  j                  dk(  r6d|j                  _        |j                  j                  |j                  _        |j                  r|j                  d   j!                  d      rlt#        j$                  |j                  d         }t'        |t"              sJ |j                  |j(                  fx|j                  _        |j,                  _        t.        | a  |       |j                  rH|j                  d   j!                  d      r*t3        j4                  |t6        j8                        | _        n)t3        j4                  |t6        j<                        | _        t?        ||jA                               | j:                  jB                  |<   || _"        tG        jH                         | _%        y )N)addresshttpsTr   z	upstream:)&client_conncopyr   OPENstater   r   r/   hostportr   schemetlspretty_hostsnimode
startswithr   parser-   rP   viaserver_connr!   r"   r   	HttpLayerr   upstreamrN   transparentr   forkconnectionsr   asyncioEventdone)r$   r   optionsr#   r%   r\   r&   s         r'   r"   zReplayHandler.__init__X   s   !!&&(&++&'*):):DLL<M<M(NO<<')!%GNN!%!9!9GNN<<GLLO66{C%%gll1o6DdL1119=dll8SSGNN!1!1!5!<<GLLO66{C))'83D3DEDJ))'83G3GHDJ)3D',,.)I

v&	MMO	r(   c                   K   | j                  t        j                                | j                  j	                          d {    y 7 wr    )server_eventr   r.   rh   waitr$   s    r'   replayzReplayHandler.replayp   s.     &,,.)iinns   AAA	ANc                \    t        |t              sJ t        j                  |d|        y )Nz	[replay] )levelmsg)r-   intr?   log)r$   messagerp   exc_infos       r'   rs   zReplayHandler.logt   s+     %%%%

iy$9
:r(   c                  K   |j                         \  }t        j                  j                  j	                  |       d {    t        |t        j                        r|j                          d {    t        |t        j                  j                  t        j                  j                  f      r| j                  r| j                  j                         D ])  }|j                  s|j                  j!                          + t#        j$                  | j                  j                         D cg c]  }|j                  s|j                   c}       d {    | j&                  j)                          y y 7 =7 c c}w 7 +wr    )argsr	   masteraddonshandle_lifecycler-   r   Flowwait_for_resumer   r   HttpResponseHookHttpErrorHook
transportsvalueshandlercancelrf   rl   rh   set)r$   hookdataxs       r'   handle_hookzReplayHandler.handle_hook   s    ))+jj00666dDII&&&(((dV[[996;;;T;TUV//1 +Ayy		((*+ ll(,(>(>(@N1AIIQYYN   IIMMO W 	7( OsO   ?FE>1F3F4A7F,AF3FF
FF	!FFF)r   r   ri   r   rD   NonerD   r   )rt   strrp   rr   ru   zdLiteral[True] | tuple[type[BaseException] | None, BaseException | None, TracebackType | None] | NonerD   r   )r   zcommands.StartHookrD   r   )rE   rF   rG   rI   r"   rn   loggingINFOrs   r   rJ   rK   s   @r'   rM   rM   U   sQ    $0 \\ 	;	; 	;		; 
	;r(   rM   c                  8   e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   d Zd Zd Zd ZddZ	d Z
d Z ej                  d      dd       Z ej                  d      dd       Z ej                  d      dd       Z ej                  d      dd       Zy) ClientPlaybackNzasyncio.Task | Noneplayback_taskzhttp.HTTPFlow | Noneinflightzasyncio.Queuequeuer   ri   zset[asyncio.Task]replay_tasksc                p    t        j                         | _        d | _        d | _        t               | _        y r    )rf   Queuer   r   taskr   r   rm   s    r'   r"   zClientPlayback.__init__   s'    ]]_
	Er(   c                    t         j                  | _        t        j                  | j	                         d      | _        y )Nzclient playbackname)r	   ri   r   create_taskplaybackr   rm   s    r'   runningzClientPlayback.running   s,    {{*66MMO"3
r(   c                   K   | j                   r0| j                   j                          	 | j                    d {    y y 7 # t        j                  $ r Y y w xY wwr    )r   r   rf   CancelledErrorrm   s    r'   rh   zClientPlayback.done   sV     %%'((((  ))) s7   'AA A A A A AAAAc                  K   	 | j                   j                          d {   | _        	 | j                  sJ t        | j                  | j                        }t
        j                  j                  dk(  rft        j                  |j                         d      }| j                  j                  |       |j                  | j                  j                         n|j                          d {    | j                   j#                          d | _        7 7 )# t        $ r t        j!                  d       Y Gw xY ww)Nz!client playback awaiting responser   zClient replay has crashed!)r   getr   rM   ri   r	   client_replay_concurrencyr   r   rn   r   addadd_done_callbackremove	Exceptionr?   	exception	task_done)r$   hts      r'   r   zClientPlayback.playback   s     "&**.."22DM@}}$}!$-->;;88B>%11
)LA %%))!,''(9(9(@(@A((*$$ JJ  " DM# 2 % @  #=?@sE   E D	E CD 0D1D 5$E D D=:E <D==E c                    |j                   s|| j                  k(  ry|j                  ryt        |t        j
                        r2|j                  sy|j                  j                  y|j                  yy y)NzCan't replay live flow.zCan't replay intercepted flow.z'Can't replay flow with missing request.z'Can't replay flow with missing content.zCan't replay WebSocket flows.zCan only replay HTTP flows.)	liver   interceptedr-   r   HTTPFlowr/   r0   	websocket)r$   fs     r'   checkzClientPlayback.check   sc    66Q$--',==3a'99@yy$$,@{{&6  1r(   c                r    |j                  dt        t           g d       |j                  dt        dd       y )Nclient_replayz)Replay client requests from a saved file.r   r*   zoConcurrency limit on in-flight client replay requests. Currently the only valid values are 1 and -1 (no limit).)
add_optionr   r   rr   )r$   loaders     r'   loadzClientPlayback.load   s<    SM7		
 	'}		
r(   c                   d|v rYt         j                  j                  r?	 t        j                  t         j                  j                        }| j                  |       d|v r2t         j                  j                  dvrt        j                  d      y y # t
        j                  $ r#}t        j                  t        |            d }~ww xY w)Nr   r   )r   r*   zGCurrently the only valid client_replay_concurrency values are -1 and 1.)r	   ri   r   r   read_flows_from_pathsr
   FlowReadExceptionOptionsErrorr   start_replayr   )r$   updatedflowses       r'   	configurezClientPlayback.configure   s    g%#++*C*C6001J1JK e$&'1{{44GC --]  D 2	 // 6 --c!f556s   -B C(CCzreplay.client.countc                t    | j                   j                         t        t        | j                              z   S )z@
        Approximate number of flows queued for replay.
        )r   qsizerr   boolr   rm   s    r'   countzClientPlayback.count   s*    
 zz!CT]](;$<<<r(   zreplay.client.stopc                   g }	 	 | j                   j                         }| j                   j                          |j                          |j	                  |       W# t
        j                  $ r Y nw xY wt        j                  j                  j                  t        |             t        j                  t        d       y)z)
        Clear the replay queue.
        zClient replay queue cleared.N)r   
get_nowaitr   revertappendrf   
QueueEmptyr	   rx   ry   triggerr   r?   rs   r   )r$   r   r   s      r'   stop_replayzClientPlayback.stop_replay   s    
 "JJ))+ 

$$&
q!  %%  	

!!*W"56

589s   A A10A1zreplay.clientc                   g }|D ]  }| j                  |      }|rt        j                  |       ,t        t        j
                  |      }|j                          d|_        d|_        d|_	        | j                  j                  |       |j                  |        t        j                  j                  j!                  t#        |             y)zW
        Add flows to the replay queue, skipping flows that can't be replayed.
        r/   N)r   r?   r@   r   r   r   backup	is_replayresponseerrorr   
put_nowaitr   r	   rx   ry   r   r   )r$   r   r   r   err	http_flows         r'   r   zClientPlayback.start_replay  s    
 (* 	&A**Q-Cs#T]]A.I "+I!%I"IOJJ!!),NN9%	& 	

!!*W"56r(   zreplay.client.filec                    	 t        j                  |g      }| j                  |       y# t        j                  $ r#}t        j                  t        |            d}~ww xY w)zI
        Load flows from file, and add them to the replay queue.
        N)r   r   r
   r   CommandErrorr   r   )r$   pathr   r   s       r'   	load_filezClientPlayback.load_file  sV    
	2,,dV4E 	%  ++ 	2))#a&11	2s   * A AA )r   z	flow.FlowrD   z
str | None)rD   rr   r   )r   zSequence[flow.Flow]rD   r   )r   zmitmproxy.types.PathrD   r   )rE   rF   rG   r   rI   r"   r   rh   r   r   r   r   r   r   r   r   r    r(   r'   r   r      s    )-M&-""##"
!( 
 W__*+= ,= W__)*: +:$ W___%7 &7, W__)*! +!r(   r   )4
__future__r   rf   r   r1   collections.abcr   typesr   typingr   r   mitmproxy.types	mitmproxyr   r	   r
   r   r   r   mitmproxy.connectionr   r   mitmproxy.hooksr   mitmproxy.logr   mitmproxy.optionsr   mitmproxy.proxyr   r   r   r   mitmproxy.proxy.contextr   mitmproxy.proxy.layerr   mitmproxy.proxy.layers.httpr   mitmproxy.proxy.mode_specsr   mitmproxy.utilsr   	getLoggerrE   r?   HttpConnectionr   ConnectionHandlerrM   r   r   r(   r'   <module>r      s    "    $            0 ' &  % $ " " " + 2 0 3 )			8	$.G++ .Gb9F,, 9xU! U!r(   