
    kj`(                     b   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mZm	Z	m
Z
mZ ddlmZ ddlmZmZmZmZ ddlmZ ej*                  d	ej,                  d
ej.                  dej0                  dej2                  dej4                  diZdZdedefdZ G d d      Z  G d d      Z! G d de!      Z"y)    N)deque)AnyDequeDictListOptional   )Headers   )QuicFrameTypeQuicPacketTypeQuicStreamFrameQuicTransportParameters)RangeSetinitial	handshake0RTT1RTTretryversion_negotiationz0.3datareturnc                 J    t        j                  |       j                  d      S )Nascii)binasciihexlifydecode)r   s    \/home/ubuntu/.cache/pipx/cdb5059130eadca/lib/python3.12/site-packages/aioquic/quic/logger.pyhexdumpr      s    D!((11    c            
       `   e Zd ZdZdededdfdZdedede	fd	Z
d
edee   dede	fdZdedede	fdZdede	fdZdede	fdZdede	fdZde	fdZdedede	fdZdedededede	f
dZdede	fdZde	fd Zd!ede	fd"Zd!ede	fd#Zde	fd$Zd
ed%edede	fd&Zdede	fd'Zdedede	fd(Zd
edede	fd)Zdedede	fd*Z d+edede	fd,Z!d-edefd.Z"d/ed0e#de	ee$f   fd1Z%d2e&defd3Z'dedede	fd4Z(ded5e)dede	fd6Z*ded5e)d7edede	f
d8Z+d5e)de,e	   fd9Z-d:ed;ed!e	ddfd<Z.de	ee$f   fd=Z/y)>QuicLoggerTraceaE  
    A QUIC event trace.

    Events are logged in the format defined by qlog.

    See:
    - https://datatracker.ietf.org/doc/html/draft-ietf-quic-qlog-main-schema-02
    - https://datatracker.ietf.org/doc/html/draft-marx-quic-qlog-quic-events
    - https://datatracker.ietf.org/doc/html/draft-marx-quic-qlog-h3-events
    	is_clientodcidr   Nc                L    || _         t               | _        d|rdndd| _        y )Naioquicclientserver)nametype)_odcidr   _events_vantage_point)selfr#   r$   s      r   __init__zQuicLoggerTrace.__init__,   s&    .3g )Hx
r    rangesdelayc                     | j                  |      |D cg c]  }|j                  |j                  dz
  g c}ddS c c}w )Nr   ack)	ack_delayacked_ranges
frame_type)encode_timestartstop)r.   r0   r1   xs       r   encode_ack_framez QuicLoggerTrace.encode_ack_frame6   s?    ))%0<BCqaggqvvz2C
 	
Cs   "=
error_coder6   reason_phrasec                 ,    ||dndd||d}|||d<   |S )Napplication	transportconnection_close)r<   error_spacer6   raw_error_codereasontrigger_frame_type )r.   r<   r6   r=   attrss        r   encode_connection_close_framez-QuicLoggerTrace.encode_connection_close_frame=   s9     %,6,>=K,(#
 !*4E&'r    maximumc                 l    |t         j                  k(  rd|dS d||t         j                  k(  rddS ddS )Nmax_data)r6   rI   max_streamsunidirectionalbidirectional)r6   rI   stream_type)r   MAX_DATAMAX_STREAMS_UNI)r.   r6   rI   s      r   encode_connection_limit_framez-QuicLoggerTrace.encode_connection_limit_frameL   sO    ///",AA ,"!>!>>  0 
 % r    framec                 H    dt        |j                        |j                  dS )Ncrypto)r6   lengthoffset)lenr   rW   )r.   rS   s     r   encode_crypto_framez#QuicLoggerTrace.encode_crypto_frameX   s!    "%**oll
 	
r    limitc                     d|dS )Ndata_blocked)r6   rZ   rF   )r.   rZ   s     r   encode_data_blocked_framez)QuicLoggerTrace.encode_data_blocked_frame_   s    ,u==r    rV   c                     d|dS )Ndatagram)r6   rV   rF   )r.   rV   s     r   encode_datagram_framez%QuicLoggerTrace.encode_datagram_frameb   s    (F;;r    c                 
    ddiS )Nr6   handshake_donerF   r.   s    r   encode_handshake_done_framez+QuicLoggerTrace.encode_handshake_done_framee   s    .//r    	stream_idc                     d||dS )Nmax_stream_data)r6   rI   re   rF   )r.   rI   re   s      r   encode_max_stream_data_framez,QuicLoggerTrace.encode_max_stream_data_frameh   s    +"
 	
