
    mbi(                    .   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mZmZmZ ej        d
ej        dej        dej        dej        dej        diZdZddZ G d d          Z G d d          Z G d de          ZdS )    )annotationsN)deque)Any   )RangeSet)Headers   )QuicFrameTypeQuicPacketTypeQuicStreamFrameQuicTransportParametersinitial	handshake0RTT1RTTretryversion_negotiationz0.3databytesreturnstrc                P    t          j        |                               d          S )Nascii)binasciihexlifydecode)r   s    _/var/www/html/mdtn/previsions/meteo_cartes/venv/lib/python3.11/site-packages/qh3/quic/logger.pyhexdumpr      s!    D!!((111    c                     e Zd ZdZdMdZdNdZdOdZdPdZdQdZdRdZ	dSdZ
dTdZdUd!ZdVd&ZdWd(ZdTd)ZdXd+ZdXd,ZdTd-ZdYd/ZdZd0Zd[d1Zd\d2Zd]d3Zd^d5Zd_d7Zd`d<Zdad?Zdbd@ZdcdCZdddEZdedGZdfdJZ dgdKZ!dLS )h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boolodcidr   r   Nonec               V    || _         t                      | _        d|rdndd| _        d S )Nqh3clientserver)nametype)_odcidr   _events_vantage_point)selfr"   r$   s      r   __init__zQuicLoggerTrace.__init__.   s8    .3gg )7HHx
 
r   rangesr   delayfloatdictc                H    |                      |          d |D             ddS )Nc                4    g | ]}|d          |d         dz
  gS )r   r	    ).0xs     r   
<listcomp>z4QuicLoggerTrace.encode_ack_frame.<locals>.<listcomp>;   s)    >>>!adAaD1H->>>r   ack)	ack_delayacked_ranges
frame_type)encode_time)r/   r1   r2   s      r   encode_ack_framez QuicLoggerTrace.encode_ack_frame8   s6    ))%00>>v>>>
 
 	
r   
error_codeintr>   
int | Nonereason_phraser   c                ,    ||dndd||d}|||d<   |S )Napplication	transportconnection_close)rA   error_spacer>   raw_error_codereasontrigger_frame_typer7   )r/   rA   r>   rD   attrss        r   encode_connection_close_framez-QuicLoggerTrace.encode_connection_close_frame?   s@     %,6,>==K,(#
 
 !*4E&'r   maximumc                \    |t           j        k    rd|dS d||t           j        k    rdnddS )Nmax_data)r>   rO   max_streamsunidirectionalbidirectional)r>   rO   stream_type)r
   MAX_DATAMAX_STREAMS_UNI)r/   r>   rO   s      r   encode_connection_limit_framez-QuicLoggerTrace.encode_connection_limit_frameN   sP    ///",AAA ," "]%BBB %$(  r   framer   c                <    dt          |j                  |j        dS )Ncrypto)r>   lengthoffset)lenr   r]   )r/   rY   s     r   encode_crypto_framez#QuicLoggerTrace.encode_crypto_frame\   s$    "%*ool
 
 	
r   limitc                    d|dS )Ndata_blocked)r>   r`   r7   )r/   r`   s     r   encode_data_blocked_framez)QuicLoggerTrace.encode_data_blocked_framec   s    ,u===r   r\   c                    d|dS )Ndatagram)r>   r\   r7   )r/   r\   s     r   encode_datagram_framez%QuicLoggerTrace.encode_datagram_framef   s    (F;;;r   c                
    ddiS )Nr>   handshake_doner7   r/   s    r   encode_handshake_done_framez+QuicLoggerTrace.encode_handshake_done_framei   s    .//r   	stream_idc                    d||dS )Nmax_stream_data)r>   rO   rk   r7   )r/   rO   rk   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                b    t          |          dt          |          t          |          ||dS )Nnew_connection_id)ro   r>   r\   reset_tokenrp   rq   )r   r^   )r/   ro   rp   rq   rr   s        r   encode_new_connection_id_framez.QuicLoggerTrace.encode_new_connection_id_frames   s>     %]33--(("#899..
 
 	
r   tokenc                B    dt          |          t          |          dS )N	new_token)r>   r\   rw   )r^   r   )r/   rw   s     r   encode_new_token_framez&QuicLoggerTrace.encode_new_token_frame   s&    %%jjU^^
 
 	
r   c                
    ddiS )Nr>   paddingr7   ri   s    r   encode_padding_framez$QuicLoggerTrace.encode_padding_frame   s    i((r   r   c                &    t          |          ddS )Npath_challenger   r>   r   r/   r   s     r   encode_path_challenge_framez+QuicLoggerTrace.encode_path_challenge_frame   s    5EF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EEr   c                
    ddiS )Nr>   pingr7   ri   s    r   encode_ping_framez!QuicLoggerTrace.encode_ping_frame   s    f%%r   
final_sizec                    ||d|dS )Nreset_stream)rA   r   r>   rk   r7   )r/   rA   r   rk   s       r   encode_reset_stream_framez)QuicLoggerTrace.encode_reset_stream_frame   s     %$("	
 
 	
r   c                    d|dS )Nretire_connection_id)r>   rq   r7   )r/   rq   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`   rk   r7   )r/   r`   rk   s      r    encode_stream_data_blocked_framez0QuicLoggerTrace.encode_stream_data_blocked_frame   s    /"
 
 	
r   c                    d||dS )Nstop_sending)r>   rA   rk   r7   )r/   rA   rk   s      r   encode_stop_sending_framez)QuicLoggerTrace.encode_stop_sending_frame   s    ($"
 
 	
r   c                J    |j         dt          |j                  |j        |dS )Nstream)finr>   r\   r]   rk   )r   r^   r   r]   )r/   rY   rk   s      r   encode_stream_framez#QuicLoggerTrace.encode_stream_frame   s,    9"%*ool"
 
 	
r   is_unidirectionalc                    d||rdnddS )Nstreams_blockedrS   rT   )r>   r`   rU   r7   )r/   r   r`   s      r   encode_streams_blocked_framez,QuicLoggerTrace.encode_streams_blocked_frame   s%    +/@U++o
 
 	
r   secondsc                    |dz  S )z1
        Convert a time to milliseconds.
        i  r7   )r/   r   s     r   r?   zQuicLoggerTrace.encode_time   s     ~r   owner
parametersr   dict[str, Any]c                   d|i}|j                                         D ]b\  }}t          |t                    r|||<    t          |t                    rt          |          ||<   Ht          |t                    r|||<   c|S )Nr   )__dict__items
isinstancer#   r   r   rB   )r/   r   r   r   
param_nameparam_values         r   encode_transport_parametersz+QuicLoggerTrace.encode_transport_parameters   s     !(/'1':'@'@'B'B 	/ 	/#J+t,, /#.Z  K// /#*;#7#7Z  K-- /#.Z r   packet_typer   c                    t           |         S N)PACKET_TYPE_NAMES)r/   r   s     r   r   zQuicLoggerTrace.packet_type   s     --r   c                    ddi||dS )Nr>   r   rY   r\   rk   r7   )r/   r\   rk   s      r   encode_http3_data_framez'QuicLoggerTrace.encode_http3_data_frame   s    "F+"
 
 	
r   headersr   c                :    d|                      |          d||dS )Nr   )r>   r   r   _encode_http3_headers)r/   r\   r   rk   s       r   encode_http3_headers_framez*QuicLoggerTrace.encode_http3_headers_frame   s9    
 (55g>>  "
 
 	
r   push_idc                <    d|                      |          |d||dS )Npush_promise)r>   r   r   r   r   )r/   r\   r   r   rk   s        r   encode_http3_push_promise_framez/QuicLoggerTrace.encode_http3_push_promise_frame   s<    
 -55g>>" 
 "
 
 	
r   
list[dict]c                    d |D             S )Nc                |    g | ]9}|d                               d          |d                              d          d:S )r   utf8r	   )r*   value)r   )r8   hs     r   r:   z9QuicLoggerTrace._encode_http3_headers.<locals>.<listcomp>   sM     
 
 
LMQqT[[((1Q4;;v3F3FGG
 
 
r   r7   )r/   r   s     r   r   z%QuicLoggerTrace._encode_http3_headers   s#    
 
QX
 
 
 	
r   categoryeventc                   | j                             ||dz   |z   |                     t          j                              d           d S )N:)r   r*   time)r-   appendr?   r   )r/   r   r   r   s       r   	log_eventzQuicLoggerTrace.log_event  sV     3.((55 	
 	
 	
 	
 	
r   c                d    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.   ri   s    r   to_dictzQuicLoggerTrace.to_dict  s<     -- 4<((!0
 
 	
r   N)r"   r#   r$   r   r   r%   )r1   r   r2   r3   r   r4   )rA   rB   r>   rC   rD   r   r   r4   )r>   rB   rO   rB   r   r4   )rY   r   r   r4   )r`   rB   r   r4   )r\   rB   r   r4   )r   r4   )rO   rB   rk   rB   r   r4   )
ro   r   rp   rB   rq   rB   rr   r   r   r4   )rw   r   r   r4   )r   r   r   r4   )rA   rB   r   rB   rk   rB   r   r4   )rq   rB   r   r4   )r`   rB   rk   rB   r   r4   )rA   rB   rk   rB   r   r4   )rY   r   rk   rB   r   r4   )r   r#   r`   rB   r   r4   )r   r3   r   r3   )r   r   r   r   r   r   )r   r   r   r   )r\   rB   rk   rB   r   r4   )r\   rB   r   r   rk   rB   r   r4   )
r\   rB   r   r   r   rB   rk   rB   r   r4   )r   r   r   r   )r   r   r   r   r   r4   r   r%   r   r   )"__name__
__module____qualname____doc__r0   r@   rN   rX   r_   rc   rf   rj   rn   rv   rz   r}   r   r   r   r   r   r   r   r   r   r?   r   r   r   r   r   r   r   r   r7   r   r   r!   r!   "   s~       	 	
 
 
 

 
 
 
      
 
 
 
> > > >< < < <0 0 0 0
 
 
 

 
 
 
 
 
 
 
) ) ) )G G G GF F F F& & & &
 
 
 

 
 
 

 
 
 

 
 
 

 
 
 

 
 
 
      . . . .

 
 
 


 

 

 


 
 
 

 
 
 

 
 
 


 

 

 

 

 

