Ë
    êmxi¬  ã                   óš   — 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                  rd dlmZmZmZmZmZ  G d„ de	«      Zy)	é    N)ÚFuture)Úgen)ÚIOLoop)ÚResolverÚis_valid_ip)Ú	GeneratorÚAnyÚListÚTupleÚDictc            
       ó~   — e Zd ZdZdd„Zdedededdfd„Zded	eddfd
„Ze	j                  	 ddedededdfd„«       Zy)Ú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                 óŽ   — t        j                  «       | _        t        j                  | j
                  ¬«      | _        i | _        y )N)Úsock_state_cb)r   ÚcurrentÚio_loopÚpycaresÚChannelÚ_sock_state_cbÚchannelÚfds)Úselfs    úU/home/htdocs/ttos/venv/lib/python3.12/site-packages/tornado/platform/caresresolver.pyÚ
initializezCaresResolver.initialize$   s-   € Ü—~‘~Ó'ˆŒÜ—‘°T×5HÑ5HÔIˆŒØˆ�ó    ÚfdÚreadableÚwritablec                 óŒ  — |rt         j                  nd|rt         j                  ndz  }|s)| j                  j	                  |«       | j
                  |= y || j
                  v r,| j                  j                  ||«       || j
                  |<   y | j                  j                  || j                  |«       || j
                  |<   y )Nr   )	r   ÚREADÚWRITEr   Úremove_handlerr   Úupdate_handlerÚadd_handlerÚ_handle_events)r   r   r   r   Ústates        r   r   zCaresResolver._sock_state_cb)   s’   € Ù (”—’¨aÁH´F·L²LÐRSÑTˆÙØ�L‰L×'Ñ'¨Ô+Ø—‘˜‘Ø�4—8‘8‰^Ø�L‰L×'Ñ'¨¨EÔ2Ø ˆD�H‰H�RŠLà�L‰L×$Ñ$ R¨×)<Ñ)<¸eÔDØ ˆD�H‰H�RŠLr   Úeventsc                 óÐ   — t         j                  }t         j                  }|t        j                  z  r|}|t        j                  z  r|}| j
                  j                  ||«       y ©N)r   ÚARES_SOCKET_BADr   r!   r"   r   Ú
process_fd)r   r   r(   Úread_fdÚwrite_fds        r   r&   zCaresResolver._handle_events5   sN   € Ü×)Ñ)ˆÜ×*Ñ*ˆØ”F—K‘KÒØˆGØ”F—L‘LÒ ØˆHØ�‰×Ñ ¨Õ2r   ÚhostÚportÚfamilyz*Generator[Any, Any, List[Tuple[int, Any]]]c              #   ó>  ‡
K  — t        |«      r|g}npt        «       Š
| j                  j                  ||ˆ
fd„«       ‰
–—\  }}|r1t	        d|›dt
        j                  j                  |«      ›d|›�«      ‚|j                  }g }|D ]‘  }d|v rt        j                  }	n%d|v rt        j                  }	nt        j                  }	|t        j                  k7  r||	k7  rt	        d||	fz  «      ‚|j                  t        j                  t         |	«      ||ff«       Œ“ |S ­w)Nc                 ó*   •— ‰j                  | |f«      S r*   )Ú
set_result)ÚresultÚerrorÚfuts     €r   ú<lambda>z'CaresResolver.resolve.<locals>.<lambda>H   s   ø€ °C·N±NÀFÈEÀ?Ó4S€ r   zC-Ares returned error z: z while resolving ú.ú:z%Requested socket family %d but got %d)r   r   r   ÚgethostbynameÚOSErrorr   ÚerrnoÚstrerrorÚ	addressesÚsocketÚAF_INETÚAF_INET6Ú	AF_UNSPECÚappendÚtypingÚcastÚint)r   r/   r0   r1   r?   r5   r6   ÚaddrinfoÚaddressÚaddress_familyr7   s             @r   ÚresolvezCaresResolver.resolve>   s  øè ø€ ô �tÔØ˜‰Iô “(ˆCØ�L‰L×&Ñ&Ø�fÓSôð #&™I‰MˆF�EÙÝâœgŸm™m×4Ñ4°UÕ;¹TðCóð ð ×(Ñ(ˆIØˆØ ò 	QˆGØ�g‰~Ü!'§¡‘Ø˜‘Ü!'§¡‘ä!'×!1Ñ!1�Øœ×)Ñ)Ò)¨f¸Ò.FÜØ;¸vÀ~Ð>VÑVóð ð �O‰OœVŸ[™[¬¨nÓ=ÀÈ¸ÐOÕPð	Qð ˆùs   ƒDD)r   N)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rG   Úboolr   r&   r   Ú	coroutineÚstrrK   © r   r   r   r      s‚   „ ñó(ð

! ð 
!°ð 
!Àð 
!Èó 
!ð3 ð 3¨cð 3°dó 3ð 	‡]�]à23ñØðØ"ðØ,/ðà	5òó ñr   r   )r   r@   Útornado.concurrentr   Útornador   Útornado.ioloopr   Útornado.netutilr   r   rE   ÚTYPE_CHECKINGr   r	   r
   r   r   r   rS   r   r   ú<module>rY      s7   ðÛ Û å %Ý Ý !ß 1ã à	×Òß8Õ8ôO�Hõ Or   