
    gi*                        S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKJrJ	r	  S SK
rS SKrS SKrS SKrS SKrSrSr\S-  r " S S\5      r " S S	5      r " S
 S5      r " S S5      r " S S\5      r " S S5      r " S S\5      rg)    N)AnyOptionali         c                       \ rS rSrSrg)UnexpectedEOF    N)__name__
__module____qualname____firstlineno____static_attributes__r
       I/home/matz/Project1/venv/lib/python3.13/site-packages/dns/quic/_common.pyr   r      s    r   r   c                   8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
Buffer   c                      SU l         SU l        g )Nr   F_buffer	_seen_endselfs    r   __init__Buffer.__init__   s    r   c                 p    U R                   (       a  g U =R                  U-  sl        U(       a  SU l         g g )NT)r   r   r   datais_ends      r   put
Buffer.put#   s)    >>!DN r   c                 f    [        U R                  5      U:  a  gU R                  (       a  [        eg)NTF)lenr   r   r   )r   amounts     r   haveBuffer.have*   s&    t||&>>r   c                     U R                   $ N)r   r   s    r   seen_endBuffer.seen_end1       ~~r   c                 |    U R                  U5      (       d   eU R                  S U nU R                  US  U l        U$ r)   )r&   r   )r   r%   r   s      r   get
Buffer.get4   s>    yy    ||GV$||FG,r   c                 Z    U R                  5       (       d   eU R                  nSU l        U$ )Nr   )r*   r   )r   r   s     r   get_allBuffer.get_all:   s'    }}||r   r   N)r   r   r   r   r   r!   r&   r*   r.   r1   r   r
   r   r   r   r      s     "r   r   c                   T    \ rS rSrS rS rS rS rS rS r	SS jr
S	 rS
 rS rSrg)BaseQuicStreamA   c                 d    Xl         X l        [        5       U l        SU l        S U l        S U l        g Nr   )_connection
_stream_idr   r   
_expecting_headers	_trailers)r   
connection	stream_ids      r   r   BaseQuicStream.__init__B   s+    %#xr   c                     U R                   $ r)   )r9   r   s    r   idBaseQuicStream.idJ   s    r   c                     U R                   $ r)   )r;   r   s    r   headersBaseQuicStream.headersM   s    }}r   c                     U R                   $ r)   )r<   r   s    r   trailersBaseQuicStream.trailersP   r,   r   c                 D    Ub  [         R                   " 5       U-   nU$ S nU$ r)   )time)r   timeout
expirations      r   _expiration_from_timeout'BaseQuicStream._expiration_from_timeoutS   s-    w.J  Jr   c                 X    Ub$  [        U[        R                  " 5       -
  S5      nU$ S nU$ )Ng        )maxrJ   )r   rL   rK   s      r   _timeout_from_expiration'BaseQuicStream._timeout_from_expirationZ   s2    !*tyy{2C8G  Gr   c           	         U R                   R                  5       (       d  [        S5      e[        R                  R                  U5      nUR                  R                  5       nU(       a  SnO-SnUS[        R                  " U5      R                  S5      -   -  nSU4SUR                  R                  5       4SUR                  R                  5       4S	U4S
