o
    Rfr                     @   s   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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
   I/home/ubuntu/webapp/venv/lib/python3.10/site-packages/dns/quic/_common.pyr      s    r   c                   @   s4   e Z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 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      | j S N)r   r   r
   r
   r   seen_end-      zBuffer.seen_endc                 C   s0   |  |sJ | jd | }| j|d  | _|S r   )r   r   )r   r   r   r
   r
   r   get0   s   z
Buffer.getN)r   r   r	   r   r   r   r   r   r
   r
   r
   r   r      s    r   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )BaseQuicStreamc                 C   s   || _ || _t | _d| _d S Nr   )_connection
_stream_idr   r   
_expecting)r   
connection	stream_idr
   r
   r   r   8   s   
zBaseQuicStream.__init__c                 C   r   r   )r"   r   r
   r
   r   id>   r   zBaseQuicStream.idc                 C   s    |d urt   | }|S d }|S r   )time)r   timeout
expirationr
   r
   r   _expiration_from_timeoutA   s
   z'BaseQuicStream._expiration_from_timeoutc                 C   s&   |d urt |t  d}|S d }|S )Ng        )maxr'   )r   r)   r(   r
   r
   r   _timeout_from_expirationH   s
   z'BaseQuicStream._timeout_from_expirationc                 C   s   t |}td|| S )Nz!H)r   structpack)r   datagramlr
   r
   r   _encapsulateR   s   zBaseQuicStream._encapsulatec                 C   s>   | j || z| jdko| j | jW S  ty   Y dS w )Nr   T)r   r   r#   r   r   r   r
   r
   r   _common_add_inputV   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)
r   r   r	   r   r&   r*   r,   r1   r2   r4   r
   r
   r
   r   r   7   s    
r   c                   @   s2   e Zd Z	dddZdd Zddd	Zd
d ZdS )BaseQuicConnectionNr   c                 C   s   d| _ || _|| _|| _d| _|| _i | _tj	|| _
tj||f| _|d u rA|dkrA| j
tjkr6d}n| j
tjkr?d}nt|rJ||f| _d S d | _d S )NFr   z0.0.0.0z::)_doner!   _address_port_closed_manager_streams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managerr
   r
   r   r   c   s$   
zBaseQuicConnection.__init__c                 C   s   | j |= d S r   )r;   )r   r%   r
   r
   r   r3   {   s   zBaseQuicConnection.close_streamTc                 C   sL   t   }| j }|d u r|d }t|| d}| jr"|r"t|d}||fS )Ni  r   g?)r'   r!   	get_timerr+   r9   min)r   closed_is_specialnowr)   intervalr
   r
   r   _get_timer_values~   s   


z$BaseQuicConnection._get_timer_valuesc                 C   s$   t   }||kr| j| d S d S r   )r'   r!   handle_timer)r   r)   rO   r
   r
   r   _handle_timer   s   z BaseQuicConnection._handle_timer)Nr   N)T)r   r   r	   r   r3   rQ   rS   r
   r
   r
   r   r5   b   s    

r5   c                   @   s$   e Zd Zddee defddZdS )AsyncQuicConnectionNr(   returnc                    s   d S r   r
   )r   r(   r
   r
   r   make_stream   s   zAsyncQuicConnection.make_streamr   )r   r   r	   r   floatr   rV   r
   r
   r
   r   rT      s    rT   c                   @   s2   e Zd ZdddZ	dddZd	d
 Zdd ZdS )BaseQuicManagerNc                 C   sd   i | _ || _i | _|d u r-d }t|tr|}d}tjjjddg||d}|d ur-|	| || _
d S )NTdoqzdoq-i03)alpn_protocolsverify_modeserver_name)_connections_connection_factory_session_tickets
isinstancestraioquicquicconfigurationQuicConfigurationload_verify_locations_conf)r   confr[   connection_factoryr\   verify_pathr
   r
   r   r      s    


zBaseQuicManager.__init__U  r   Tc                 C   s   | j ||f}|d ur|dfS | j}|r:z| j||f}t|}||_W n	 ty0   Y nw t	| j
||}	nd }	tjjj||	d}
tj||f}|
|t  | |
||||| }|| j ||f< |dfS )NF)rd   session_ticket_handlerT)r]   r   rg   r_   popcopysession_ticketKeyError	functoolspartialsave_session_ticketrb   rc   r$   QuicConnectionr<   r=   r@   connectr'   r^   )r   rG   rH   rI   rJ   want_session_ticketr$   rh   ro   rl   qconn	lladdressr
   r
   r   _connect   s6   

zBaseQuicManager._connectc                 C   s(   z	| j ||f= W d S  ty   Y d S w r   )r]   rp   )r   rG   rH   r
   r
   r   closed   s
   zBaseQuicManager.closedc                 C   sL   t | j}|tkrt| j dt }|D ]}| j|= q|| j||f< d S r    )r   r_   MAX_SESSION_TICKETSlistkeysSESSIONS_TO_DELETE)r   rG   rH   ticketr0   keys_to_deletekeyr
   r
   r   rs      s   

z#BaseQuicManager.save_session_ticketr   )rk   Nr   T)r   r   r	   r   ry   rz   rs   r
   r
   r
   r   rX      s    

#rX   c                   @   s   e Zd ZdddZdS )AsyncQuicManagerrk   Nr   c                 C   s   t r   )rE   )r   rG   rH   rI   rJ   r
   r
   r   ru      s   zAsyncQuicManager.connect)rk   Nr   )r   r   r	   ru   r
   r
   r
   r   r      s    r   )rn   rq   rB   r-   r'   typingr   r   aioquic.quic.configurationrb   aioquic.quic.connectiondns.inetr<   QUIC_MAX_DATAGRAMr{   r~   	Exceptionr   r   r   r5   rT   rX   r   r
   r
   r
   r   <module>   s&   +/H