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
   L/var/www/html/olx_land/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post	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   rI   rM   rN   rP   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::)_doner"   _address_port_closed_manager_streamsr4   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managerr
   r
   r   r      s*   	
zBaseQuicConnection.__init__c                 C   s
   | j d uS r   )r\   r   r
   r
   r   r4      s   
zBaseQuicConnection.is_h3c                 C   s   | j |= d S r   )rX   )r   r(   r
   r
   r   rO      s   zBaseQuicConnection.close_streamFc                 C      | j ||| d S r   )r\   rB   )r   r(   r*   r   r
   r
   r   rB         zBaseQuicConnection.send_headersc                 C   rm   r   )r\   rC   )r   r(   r   r   r
   r
   r   rC      rn   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"   	get_timerr0   rV   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.   rr   r
   r
   r   _handle_timer   s   z BaseQuicConnection._handle_timer)Nr   N)FrQ   )
r   r   r	   r   r4   rO   rB   rC   rt   rv   r
   r
   r
   r   rR      s    
"


rR   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   ry   r
   r
   r
   r   rw      s    rw   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 )NTrZ   doqzdoq-i03)alpn_protocolsverify_modeserver_name)_connections_connection_factory_session_tickets_tokens_h3
isinstancerA   rY   quicconfigurationQuicConfigurationload_verify_locations_conf)r   confr~   connection_factoryr   rZ   verify_pathr}   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)r   r   r   r   popcopysession_ticketKeyError	functoolspartialsave_session_ticketr   token
save_tokenrY   r   r'   QuicConnectionr]   r^   ra   connectr,   r   )r   rh   ri   rj   rk   want_session_ticket
want_tokenr'   r   r   r   r   r   qconn	lladdressr
   r
   r   _connect   sL   	



zBaseQuicManager._connectc                 C   s(   z	| j ||f= W d S  ty   Y d S w r   )r   r   )r   rh   ri   r
   r
   r   closed1  s
   zBaseQuicManager.closedc                 C   r   r   )r   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   r   MAX_SESSION_TICKETSlistkeysSESSIONS_TO_DELETE)r   rh   ri   ticketrL   keys_to_deletekeyr
   r
   r   r   :     

z#BaseQuicManager.save_session_ticketc                 C   r   r!   )r   r   r   r   r   r   )r   rh   ri   r   rL   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   r{      s    

8r{   c                   @   s   e Zd ZdddZdS )AsyncQuicManagerr   Nr   c                 C   s   t r   )rf   )r   rh   ri   rj   rk   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   rc   rJ   r,   r6   typingr   r   aioquic.h3.connectionrY   aioquic.h3.eventsaioquic.quic.configurationaioquic.quic.connectiondns.inetr]   QUIC_MAX_DATAGRAMr   r   	Exceptionr   r   r    rR   rw   r{   r   r
   r
   r
   r   <module>   s.   #VBs