o
    Qœ_ö  ã                   @   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.

    c-ares fails to resolve some names 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.
    Ú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   ú@/usr/lib/python3/dist-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"   0   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>C   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   Úresolve9   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    