r    connection_idretire_prior_tosequence_numberstateless_reset_tokenc                 J    t        |      dt        |      t        |      ||dS )Nnew_connection_id)ri   r6   rV   reset_tokenrj   rk   )r   rX   )r.   ri   rj   rk   rl   s        r   encode_new_connection_id_framez.QuicLoggerTrace.encode_new_connection_id_frameo   s0     %]3--("#89..
 	
r    tokenc                 2    dt        |      t        |      dS )N	new_token)r6   rV   rq   )rX   r   )r.   rq   s     r   encode_new_token_framez&QuicLoggerTrace.encode_new_token_frame   s    %%jU^
 	
r    c                 
    ddiS )Nr6   paddingrF   rc   s    r   encode_padding_framez$QuicLoggerTrace.encode_padding_frame   s    i((r    r   c                     t        |      ddS )Npath_challenger   r6   r   r.   r   s     r   encode_path_challenge_framez+QuicLoggerTrace.encode_path_challenge_frame   s    5EFFr    c                     t        |      ddS )Npath_responserz   r{   r|   s     r   encode_path_response_framez*QuicLoggerTrace.encode_path_response_frame   s    _EEr    c                 
    ddiS )Nr6   pingrF   rc   s    r   encode_ping_framez!QuicLoggerTrace.encode_ping_frame   s    f%%r    
final_sizec                     ||d|dS )Nreset_stream)r<   r   r6   re   rF   )r.   r<   r   re   s       r   encode_reset_stream_framez)QuicLoggerTrace.encode_reset_stream_frame   s     %$("	
 	
r    c                     d|dS )Nretire_connection_id)r6   rk   rF   )r.   rk   s     r   !encode_retire_connection_id_framez1QuicLoggerTrace.encode_retire_connection_id_frame   s    0.
 	
r    c                     d||dS )Nstream_data_blocked)r6   rZ   re   rF   )r.   rZ   re   s      r    encode_stream_data_blocked_framez0QuicLoggerTrace.encode_stream_data_blocked_frame   s    /"
 	
r    c                     d||dS )Nstop_sending)r6   r<   re   rF   )r.   r<   re   s      r   encode_stop_sending_framez)QuicLoggerTrace.encode_stop_sending_frame   s    ($"
 	
r    c                 `    |j                   dt        |j                        |j                  |dS )Nstream)finr6   rV   rW   re   )r   rX   r   rW   )r.   rS   re   s      r   encode_stream_framez#QuicLoggerTrace.encode_stream_frame   s+    99"%**oll"
 	
r    is_unidirectionalc                     d||rddS ddS )Nstreams_blockedrM   rN   )r6   rZ   rO   rF   )r.   r   rZ   s      r   encode_streams_blocked_framez,QuicLoggerTrace.encode_streams_blocked_frame   s)    +/@+
 	
 GV
 	
r    secondsc                     |dz  S )z1
        Convert a time to milliseconds.
        i  rF   )r.   r   s     r   r7   zQuicLoggerTrace.encode_time   s     ~r    owner
parametersc                     d|i}|j                   j                         D ]P  \  }}t        |t              r|||<   t        |t              rt        |      ||<   ;t        |t              sL|||<   R |S )Nr   )__dict__items
isinstanceboolbytesr   int)r.   r   r   r   
param_nameparam_values         r   encode_transport_parametersz+QuicLoggerTrace.encode_transport_parameters   sy     !(/'1':':'@'@'B 	/#J+t,#.Z K/#*;#7Z K-#.Z 	/ r    packet_typec                     t         |   S N)PACKET_TYPE_NAMES)r.   r   s     r   r   zQuicLoggerTrace.packet_type   s     --r    c                     ddi||dS )Nr6   r   rS   rV   re   rF   )r.   rV   re   s      r   encode_http3_data_framez'QuicLoggerTrace.encode_http3_data_frame   s    "F+"
 	
r    headersc                 2    d| j                  |      d||dS )Nr   )r6   r   r   _encode_http3_headers)r.   rV   r   re   s       r   encode_http3_headers_framez*QuicLoggerTrace.encode_http3_headers_frame   s,    
 (55g> "
 	
r    push_idc                 4    d| j                  |      |d||dS )Npush_promise)r6   r   r   r   r   )r.   rV   r   r   re   s        r   encode_http3_push_promise_framez/QuicLoggerTrace.encode_http3_push_promise_frame   s/    
 -55g>"
 "
 	
r    c                 z    |D cg c]+  }|d   j                  d      |d   j                  d      d- c}S c c}w )Nr   utf8r   )r)   value)r   )r.   r   hs      r   r   z%QuicLoggerTrace._encode_http3_headers   s>    QX
LMQqT[[(1Q4;;v3FG
 	
 
s   08categoryeventc                    | j                   j                  ||dz   |z   | j                  t        j                               d       y )N:)r   r)   time)r,   appendr7   r   )r.   r   r   r   s       r   	log_eventzQuicLoggerTrace.log_event   s<     3.((5	
r    c                 r    dt        | j                        it        | j                        | j                  dS )zP
        Return the trace as a dictionary which can be written as JSON.
        ODCID)common_fieldseventsvantage_point)r   r+   listr,   r-   rc   s    r   to_dictzQuicLoggerTrace.to_dict  s8     - 4<<(!00
 	
r    )0__name__
__module____qualname____doc__r   r   r/   r   floatr   r;   r   r   strrH   rR   r   rY   r]   r`   rd   rh   rp   rt   rw   r}   r   r   r   r   r   r   r   r   r7   r   r   r   r   r   r   r
   r   r   r   r   r   r   rF   r    r   r"   r"       s   	
