
    @OOfa%                        d dl m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 e G d dej$                               Z G d dej(                        ZddgZy)    )annotationsN)	dataclass)field)Any)ClassVar)
connection)
exceptions)version)serializablec                  j    e Zd ZU dZded<   	  eej                        Zded<   	 dZded	<   d
 Z	d Z
y)ErroraQ  
    An Error.

    This is distinct from an protocol error response (say, a HTTP code 500),
    which is represented by a normal `mitmproxy.http.Response` object. This class is
    responsible for indicating errors that fall outside of normal protocol
    communications, like interrupted connections, timeouts, or protocol errors.
    strmsg)default_factoryfloat	timestampzConnection killed.ClassVar[str]KILLED_MESSAGEc                    | j                   S Nr   selfs    O/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/mitmproxy/flow.py__str__zError.__str__%       xx    c                    | j                   S r   r   r   s    r   __repr__zError.__repr__(   r   r   N)__name__
__module____qualname____doc____annotations__r   timer   r   r   r    r   r   r   r      s;     
H'TYY7Iu75$8NM8r   r   c                  6    e Zd ZU dZded<   	 ded<   	 dZded<   	 d	ed
<   	 dZded<   	 ded<   	 d	ed<   	 ded<   	 	 d&	 	 	 	 	 	 	 d'dZi Zded<   ded<   	 d Z	d(dZ
d)dZed*d       Z fdZd Zd&dZd Zed         Zd! Zd" Zd# Zd$ Zed+d%       Z xZS ),Flowz
    Base class for network flows. A flow is a collection of objects,
    for example HTTP request/response pairs or a list of TCP messages.

    See also:
     - mitmproxy.http.HTTPFlow
     - mitmproxy.tcp.TCPFlow
     - mitmproxy.udp.UDPFlow
    connection.Clientclient_connconnection.Serverserver_connNzError | Noneerrorboolintercepted r   markedz
str | None	is_replayliver   timestamp_createdc                   t        t        j                               | _        || _        || _        || _        t        j                         | _        d| _	        d | _
        d | _        d| _        d | _        t               | _        d| _        y )NFr0   )r   uuiduuid4idr*   r,   r3   r%   r4   r/   _resume_event_backupr1   r2   dictmetadatacomment)r   r*   r,   r3   s       r   __init__zFlow.__init__p   sp     djjl#&&	!%!&37$(%)(,r   zdict[str, type[Flow]]_Flow__typesr   typec                    | j                   j                  d      j                         | _        | t        j
                  | j                  <   y )Nr(   )r    removesuffixlowerr@   r(   r?   )clskwargss     r   __init_subclass__zFlow.__init_subclass__   s3    <<,,V4::<!$SXXr   c                   t         j                  | j                  | j                  | j                  r| j                  j                         nd | j                  j                         | j                  j                         | j                  | j                  | j                  t        j                  | j                        | j                  | j                  d}| j                   |k7  rt        j                  | j                         nd |d<   |S )N)r
   r@   r8   r-   r*   r,   r/   r2   r1   r<   r=   r4   backup)r
   FLOW_FORMAT_VERSIONr@   r8   r-   	get_stater*   r,   r/   r2   r1   copydeepcopyr<   r=   r4   r:   r   states     r   rJ   zFlow.get_state   s    22II''/3zzTZZ))+t++557++557++kkdmm4||!%!7!7
 :>9N$--5TXhr   c                   |j                  d      t        j                  k(  sJ |j                  d      | j                  k(  sJ |j                  d      | _        |d   ra| j
                  r+| j
                  j                  |j                  d             n@t        j                  |j                  d            | _        n|j                  d      | _        | j                  j                  |j                  d             | j                  j                  |j                  d             |j                  d      | _        |j                  d      | _        |j                  d	      | _        |j                  d
      | _        |j                  d      | _        |j                  d      | _        |j                  dd       | _        |i k(  sJ y )Nr
   r@   r8   r-   r*   r,   r/   r2   r1   r<   r=   r4   rH   )popr
   rI   r@   r8   r-   	set_stater   
from_stater*   r,   r/   r2   r1   r<   r=   r4   r:   rM   s     r   rQ   zFlow.set_state   sX   yy#w'B'BBBByy DII---))D/>zz

$$UYYw%78"--eii.@A
7+DJ""599]#;<""599]#;< 99]3;/ii)		*-yy+!&+>!?yy40{{r   c                    	 t         j                  |d      }t	        j
                  dd      }t	        j                  d       } |||      }|j                  |       |S # t        $ r t        d|d          w xY w)Nr@   zUnknown flow type: )r0   r   )peernamesockname)address)r(   r?   KeyError
