
    @OOf(              
           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mZmZmZmZmZ ddlmZ ed	ed
edede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   )	PACKET_TYPE_HANDSHAKEPACKET_TYPE_INITIALPACKET_TYPE_MASKPACKET_TYPE_ONE_RTTPACKET_TYPE_RETRYPACKET_TYPE_ZERO_RTTQuicFrameTypeQuicStreamFrameQuicTransportParameters)RangeSetinitial	handshake0RTT1RTTretryz0.3datareturnc                 J    t        j                  |       j                  d      S )Nascii)binasciihexlifydecode)r   s    T/var/www/premiumrankchecker/venv/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__0   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)r2   r4   r5   xs       r"   encode_ack_framez QuicLoggerTrace.encode_ack_frame:   s?    ))%0<BCqaggqvvz2C
 	
Cs   "=
error_coder:   reason_phrasec                 ,    ||dndd||d}|||d<   |S )Napplication	transportconnection_close)r@   error_spacer:   raw_error_codereasontrigger_frame_type )r2   r@   r:   rA   attrss        r"   encode_connection_close_framez-QuicLoggerTrace.encode_connection_close_frameA   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)r:   rM   max_streamsunidirectionalbidirectional)r:   rM   stream_type)r   MAX_DATAMAX_STREAMS_UNI)r2   r:   rM   s      r"   encode_connection_limit_framez-QuicLoggerTrace.encode_connection_limit_frameP   sO    ///",AA ,"!>!>>  0 
 % r$   framec                 H    dt        |j                        |j                  dS )Ncrypto)r:   lengthoffset)lenr   r[   )r2   rW   s     r"   encode_crypto_framez#QuicLoggerTrace.encode_crypto_frame\   s!    "%**oll
 	
r$   limitc                     d|dS )Ndata_blocked)r:   r^   rJ   )r2   r^   s     r"   encode_data_blocked_framez)QuicLoggerTrace.encode_data_blocked_framec   s    ,u==r$   rZ   c                     d|dS )Ndatagram)r:   rZ   rJ   )r2   rZ   s     r"   encode_datagram_framez%QuicLoggerTrace.encode_datagram_framef   s    (F;;r$   c                 
    ddiS )Nr:   handshake_donerJ   r2   s    r"   encode_handshake_done_framez+QuicLoggerTrace.encode_handshake_done_framei   s    .//r$   	stream_idc                     d||dS )Nmax_stream_data)r:   rM   ri   rJ   )r2   rM   ri   s      r"   encode_max_stream_data_framez,QuicLoggerTrace.encode_max_stream_data_framel   s    +"
 	
r$   connection_idretire_prior_tosequence_numberstateless_reset_tokenc                 J    t        |      dt        |      t        |      ||dS )Nnew_connection_id)rm   r:   rZ   reset_tokenrn   ro   )r#   r\   )r2   rm   rn   ro   rp   s        r"   encode_new_connection_id_framez.QuicLoggerTrace.encode_new_connection_id_frames   s0     %]3--("#89..
 	
r$   tokenc                 2    dt        |      t        |      dS )N	new_token)r:   rZ   ru   )r\   r#   )r2   ru   s     r"   encode_new_token_framez&QuicLoggerTrace.encode_new_token_frame   s    %%jU^
 	
r$   c                 
    ddiS )Nr:   paddingrJ   rg   s    r"   encode_padding_framez$QuicLoggerTrace.encode_padding_frame   s    i((r$   r   c                     t        |      ddS )Npath_challenger   r:   r#   r2   r   s     r"   encode_path_challenge_framez+QuicLoggerTrace.encode_path_challenge_frame   s    5EFFr$   c                     t        |      ddS )Npath_responser~   r   r   s     r"   encode_path_response_framez*QuicLoggerTrace.encode_path_response_frame   s    _EEr$   c                 
    ddiS )Nr:   pingrJ   rg   s    r"   encode_ping_framez!QuicLoggerTrace.encode_ping_frame   s    f%%r$   
final_sizec                     ||d|dS )Nreset_stream)r@   r   r:   ri   rJ   )r2   r@   r   ri   s       r"   encode_reset_stream_framez)QuicLoggerTrace.encode_reset_stream_frame   s     %$("	
 	
r$   c                     d|dS )Nretire_connection_id)r:   ro   rJ   )r2   ro   s     r"   !encode_retire_connection_id_framez1QuicLoggerTrace.encode_retire_connection_id_frame   s    0.
 	
r$   c                     d||dS )Nstream_data_blocked)r:   r^   ri   rJ   )r2   r^   ri   s      r"    encode_stream_data_blocked_framez0QuicLoggerTrace.encode_stream_data_blocked_frame   s    /"
 	
r$   c                     d||dS )Nstop_sending)r:   r@   ri   rJ   )r2   r@   ri   s      r"   encode_stop_sending_framez)QuicLoggerTrace.encode_stop_sending_frame   s    ($"
 	
r$   c                 `    |j                   dt        |j                        |j                  |dS )Nstream)finr:   rZ   r[   ri   )r   r\   r   r[   )r2   rW   ri   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_blockedrQ   rR   )r:   r^   rS   rJ   )r2   r   r^   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  rJ   )r2   r   s     r"   r;   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)r2   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         j                  |t        z  d      S )Nr   )PACKET_TYPE_NAMESgetr   )r2   r   s     r"   r   zQuicLoggerTrace.packet_type   s     $$[3C%CVLLr$   c                     ddi||dS )Nr:   r   rW   rZ   ri   rJ   )r2   rZ   ri   s      r"   encode_http3_data_framez'QuicLoggerTrace.encode_http3_data_frame   s    "F+"
 	
r$   headersc                 2    d| j                  |      d||dS )Nr   )r:   r   r   _encode_http3_headers)r2   rZ   r   ri   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)r:   r   r   r   r   )r2   rZ   r   r   ri   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!   )r2   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)r0   appendr;   r   )r2   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/   listr0   r1   rg   s    r"   to_dictzQuicLoggerTrace.to_dict  s8     - 4<<(!00
 	
r$   )/__name__
__module____qualname____doc__r   r   r3   r   floatr   r?   r   r   strrL   rV   r   r]   ra   rd   rh   rl   rt   rx   r{   r   r   r   r   r   r   r   r   r   r;   r   r   r   r   r   r
   r   r   r   r   r   r   rJ   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Ms Ms M

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 )N_tracesrg   s    r"   r3   zQuicLogger.__init__  s	    .0r$   r'   r(   c                 V    t        ||      }| j                  j                  |       |S )N)r'   r(   )r&   r   r   )r2   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   r2   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   r3   r   r   r&   r   r   r   r   r   r   rJ   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superr3   )r2   r   	__class__s     r"   r3   zQuicFileLogger.__init__9  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)r2   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   r3   r&   r   __classcell__)r   s   @r"   r   r   4  s.    S T # #4 #r$   r   )"r   r   r   r   collectionsr   typingr   r   r   r   r   	h3.eventsr
   packetr   r   r   r   r   r   r   r   r   rangesetr   r   r   r   r   r#   r&   r   r   rJ   r$   r"   <module>r      s      	   3 3 
 
 
  ;&w  2% 2C 2r
 r
j
 
6#Z #r$   