a
    PҚhi*                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	 d dl
Zd dlZd dlZd dlZd dlZdZdZed ZG dd deZG dd	 d	ZG d
d dZG dd dZG dd deZG dd dZG dd deZdS )    N)AnyOptionali         c                   @   s   e Zd ZdS )UnexpectedEOFN)__name__
__module____qualname__ r
   r
   K/wd/webapps/venvs/v2025_4um/lib/python3.9/site-packages/dns/quic/_common.pyr      s   r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )Bufferc                 C   s   d| _ d| _d S )N    F)_buffer	_seen_endselfr
   r
   r   __init__   s    zBuffer.__init__c                 C   s&   | j r
d S |  j|7  _|r"d| _ d S )NT)r   r   r   datais_endr
   r
   r   put#   s
    z
Buffer.putc                 C   s    t | j|krdS | jrtdS )NTF)lenr   r   r   )r   amountr
   r
   r   have*   s
    zBuffer.havec                 C   s   | j S N)r   r   r
   r
   r   seen_end1   s    zBuffer.seen_endc                 C   s0   |  |sJ | jd | }| j|d  | _|S r   )r   r   )r   r   r   r
   r
   r   get4   s    z
Buffer.getc                 C   s   |   sJ | j}d| _|S )Nr   )r   r   )r   r   r
   r
   r   get_all:   s    zBuffer.get_allN)	r   r   r	   r   r   r   r   r   r   r
   r
   r
   r   r      s   r   c                   @   s^   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdddZ	dd Z
dd Zdd ZdS )BaseQuicStreamc                 C   s*   || _ || _t | _d| _d | _d | _d S Nr   )_connection
_stream_idr   r   
_expecting_headers	_trailers)r   
connection	stream_idr
   r
   r   r   B   s    zBaseQuicStream.__init__c                 C   s   | j S r   )r!   r   r
   r
   r   idJ   s    zBaseQuicStream.idc                 C   s   | j S r   )r#   r   r
   r
   r   headersM   s    zBaseQuicStream.headersc                 C   s   | j S r   )r$   r   r
   r
   r   trailersP   s    zBaseQuicStream.trailersc                 C   s   |d urt   | }nd }|S r   )time)r   timeout
expirationr
   r
   r   _expiration_from_timeoutS   s    z'BaseQuicStream._expiration_from_timeoutc                 C   s$   |d urt |t  d}nd }|S )Ng        )maxr*   )r   r,   r+   r
   r
   r   _timeout_from_expirationZ   s    z'BaseQuicStream._timeout_from_expirationTc                 C   s   | j  stdtj|}|j }|r2d}nd}|dt	|
d 7 }d|fd|j fd|j fd	|fd
g}|r|ddtt| fg | j | j||  |r| j | j|d d S )Nz%cannot send H3 to a non-H3 connections   POSTs   GETs   ?dns=   =s   :methods   :schemes
   :authoritys   :path)s   accept   application/dns-message)s   content-typer1   s   content-lengthT)r    is_h3SyntaxErrorurllibparseurlparsepathencodebase64urlsafe_b64encoderstripschemenetlocextendstrr   send_headersr!   	send_data)r   urldatagrampostZ	url_partsr7   methodr(   r
   r
   r   send_h3g   s.    

zBaseQuicStream.send_h3c                 C   s&   | j  r|S t|}td|| S )Nz!H)r    r2   r   structpack)r   rC   lr
   r
   r   _encapsulate   s    
zBaseQuicStream._encapsulatec                 C   sJ   | j || z"| jdkr(| j | jp.| j jW S  tyD   Y dS 0 d S )Nr   T)r   r   r"   r   r   r   r   r
   r
   r   _common_add_input   s    z BaseQuicStream._common_add_inputc                 C   s    | j | j | jdd d S )Nr   T)r    close_streamr!   r   r   r   r
   r
   r   _close   s    zBaseQuicStream._closeN)T)r   r   r	   r   r'   r(   r)   r-   r/   rF   rJ   rK   rM   r
   r
   r
   r   r   A   s   
	r   c                   @   sL   e Zd ZdddZdd Zdd Zdd