r   r!   c                  2    e Zd ZdZddZdd
ZddZddZdS )
QuicLoggerz<
    A QUIC event logger which stores traces in memory.
    r   r%   c                    g | _         d S r   _tracesri   s    r   r0   zQuicLogger.__init__  s    .0r   r"   r#   r$   r   r!   c                \    t          ||          }| j                            |           |S )N)r"   r$   )r!   r   r   )r/   r"   r$   traces       r   start_tracezQuicLogger.start_trace!  s/    )5AAAE"""r   r   c                ,    || j         v s
J d            d S )Nz-QuicLoggerTrace does not belong to QuicLoggerr   )r/   r   s     r   	end_tracezQuicLogger.end_trace&  s$    $$$&U$$$$$r   r   c                6    dt           d | j        D             dS )zQ
        Return the traces as a dictionary which can be written as JSON.
        JSONc                6    g | ]}|                                 S r7   )r   )r8   r   s     r   r:   z&QuicLogger.to_dict.<locals>.<listcomp>0  s     AAA5u}}AAAr   qlog_formatqlog_versiontraces)QLOG_VERSIONr   ri   s    r   r   zQuicLogger.to_dict)  s,    
 "(AADLAAA
 
 	
r   N)r   r%   )r"   r#   r$   r   r   r!   r   r!   r   r%   r   )r   r   r   r   r0   r   r   r   r7   r   r   r   r     sr         1 1 1 1   
V V V V
 
 
 
 
 
