
    @OOf|+                     8   d Z 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 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j>                  e       Z! G d d      Z"y)z Write flow objects to a HAR file    N)Sequence)datetime)timezone)Any)command)ctx)
exceptions)flow)
flowfilter)http)types)version)Loader)Server)
_MultiDict)ALERT)human)strutilsc                      e Zd ZddZ ej                  d      deej                     dej                  ddfd       Z
deej                     defdZd	efd
Zd Zdej"                  ddfdZdej"                  ddfdZdej"                  ddfdZdej"                  ddfdZd Zdej"                  dee   defdZdej4                  dee   fdZdeeef   dee   fdZy)SaveHarreturnNc                      g | _         d | _        y N)flowsfilt)selfs    Y/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/mitmproxy/addons/savehar.py__init__zSaveHar.__init__   s    &(
/3	    zsave.harr   pathc           	         t        j                  | j                  |      d      j                         }|j	                  d      rt        j                  |d      }t        |d      5 }|j                  |       ddd       t        j                  t        dt        j                  t        |             d       y# 1 sw Y   DxY w)	z+Export flows to an HAR (HTTP Archive) file.   indentz.zhar	   wbNzHAR file saved (z bytes).)jsondumpsmake_harencodeendswithzlibcompressopenwritelogginglogr   r   pretty_sizelen)r   r   r    harfs        r   
export_harzSaveHar.export_har#   s     jju-a8??A==!--Q'C$ 	GGCL	 	E-e.?.?C.I-J(ST	 	s   (B==Cc                     g }d}t               }|D ]C  }t        |t        j                        r"|j	                  | j                  ||             ?|dz  }E |dkD  rt        j                  d| d       dddt        j                  dd	g |d
iS )Nr      zSkipped z flows that weren't HTTP flows.r1   z1.2	mitmproxy )namer   comment)r   creatorpagesentries)
set
isinstancer   HTTPFlowappend
flow_entryloggerinfor   VERSION)r   r   r?   skippedservers_seenr5   s         r   r)   zSaveHar.make_har1   s     %(E 	A!T]]+tq,?@1		 Q;KK(7)+JKL  '&!
 "	
 	
r   loaderc                 4    |j                  dt        dd       y )Nhardumpr:   z
            Save a HAR file with all flows on exit.
            You may select particular flows by setting save_stream_filter.
            For mitmdump, enabling this option will mean that flows are kept in memory.
            )
add_optionstr)r   rJ   s     r   loadzSaveHar.loadN   s    			
r   c                 d   d|v rUt         j                  j                  r4	 t        j                  t         j                  j                        | _        nd | _        d|v r#t         j                  j                  sg | _        y y y # t        $ r$}t        j                  t        |            |d }~ww xY w)Nsave_stream_filterrL   )r   optionsrQ   r   parser   
ValueErrorr	   OptionsErrorrN   rL   r   )r   updatedes      r   	configurezSaveHar.configureZ   s    7*{{--A * 0 01O1O PDI !	;;&&
 '   " A$11#a&9q@As   2B 	B/B**B/r
   c                 @    |j                   | j                  |       y y r   )	websocket
_save_flowr   r
   s     r   responsezSaveHar.responseh   s     >>!OOD! "r   c                 &    | j                  |       y r   )r]   r\   s     r   errorzSaveHar.errorn   s    dr   c                 &    | j                  |       y r   )r[   r\   s     r   websocket_endzSaveHar.websocket_endq   s    r   c                     t         j                  j                  r@| j                  d u xs | j                  |      }|r| j                  j                  |       y y y r   )r   rR   rL   r   r   rC   )r   r
   flow_matchess      r   r[   zSaveHar._save_flowt   sI    ;;99,?		$L

!!$'  r   c                 T   t         j                  j                  rt         j                  j                  dk(  r<| j                  | j                        }t        t        j                  |d             y | j                  | j                  t         j                  j                         y y )N-r"   r#   )	r   rR   rL   r)   r   printr'   r(   r6   )r   r4   s     r   donezSaveHar.donez   sg    ;;{{""c)mmDJJ/djjQ/0

CKK,?,?@ r   rI   c                    |j                   |v rd}d}n|j                   j                  r|j                   j                  sJ d|j                   j                  |j                   j                  z
  z  }|j                   j                  r1d|j                   j                  |j                   j                  z
  z  }nd}|j	                  |j                          nd}d}|j
                  j                  r1d|j
                  j                  |j
                  j                  z
  z  }nd}|j                  rG|j
                  j                  r1d|j                  j                  |j
                  j                  z
  z  }nd}|j                  rG|j                  j                  r1d|j                  j                  |j                  j                  z
  z  }nd}|||||d}|j                  r|j                  j                  rt        |j                  j                        nd}	|j                  j                  rt        |j                  j                        nd}
