o
    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
   C/var/www/html/venv/lib/python3.10/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 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_end1      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   r   r   )r#   r   r
   r
   r   idJ   r   zBaseQuicStream.idc                 C   r   r   )r%   r   r
   r
   r   headersM   r   zBaseQuicStream.headersc                 C   r   r   )r&   r   r
   r
   r   trailersP   r   zBaseQuicStream.trailersc                 C   s    |d urt   | }|S 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}|S 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 }|rd}nd}|dt	|
d 7 }d|fd|j fd|j fd	|fd
g}|rM|ddtt| fg | j | j||  |rd| j | j|d d S 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-typer3   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_partsr9   methodr*   r
   r
   r   send_h3g   s0   

zBaseQuicStream.send_h3c                 C   s&   | j  r|S t|}td|| S )Nz!H)r"   r4   r   structpack)r   rE   lr
   r
   r   _encapsulate   s   
zBaseQuicStream._encapsulatec                 C   sF   | j || z| jdko| j | jp| j jW S  ty"   Y dS w )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/   r1   rH   rL   rM   rO   r
   r
   r
   r   r    A   s    
	r    c                   @   sR   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 | _| r#tj	j
|d| _nd | _tj|| _tj||f| _|d u rR|dkrR| jtjkrGd}n| jtjkrPd}nt|r[||f| _d S d | _d S )NFr   z0.0.0.0z::)Z_doner"   Z_addressZ_port_closed_manager_streamsr4   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   )rW   r   r
   r
   r   r4      s   
zBaseQuicConnection.is_h3c                 C   s   | j |= d S r   )rT   )r   r(   r
   r
   r   rN      s   zBaseQuicConnection.close_streamFc                 C      | j ||| d S r   )rW   rB   )r   r(   r*   r   r
   r
   r   rB         zBaseQuicConnection.send_headersc                 C   re   r   )rW   rC   )r   r(   r   r   r
   r
   r   rC      rf   zBaseQuicConnection.send_dataTc                 C   sL   t   }| j }|d u r|d }t|| d}| jr"|r"t|d}||fS )Ni  r   g?)r,   r"   Z	get_timerr0   rR   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 d S r   )r,   r"   Zhandle_timer)r   r.   rh   r
   r
   r   _handle_timer   s   z BaseQuicConnection._handle_timer)Nr   N)FrP   )
r   r   r	   r   r4   rN   rB   rC   rj   rk   r
   r
   r
   r   rQ      s    
"


rQ   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   rn   r
   r
   r
   r   rl      s    rl   c                   @   sL   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 r;d }t|tr|}d}|r$dg}nddg}tjj	j
|||d}|d ur;|| || _d S )NTrV   Zdoqzdoq-i03)alpn_protocolsverify_modeserver_name)_connections_connection_factory_session_tickets_tokens_h3
isinstancerA   rU   quicconfigurationZQuicConfigurationload_verify_locations_conf)r   confrr   connection_factoryrs   rV   Zverify_pathrq   r
   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 }
|rcz| j||f}t|}||_W n	 tyY   Y nw t	| j||}nd }tjjj||
|d}tj||f}||t  | |||||| }|| j ||f< |dfS )NF)r{   session_ticket_handlertoken_handlerT)rt   r   r}   rv   popcopysession_ticketKeyError	functoolspartialsave_session_ticketrw   token
save_tokenrU   rz   r'   ZQuicConnectionrX   rY   rZ   connectr,   ru   )r   r`   ra   rb   rc   Zwant_session_ticketZ
want_tokenr'   r~   r   r   r   r   ZqconnZ	lladdressr
   r
   r   _connect   sL   	



zBaseQuicManager._connectc                 C   s(   z	| j ||f= W d S  ty   Y d S w r   )rt   r   )r   r`   ra   r
   r
   r   closed1  s
   zBaseQuicManager.closedc                 C   r   r   )rx   r   r
   r
   r   r4   7  r   zBaseQuicManager.is_h3c                 C   L   t | j}|tkrt| j dt }|D ]}| j|= q|| j||f< d S r!   )r   rv   MAX_SESSION_TICKETSlistkeysSESSIONS_TO_DELETE)r   r`   ra   ticketrK   keys_to_deletekeyr
   r
   r   r   :     

z#BaseQuicManager.save_session_ticketc                 C   r   r!   )r   rw   r   r   r   r   )r   r`   ra   r   rK   r   r   r
   r
   r   r   E  r   zBaseQuicManager.save_token)NF)r   Nr   TT)	r   r   r	   r   r   r   r4   r   r   r
   r
   r
   r   rp      s    

8rp   c                   @   s   e Zd ZdddZdS )AsyncQuicManagerr   Nr   c                 C   s   t r   )r^   )r   r`   ra   rb   rc   r
   r
   r   r   R  s   zAsyncQuicManager.connect)r   Nr   )r   r   r	   r   r
   r
   r
   r   r   Q  s    r   )r;   r   r   r[   rI   r,   r6   typingr   r   Zaioquic.h3.connectionrU   Zaioquic.h3.eventsZaioquic.quic.configurationZaioquic.quic.connectionZdns.inetrX   ZQUIC_MAX_DATAGRAMr   r   	Exceptionr   r   r    rQ   rl   rp   r   r
   r
   r
   r   <module>   s.   #VBs