T 
% 
D 

x 
 
$ 
+3C=IL	
 
c 
d 

 
T 
>s >t ><C <D <0T 0
C 
C 
D 


 
 	

  %
 

 
E 
d 
)d )G G$ GFu F F&4 &

+.
;>
	

 
 

c 
c 
d 

C 
C 
D 

 
S 
T 

d 
3 
SW 
5 U &=	c3h.~ .# .

c 
c 
d 




$+

8;

	



$+
69
FI
	

W 
d 

S 
 
D 
T 


c3h 

r    r"   c                   R    e Zd ZdZddZdededefdZdeddfd	Z	de
eef   fd
Zy)
QuicLoggerz<
    A QUIC event logger which stores traces in memory.
    r   Nc                     g | _         y r   _tracesrc   s    r   r/   zQuicLogger.__init__  s	    .0r    r#   r$   c                 V    t        ||      }| j                  j                  |       |S )N)r#   r$   )r"   r   r   )r.   r#   r$   traces       r   start_tracezQuicLogger.start_trace  s%    )5AE"r    r   c                 .    || j                   v sJ d       y )Nz-QuicLoggerTrace does not belong to QuicLoggerr   r.   r   s     r   	end_tracezQuicLogger.end_trace"  s    $U&UU$r    c                 l    dt         | j                  D cg c]  }|j                          c}dS c c}w )zQ
        Return the traces as a dictionary which can be written as JSON.
        JSONqlog_formatqlog_versiontraces)QLOG_VERSIONr   r   r   s     r   r   zQuicLogger.to_dict%  s2    
 "(48LLA5u}}A
 	
 Bs   1)r   N)r   r   r   r   r/   r   r   r"   r   r   r   r   r   r   rF   r    r   r   r     sP    1T % O 
V V4 V
c3h 
r    r   c                   <     e Zd ZdZdeddf fdZdeddfdZ xZS )QuicFileLoggerz>
    A QUIC event logger which writes one trace per file.
    pathr   Nc                     t         j                  j                  |      st        d|z        || _        t        |           y )Nz-QUIC log output directory '%s' does not exist)osr   isdir
ValueErrorsuperr/   )r.   r   	__class__s     r   r/   zQuicFileLogger.__init__5  s6    ww}}T"LtSTT	r    r   c                 @   |j                         }t        j                  j                  | j                  |d   d   dz         }t	        |d      5 }t        j                  dt        |gd|       d d d        | j                  j                  |       y # 1 sw Y   %xY w)Nr   r   z.qlogwr   r   )
r   r   r   joinopenjsondumpr   r   remove)r.   r   
trace_dict
trace_path	logger_fps        r   r   zQuicFileLogger.end_trace;  s    ]]_
WW\\IIz/27;gE

 *c" 	iII#)$0)l
 	 	E"	 	s    BB)	r   r   r   r   r   r/   r"   r   __classcell__)r   s   @r   r   r   0  s.    S T # #4 #r    r   )#r   r   r   r   collectionsr   typingr   r   r   r   r   	h3.eventsr
   packetr   r   r   r   rangesetr   INITIAL	HANDSHAKEZERO_RTTONE_RTTRETRYVERSION_NEGOTIATIONr   r   r   r   r   r"   r   r   rF   r    r   <module>r      s      	   3 3    IkVF'&&(=  2% 2C 2r
 r
j
 
6#Z #r    