/nU(       a5  UR                  SS[        [        U5      5      R                  5       4/5        U R                   R!                  U R"                  Xs(       + 5        U(       a(  U R                   R%                  U R"                  US5        g g )Nz%cannot send H3 to a non-H3 connections   POSTs   GETs   ?dns=   =s   :methods   :schemes
   :authoritys   :path)s   accept   application/dns-message)s   content-typerU   s   content-lengthT)r8   is_h3SyntaxErrorurllibparseurlparsepathencodebase64urlsafe_b64encoderstripschemenetlocextendstrr$   send_headersr9   	send_data)r   urldatagrampost	url_partsr[   methodrD   s           r   send_h3BaseQuicStream.send_h3g   s8   %%''EFFLL))#.	~~$$&FFHv77AHHNNND ))0023I,,3356t3
 NNA&CM(:(A(A(CD 	%%doowI&&t$G r   c                     U R                   R                  5       (       a  U$ [        U5      n[        R                  " SU5      U-   $ )Nz!H)r8   rV   r$   structpack)r   rg   ls      r   _encapsulateBaseQuicStream._encapsulate   s;    !!##OM{{4#h..r   c                 
   U R                   R                  X5         U R                  S:  =(       a%    U R                   R                  U R                  5      =(       d    U R                   R                  $ ! [
         a     gf = f)Nr   T)r   r!   r:   r&   r*   r   r   s      r   _common_add_input BaseQuicStream._common_add_input   sh    &	!#J(9(9$//(J'&&'  		s   AA5 5
BBc                     U R                   R                  U R                  5        U R                  R	                  SS5        g )Nr   T)r8   close_streamr9   r   r!   r   s    r   _closeBaseQuicStream._close   s.    %%doo6d#r   )r   r8   r:   r;   r9   r<   NT)r   r   r   r   r   rA   rD   rG   rM   rQ   rk   rq   rt   rx   r   r
   r   r   r4   r4   A   s5    H8/$r   r4   c                   T    \ rS rSr   SS jrS rS rSS jrSS jrSS jr	S	 r
S
rg)BaseQuicConnection   Nc                 X   SU l         Xl        X l        X0l        SU l        X`l        0 U l        UR                  5       (       a0  [        R                  R                  R                  US5      U l        OS U l        [        R                  R                  U5      U l        [        R                  R#                  X#45      U l        UcN  US:w  aH  U R                   [&        R(                  :X  a  SnO'U R                   [&        R*                  :X  a  SnO[,        eU(       a	  XE4U l        g S U l        g )NFr   z0.0.0.0z::)_doner8   _address_port_closed_manager_streamsrV   aioquich3r=   H3Connection_h3_conndnsinetaf_for_address_aflow_level_address_tuple_peersocketAF_INETAF_INET6NotImplementedError_source)r   r=   addressportsourcesource_portmanagers          r   r   BaseQuicConnection.__init__   s     
%
==??#JJ11>>z5QDM DM88**73XX55woF
>kQ.xx6>>)"V__,))"0DLDLr   c                     U R                   S L$ r)   )r   r   s    r   rV   BaseQuicConnection.is_h3   s    }}D((r   c                     U R                   U	 g r)   )r   )r   r>   s     r   rw   BaseQuicConnection.close_stream   s    MM)$r   c                 <    U R                   R                  XU5        g r)   )r   rd   )r   r>   rD   r    s       r   rd   BaseQuicConnection.send_headers   s    ""9v>r   c                 <    U R                   R                  XU5        g r)   )r   re   )r   r>   r   r    s       r   re   BaseQuicConnection.send_data   s    	8r   c                     [         R                   " 5       nU R                  R                  5       nUc  US-   n[        X2-
  S5      nU R                  (       a  U(       a  [        US5      nX44$ )Ni  r   g?)rJ   r8   	get_timerrP   r   min)r   closed_is_specialnowrL   intervals        r   _get_timer_values$BaseQuicConnection._get_timer_values   s`    iik%%//1
tJz'+<<- 8T*H%%r   c                 p    [         R                   " 5       nX::  a  U R                  R                  U5        g g r)   )rJ   r8   handle_timer)r   rL   r   s      r   _handle_timer BaseQuicConnection._handle_timer   s,    iik))#. r   )r   r   r   r8   r   r   r   r   r   r   r   )Nr   N)Frz   )r   r   r   r   r   rV   rw   rd   re   r   r   r   r
   r   r   r|   r|      s1       D)%?9&/r   r|   c                   0    \ rS rSrSS\\   S\4S jjrSrg)AsyncQuicConnection   NrK   returnc                    #    g 7fr)   r
   )r   rK   s     r   make_streamAsyncQuicConnection.make_stream   s     s   r
   r)   )	r   r   r   r   r   floatr   r   r   r
   r   r   r   r      s    % C  r   r   c                   L    \ rS rSr S
