o
    h                     @   s   d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
 d dlZejr7d dlmZmZmZmZmZ G dd de	ZdS )	    N)Future)gen)IOLoop)Resolveris_valid_ip)	GeneratorAnyListTupleDictc                
   @   sn   e Zd ZdZdddZdedededdfd	d
ZdededdfddZe	j
	ddedededdfddZdS )CaresResolvera  Name resolver based on the c-ares library.

    This is a non-blocking and non-threaded resolver.  It may not produce the
    same results as the system resolver, but can be used for non-blocking
    resolution when threads cannot be used.

    ``pycares`` will not return a mix of ``AF_INET`` and ``AF_INET6`` when
    ``family`` is ``AF_UNSPEC``, so it is only recommended for use in
    ``AF_INET`` (i.e. IPv4).  This is the default for
    ``tornado.simple_httpclient``, but other libraries may default to
    ``AF_UNSPEC``.

    .. versionchanged:: 5.0
       The ``io_loop`` argument (deprecated since version 4.1) has been removed.

    .. deprecated:: 6.2
       This class is deprecated and will be removed in Tornado 7.0. Use the default
       thread-based resolver instead.
    returnNc                 C   s$   t  | _tj| jd| _i | _d S )N)sock_state_cb)r   currentio_looppycaresChannel_sock_state_cbchannelfds)self r   R/var/www/vscode/kcb/lib/python3.10/site-packages/tornado/platform/caresresolver.py
initialize$   s   

zCaresResolver.initializefdreadablewritablec                 C   s~   |rt jnd|rt jndB }|s| j| | j|= d S || jv r/| j|| || j|< d S | j|| j| || j|< d S )Nr   )	r   READWRITEr   remove_handlerr   update_handleradd_handler_handle_events)r   r   r   r   stater   r   r   r   )   s   
zCaresResolver._sock_state_cbeventsc                 C   s:   t j}t j}|tj@ r|}|tj@ r|}| j|| d S N)r   ARES_SOCKET_BADr   r   r   r   
process_fd)r   r   r$   read_fdwrite_fdr   r   r   r"   5   s   

zCaresResolver._handle_eventsr   hostportfamilyz*Generator[Any, Any, List[Tuple[int, Any]]]c           
      #   s    t |r	|g}n&t  | j|| fdd  V \}}|r,td|tj||f |j}g }|D ]3}d|v r=t	j
}	nd|v rEt	j}	nt	j}	|t	jkrY||	krYtd||	f |tt|	||ff q3|S )Nc                    s     | |fS r%   )
set_result)resulterrorfutr   r   <lambda>H   s    z'CaresResolver.resolve.<locals>.<lambda>z/C-Ares returned error %s: %s while resolving %s.:z%Requested socket family %d but got %d)r   r   r   gethostbynameIOErrorr   errnostrerror	addressessocketAF_INETAF_INET6	AF_UNSPECappendtypingcastint)
r   r*   r+   r,   r9   r.   r/   addrinfoaddressaddress_familyr   r0   r   resolve>   s8   

zCaresResolver.resolve)r   N)r   )__name__
__module____qualname____doc__r   rA   boolr   r"   r   	coroutinestrrE   r   r   r   r   r      s     
	r   )r   r:   tornado.concurrentr   tornador   tornado.ioloopr   tornado.netutilr   r   r?   TYPE_CHECKINGr   r   r	   r
   r   r   r   r   r   r   <module>   s    