r   r   c                  ,     e Zd ZdZd
 fdZdd	Z xZS )QuicFileLoggerz>
    A QUIC event logger which writes one trace per file.
    pathr   r   r%   c                    t           j                            |          st          d| d          || _        t	                                                       d S )NzQUIC log output directory 'z' does not exist)osr   isdir
ValueErrorsuperr0   )r/   r   	__class__s     r   r0   zQuicFileLogger.__init__9  sW    w}}T"" 	SQ4QQQRRR	r   r   r!   c                X   |                                 }t          j                            | j        |d         d         dz             }t	          |d          5 }t          j        dt          |gd|           d d d            n# 1 swxY w Y   | j        	                    |           d S )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    ]]__
W\\Iz/27;gE
 

 *c"" 	iI#)$0)l 
   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	E"""""s    BB	B	)r   r   r   r%   r   )r   r   r   r   r0   r   __classcell__)r   s   @r   r   r   4  s[              # # # # # # # #r   r   )r   r   r   r   )
__future__r   r   r   r   r   collectionsr   typingr   _hazmatr   	h3.eventsr   packetr
   r   r   r   INITIAL	HANDSHAKEZERO_RTTONE_RTTRETRYVERSION_NEGOTIATIONr   r   r   r!   r   r   r7   r   r   <module>r     s   " " " " " "   				                                     IkVF'&(=  2 2 2 2t
 t
 t
 t
 t
 t
 t
 t
n
 
 
 
 
 
 
 
6# # # # #Z # # # # #r   