S jr     SS jrS rS rS rS r	S	r
g)BaseQuicManager   Nc                 &   0 U l         X0l        0 U l        0 U l        XPl        Ucg  S n[        U[        5      (       a  UnSnU(       a  S/nOSS/n[        R                  R                  R                  UUUS9nUb  UR                  U5        Xl        g )NTr   doqzdoq-i03)alpn_protocolsverify_modeserver_name)_connections_connection_factory_session_tickets_tokens_h3
isinstancerc   r   quicconfigurationQuicConfigurationload_verify_locations_conf)r   confr   connection_factoryr   r   verify_pathr   s           r   r   BaseQuicManager.__init__   s     #5  "<K+s++)""&"'!3<<--??-'' @ D
 &**;7
r   c                 Z   U R                   R                  X45      nUb  US4$ U R                  nU(       a[   U R                  R	                  X45      n	[
        R
                  " U5      nXl        [        R                  " U R                  X5      n
OS n
U(       a[   U R                  R	                  X45      n[
        R
                  " U5      nXl        [        R                  " U R                  X5      nOS n[        R                  R                   R#                  UU
US9n[$        R&                  R)                  X45      nUR+                  U[,        R,                  " 5       5        U R/                  XX#X@5      nXpR                   X4'   US4$ ! [         a     GN)f = f! [         a     Nf = f)NF)r   session_ticket_handlertoken_handlerT)r   r.   r   r   popcopysession_ticketKeyError	functoolspartialsave_session_ticketr   token
save_tokenr   r   r=   QuicConnectionr   r   r   connectrJ   r   )r   r   r   r   r   want_session_ticket
want_tokenr=   r   r   r   r   r   qconn	lladdresss                  r   _connectBaseQuicManager._connect   s    &&**G?;
!&&zz!%!6!6!:!:G?!Kyy&4# &/%6%6(('&" &*"(('9yy"

 &--doowMM M''66#9' 7 

 HH44g_E	i---D+

 .87/*D!!G     s#   8F 8F 
FF
F*)F*c                 B     U R                   X4	 g ! [         a     g f = fr)   )r   r   )r   r   r   s      r   closedBaseQuicManager.closed1  s)    	!!7/2 		s    
c                     U R                   $ r)   )r   r   s    r   rV   BaseQuicManager.is_h37  s    xxr   c                     [        U R                  5      nU[        :  a@  [        U R                  R	                  5       5      S[
         nU H  nU R                  U	 M     X0R                  X4'   g r7   )r$   r   MAX_SESSION_TICKETSlistkeysSESSIONS_TO_DELETE)r   r   r   ticketrp   keys_to_deletekeys          r   r   #BaseQuicManager.save_session_ticket:  sf     %%&##!$"7"7"<"<">?BTUN%))#. &17wo.r   c                     [        U R                  5      nU[        :  a@  [        U R                  R	                  5       5      S[
         nU H  nU R                  U	 M     X0R                  X4'   g r7   )r$   r   r   r   r   r   )r   r   r   r   rp   r   r   s          r   r   BaseQuicManager.save_tokenE  s^     ##!$,,"3"3"56q9KLN%LL% &(-g_%r   )r   r   r   r   r   r   )NF)U  Nr   TT)r   r   r   r   r   r   r   rV   r   r   r   r
   r   r   r   r      s5    JO:  6"p	8	.r   r   c                       \ rS rSrSS jrSrg)AsyncQuicManageriQ  Nc                     [         er)   )r   )r   r   r   r   r   s        r   r   AsyncQuicManager.connectR  s    !!r   r
   )r   Nr   )r   r   r   r   r   r   r
   r   r   r   r   Q  s    "r   r   )r]   r   r   r   rn   rJ   rX   typingr   r   aioquic.h3.connectionr   aioquic.h3.eventsaioquic.quic.configurationaioquic.quic.connectiondns.inetr   QUIC_MAX_DATAGRAMr   r   	Exceptionr   r   r4   r|   r   r   r   r
   r   r   <module>r      s               !     )A- 	I 	   FS$ S$l?/ ?/D, 
p. p.f" "r   