|
|	z
  }|j                  j                  |j                  j                  |j                  j                  | j                  |j                        | j                  |j                  j                         |	||j                  j                   j#                  dd      d|j                  j                   j#                  dd      t        t%        |j                  j                               |	d		}|j                  j                  rot'        j(                  |j                  j                        rFt+        j,                  |j                  j                        j/                         |d
   d<   d|d
   d<   nc|j                  j1                  d      }|	d|d
   d<   n<||d
   d<   n3dddg g i dddddd}|j2                  r|j2                  j4                  |d<   |j
                  j6                  dk(  rd|j
                  j8                   d}n|j
                  j8                  }t;        j<                  |j
                  j                  t>        j@                        jC                         tE        d |jG                         D              |j
                  j6                  ||j
                  j                  | j                  |j
                  jH                        | j                  |j
                  j                         | j                  |j
                  jJ                        t        t%        |j
                  j                               |j
                  j                  rt        |j
                  j                        ndd|i |d}|j
                  j6                  dv ro| j                  |j
                  jL                        }|j
                  j                   j#                  dd      |j
                  j1                  d      |d|d   d<   |j                   jN                  r%t%        |j                   jN                  d         |d<   g }|jP                  r|jP                  jR                  D ]  }|jT                  r|jV                  }n-t+        j,                  |j                        j/                         }|jX                  rdnd |jZ                  |j\                  j^                  |d!}|ja                  |        d"|d#<   ||d$<   |S )%zCreates HAR entry from flowg      i  r   )connectsslsendreceivewaitzContent-Typer:   )sizecompressionmimeTypeLocation)	status
statusTexthttpVersioncookiesheaderscontentredirectURLheadersSizebodySizerw   textbase64encodingF)strictN)rr   rs   rt   rv   ru   rw   rx   ry   rz   _transferSize_errorr   CONNECTzhttps:///c              3   2   K   | ]  }||dk\  s|  y w)Nr    ).0vs     r   	<genexpr>z%SaveHar.flow_entry.<locals>.<genexpr>   s     Paq}aPs   )methodurlrt   ru   rv   queryStringry   rz   )startedDateTimetimerequestr]   cachetimings)POSTPUTPATCH)rp   r{   paramsr   postDataserverIPAddressrk   rl   )typer   opcodedatarZ   _resourceType_webSocketMessages)1server_conntimestamp_tcp_setuptimestamp_starttimestamp_tls_setupaddr   timestamp_endr]   raw_contentr3   rw   status_codereasonhttp_versionformat_response_cookiesformat_multidictrv   getrN   r   is_mostly_binr|   	b64encodedecodeget_textr_   msgr   
pretty_urlr   fromtimestampr   utc	isoformatsumvaluesru   queryurlencoded_formpeernamerZ   messagesis_textr{   from_client	timestampr   valuerC   )r   r
   rI   connect_timessl_timerk   rm   rl   r   response_body_sizeresponse_body_decoded_sizeresponse_body_compressionr]   text_contentr   entryr   websocket_messagesmessager   websocket_messages                        r   rD   zSaveHar.flow_entry   s    |+LH11##3333  44t7G7G7W7WWL 33$$88&&::;
  T--.LH<<%%4<<558T8TTUDD==T\\774==884<<;U;UUVDD==T]]88++dmm.K.KKG
 G $,
 ==26--2K2KDMM--.QR  /3mm.C.CDMM))* ' )CEW(W%--33"mm22#}}9977F001F1FG.#< $ 5 5 9 9." M
  $}}4488RH"3t}}'<'<#=>.H }}$$)?)?@U@U)V.4.>.>MM))/&( #F+ 3;#J/#}}55U5C'24HY'/2>HY'/  !!!!"H zz%)ZZ^^"<<)+T\\445Q7C,,))C  (55,,hll ikP7>>#3PP,,--#||88001E1EF001E1EF#44T\\5G5GH"3t||';';#<=9=9M9MC 4 45ST	 !#!
( <<"::**4<<+G+GHF LL0044^RH--U-; ,E)Z( $$'*4+;+;+D+DQ+G'HE#$>>>>22 =??"<<D!++GOO<CCED&-&9&9Fy#--%ll00 	%! #))*;<= &1E/"*<E&'r   r]   c                     |j                   j                  d      }g }|D ]R  \  }\  }}|||j                  dd      |j                  dd      d|v d|v d	}d
|v r|d
   |d
<   |j                  |       T |S )z7Formats the response's cookie header to list of cookiesTmultir    r   domainr:   httpOnlysecure)r;   r   r    r   r   r   sameSite)ru   itemsr   rC   )r   r]   cookie_listrvr;   r   attrscookies           r   r   zSaveHar.format_response_cookies  s    &&,,4,8$/ 	 D.5%		&#.))Hb1&%/"e+F U"%*:%6z"IIf!	" 	r   objc                 ^    |j                  d      D cg c]
  \  }}||d c}}S c c}}w )NTr   )r;   r   )r   )r   r   kr   s       r   r   zSaveHar.format_multidict5  s*    47IIDI4IJDAqQ'JJJs   ))r   N) __name__
__module____qualname__r   r   r   r
   Flowr   Pathr6   dictr)   r   rO   rX   r   rB   r]   r_   ra   r[   rg   r@   r   rD   Responselistr   r   rN   r   r   r   r   r   r      sA   4 W__Z U 3 U5:: U$ U !U
htyy1 
d 
:

6 

 "T]] "t "$-- D $-- D (t}} ( (AZt}} ZCK ZD Zx $t* .KJsCx$8 KT$Z Kr   r   )#__doc__r|   r'   r0   r,   collections.abcr   r   r   typingr   r9   r   r   r	   r
   r   r   r   r   mitmproxy.addonmanagerr   mitmproxy.connectionr   mitmproxy.coretypes.multidictr   mitmproxy.logr   mitmproxy.utilsr   r   	getLoggerr   rE   r   r   r   r   <module>r      sj    &     $              ) ' 4  ! $			8	$XK XKr   