ValueErrorr   ClientServerrQ   )rD   rN   flow_clsclientserverfs         r   rR   zFlow.from_state   s    	D||E&M2H ""GgF""40VV$	E  	D25=/BCC	Ds   A! !A<c                2    t         |          }d|_        |S )zMake a copy of this flow.F)superrK   r3   )r   r^   	__class__s     r   rK   z	Flow.copy   s    GLNr   c                V    | j                   r| j                   | j                         k7  S y)zU
        `True` if this file has been modified by a user, `False` otherwise.
        Fr:   rJ   r   s    r   modifiedzFlow.modified   s$     <<<<4>>#333r   c                H    | j                   s| j                         | _         yy)z_
        Save a backup of this flow, which can be restored by calling `Flow.revert()`.
        Nrc   )r   forces     r   rH   zFlow.backup   s     ||>>+DL r   c                b    | j                   r#| j                  | j                          d| _         yy)z5
        Revert to the last backed up state.
        N)r:   rQ   r   s    r   revertzFlow.revert   s'     <<NN4<<(DL r   c                    | j                   xr6 | j                  xr' | j                  j                  t        j                  k(   S )zB*Read-only:* `True` if this flow can be killed, `False` otherwise.)r3   r-   r   r   r   r   s    r   killablezFlow.killable   s2     yyX$**"W5CWCW1WXXr   c                    | j                   st        j                  d      t        t        j                        | _        d| _        d| _        y)zh
        Kill this flow. The current request/response will not be forwarded to its destination.
        zFlow is not killable.FN)rj   r	   ControlExceptionr   r   r-   r/   r3   r   s    r   killz	Flow.kill   s@     }}--.EFF
 5//0
 	r   c                z    | j                   ryd| _         | j                  | j                  j                          yy)z[
        Intercept this Flow. Processing will stop until resume is
        called.
        NT)r/   r9   clearr   s    r   	interceptzFlow.intercept   s;    
 )$$& *r   c                   K   | j                   sy| j                  t        j                         | _        | j                  j	                          d{    y7 w)z2
        Wait until this Flow is resumed.
        N)r/   r9   asyncioEventwaitr   s    r   wait_for_resumezFlow.wait_for_resume   sF      %!(D  %%'''s   AAAAc                z    | j                   syd| _         | j                  | j                  j                          yy)uI   
        Continue with the flow – called after an intercept().
        NF)r/   r9   setr   s    r   resumezFlow.resume	  s;      )""$ *r   c                .    | j                   j                  S )z
        *Read-only:* Start time of the flow.
        Depending on the flow type, this property is an alias for
        `mitmproxy.connection.Client.timestamp_start` or `mitmproxy.http.Request.timestamp_start`.
        )r*   timestamp_startr   s    r   rz   zFlow.timestamp_start  s     ///r   )F)r*   r)   r,   r+   r3   r.   returnNone)r{   serializable.State)rN   r}   r{   r|   )rN   r}   r{   r(   )r{   r   )r    r!   r"   r#   r$   r-   r1   r>   r?   rF   rJ   rQ   classmethodrR   rK   rd   rH   rh   propertyrj   rm   rp   ru   rx   rz   __classcell__)ra   s   @r   r(   r(   ,   s0    #"1"" E<=
 FC  J
  	& ' 	
 
( &(G"'  >%$, 	 	,  Y Y	'(% 0 0r   r(   )
__future__r   rr   rK   r%   r6   dataclassesr   r   typingr   r   	mitmproxyr   r	   r
   mitmproxy.coretypesr   SerializableDataclassr   Serializabler(   __all__r&   r   r   <module>r      sq    "     !         , L..  2n0<$$ n0d r   