dZdddZdddZdd Z	dS )BaseQuicConnectionNr   c                 C   s   d| _ || _|| _|| _d| _|| _i | _| rFtj	j
|d| _nd | _tj|| _tj||f| _|d u r|dkr| jtjkrd}n| jtjkrd}nt|r||f| _nd | _d S )NFr   z0.0.0.0z::)Z_doner    Z_addressZ_port_closed_manager_streamsr2   aioquich3r%   ZH3Connection_h3_conndnsinetZaf_for_addressZ_aflow_level_address_tupleZ_peersocketAF_INETAF_INET6NotImplementedError_source)r   r%   addressportsourcesource_portmanagerr
   r
   r   r      s*    	zBaseQuicConnection.__init__c                 C   s
   | j d uS r   )rT   r   r
   r
   r   r2      s    zBaseQuicConnection.is_h3c                 C   s   | j |= d S r   )rQ   )r   r&   r
   r
   r   rL      s    zBaseQuicConnection.close_streamFc                 C   s   | j ||| d S r   )rT   r@   )r   r&   r(   r   r
   r
   r   r@      s    zBaseQuicConnection.send_headersc                 C   s   | j ||| d S r   )rT   rA   )r   r&   r   r   r
   r
   r   rA      s    zBaseQuicConnection.send_dataTc                 C   sL   t   }| j }|d u r"|d }t|| d}| jrD|rDt|d}||fS )Ni  r   g?)r*   r    Z	get_timerr.   rO   min)r   Zclosed_is_specialnowr,   intervalr
   r
   r   _get_timer_values   s    


z$BaseQuicConnection._get_timer_valuesc                 C   s    t   }||kr| j| d S r   )r*   r    Zhandle_timer)r   r,   rc   r
   r
   r   _handle_timer   s    z BaseQuicConnection._handle_timer)Nr   N)F)F)T)
r   r   r	   r   r2   rL   r@   rA   re   rf   r
   r
   r
   r   rN      s      
"


rN   c                   @   s"   e Zd Zdee edddZdS )AsyncQuicConnectionN)r+   returnc                    s   d S r   r
   )r   r+   r
   r
   r   make_stream   s    zAsyncQuicConnection.make_stream)N)r   r   r	   r   floatr   ri   r
   r
   r
   r   rg      s   rg   c                   @   s@   e Zd ZdddZddd	Zd
d Zdd Zdd Zdd ZdS )BaseQuicManagerNFc                 C   s   i | _ || _i | _i | _|| _|d u rvd }t|tr<|}d}|rHdg}nddg}tjj	j
|||d}|d urv|| || _d S )NTrS   Zdoqzdoq-i03)alpn_protocolsverify_modeserver_name)_connections_connection_factory_session_tickets_tokens_h3
isinstancer?   rR   quicconfigurationZQuicConfigurationload_verify_locations_conf)r   confrm   connection_factoryrn   rS   Zverify_pathrl   r
   r
   r   r      s*    

zBaseQuicManager.__init__U  r   Tc                 C   s(  | j ||f}|d ur |dfS | j}|rtz$| j||f}	t|}|	|_W n ty`   Y n0 t	| j
||}
nd }
|rz$| j||f}t|}||_W n ty   Y n0 t	| j||}nd }tjjj||
|d}tj||f}||t  | |||||| }|| j ||f< |dfS )NF)rv   session_ticket_handlertoken_handlerT)ro   r   rx   rq   popcopysession_ticketKeyError	functoolspartialsave_session_ticketrr   token
save_tokenrR   ru   r%   ZQuicConnectionrU   rV   rW   connectr*   rp   )r   r]   r^   r_   r`   Zwant_session_ticketZ
want_tokenr%   ry   r   r|   r   r}   ZqconnZ	lladdressr
   r
   r   _connect   sH    	



zBaseQuicManager._connectc                 C   s(   z| j ||f= W n ty"   Y n0 d S r   )ro   r   )r   r]   r^   r
   r
   r   closed1  s    zBaseQuicManager.closedc                 C   s   | j S r   )rs   r   r
   r
   r   r2   7  s    zBaseQuicManager.is_h3c                 C   sL   t | j}|tkr:t| j dt }|D ]}| j|= q,|| j||f< d S r   )r   rq   MAX_SESSION_TICKETSlistkeysSESSIONS_TO_DELETE)r   r]   r^   ticketrI   keys_to_deletekeyr
   r
   r   r   :  s    

z#BaseQuicManager.save_session_ticketc                 C   sL   t | j}|tkr:t| j dt }|D ]}| j|= q,|| j||f< d S r   )r   rr   r   r   r   r   )r   r]   r^   r   rI   r   r   r
   r
   r   r   E  s    

zBaseQuicManager.save_token)NF)r{   Nr   TT)	r   r   r	   r   r   r   r2   r   r   r
   r
   r
   r   rk      s    
     
8rk   c                   @   s   e Zd ZdddZdS )AsyncQuicManagerr{   Nr   c                 C   s   t d S r   )r[   )r   r]   r^   r_   r`   r
   r
   r   r   R  s    zAsyncQuicManager.connect)r{   Nr   )r   r   r	   r   r
   r
   r
   r   r   Q  s   r   )r9   r   r   rX   rG   r*   r4   typingr   r   Zaioquic.h3.connectionrR   Zaioquic.h3.eventsZaioquic.quic.configurationZaioquic.quic.connectionZdns.inetrU   ZQUIC_MAX_DATAGRAMr   r   	Exceptionr   r   r   rN   rg   rk   r   r
   r
   r
   r   <module>   s,   #VBs