o
    Þý°jO+  ã                   @   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	 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)ÚAnyi   é   é   c                   @   s   e Zd ZdS )ÚUnexpectedEOFN)Ú__name__Ú
__module__Ú__qualname__© r	   r	   úƒ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/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-typer2   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_partsr8   Úmethodr)   r	   r	   r
   Úsend_h3g   s0   

ûþÿÿzBaseQuicStream.send_h3c                 C   s&   | j  ¡ r|S t|ƒ}t d|¡| S )Nz!H)r!   r3   r   ÚstructÚpack)r   rD   Ú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.   r0   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 | _|d ur'| ¡ r'tj	j
 |d¡| _nd | _tj |¡| _tj ||f¡| _|d u rV|dkrV| jtjkrKd}n| jtjkrTd}nt‚|r_||f| _d S d | _d S )NFr   z0.0.0.0z::)Ú_doner!   Ú_addressÚ_portÚ_closedÚ_managerÚ_streamsr3   Ú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
   r3   º   s   
zBaseQuicConnection.is_h3c                 C   s   | j |= d S r   )rW   )r   r'   r	   r	   r
   rN   ½   s   zBaseQuicConnection.close_streamFc                 C   ó"   | j d usJ ‚| j  |||¡ d S r   )r[   rA   )r   r'   r)   r   r	   r	   r
   rA   À   ó   zBaseQuicConnection.send_headersc                 C   rl   r   )r[   rB   )r   r'   r   r   r	   r	   r
   rB   Ä   rm   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_timerr/   rU   Ú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-   rq   r	   r	   r
   Ú_handle_timerÕ   s   ÿz BaseQuicConnection._handle_timer)Nr   N)FrP   )
r   r   r   r   r3   rN   rA   rB   rs   ru   r	   r	   r	   r
   rQ   —   s    
ù"


rQ   c                   @   s$   e Zd ZddedB 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   Úfloatr   rx   r	   r	   r	   r
   rv   Û   s    rv   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 rEd }t|tƒr|}d}|r$dg}nddg}tjj	j
|||d�}|d urEtj |¡\}}	|j||	d� || _d S )NTrY   Údoqzdoq-i03)Úalpn_protocolsÚverify_modeÚserver_name)ÚcafileÚcapath)Ú_connectionsÚ_connection_factoryÚ_session_ticketsÚ_tokensÚ_h3Ú
isinstancer@   rX   ÚquicÚconfigurationÚQuicConfigurationr\   Ú	_tls_utilÚ#convert_verify_to_cafile_and_capathÚload_verify_locationsÚ_conf)
r   Úconfr}   Úconnection_factoryr~   rY   Úverify_pathr|   r   r€   r	   r	   r
   r   á   s0   
ýÿ
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_tokenrX   r‡   r&   ÚQuicConnectionr\   r]   r`   Úconnectr+   r‚   )r   rg   rh   ri   rj   Ú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   rg   rh   r	   r	   r
   Úclosed6  s
   ÿzBaseQuicManager.closedc                 C   r   r   )r…   r   r	   r	   r
   r3   <  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   rg   rh   ÚticketrK   Úkeys_to_deleteÚkeyr	   r	   r
   rš   ?  ó   

z#BaseQuicManager.save_session_ticketc                 C   r¥   r    )r   r„   r¦   r§   r¨   r©   )r   rg   rh   r›   rK   r«   r¬   r	   r	   r
   rœ   J  r­   zBaseQuicManager.save_token)NF)r‘   Nr   TT)	r   r   r   r   r£   r¤   r3   rš   rœ   r	   r	   r	   r
   rz   à   s    
ÿ 
ù8rz   c                   @   s   e Zd Zddd„ZdS )ÚAsyncQuicManagerr‘   Nr   c                 C   s   t ‚r   )re   )r   rg   rh   ri   rj   r	   r	   r
   rž   W  s   zAsyncQuicManager.connect)r‘   Nr   )r   r   r   rž   r	   r	   r	   r
   r®   V  s    r®   )r:   r•   r˜   rb   rI   r+   Úurllib.parser5   Útypingr   Úaioquic.h3.connectionrX   Úaioquic.quic.configurationÚaioquic.quic.connectionÚdns._tls_utilr\   Údns.inetÚQUIC_MAX_DATAGRAMr¦   r©   Ú	Exceptionr   r   r   rQ   rv   rz   r®   r	   r	   r	   r
   Ú<module>   s.   #VDv