ó
¨œž[c           @` s”   d  d l  m Z m Z m Z 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 e f d „  ƒ  YZ d S(	   i    (   t   absolute_importt   divisiont   print_functionN(   t   Future(   t   gen(   t   IOLoop(   t   Resolvert   is_valid_ipt   CaresResolverc           B` s>   e  Z d  Z d „  Z d „  Z d „  Z e j d d „ ƒ Z RS(   s`  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.
    c         C` s4   t  j ƒ  |  _ t j d |  j ƒ |  _ i  |  _ d  S(   Nt   sock_state_cb(   R   t   currentt   io_loopt   pycarest   Channelt   _sock_state_cbt   channelt   fds(   t   self(    (    s=   lib/python2.7/site-packages/tornado/platform/caresresolver.pyt
   initialize   s    c         C` s§   | r t  j n d | r! t  j n d B} | sK |  j j | ƒ |  j | =nX | |  j k r} |  j j | | ƒ | |  j | <n& |  j j | |  j | ƒ | |  j | <d  S(   Ni    (	   R   t   READt   WRITER   t   remove_handlerR   t   update_handlert   add_handlert   _handle_events(   R   t   fdt   readablet   writablet   state(    (    s=   lib/python2.7/site-packages/tornado/platform/caresresolver.pyR      s    c         C` sU   t  j } t  j } | t j @r( | } n  | t j @r> | } n  |  j j | | ƒ d  S(   N(   R   t   ARES_SOCKET_BADR   R   R   R   t
   process_fd(   R   R   t   eventst   read_fdt   write_fd(    (    s=   lib/python2.7/site-packages/tornado/platform/caresresolver.pyR   ,   s    				i    c   
      #` s4  t  | ƒ r | g } nl t ƒ  ‰  |  j j | | ‡  f d †  ƒ ˆ  V\ } } | r{ t d | t j j | ƒ | f ƒ ‚ n  | j } g  } x” | D]Œ } d | k r¯ t	 j
 }	 n! d | k rÇ t	 j }	 n	 t	 j }	 | t	 j k r| |	 k rt d | |	 f ƒ ‚ n  | j |	 | | f f ƒ q‘ Wt j | ƒ ‚ d  S(   Nc         ` s   ˆ  j  |  | f ƒ S(   N(   t
   set_result(   t   resultt   error(   t   fut(    s=   lib/python2.7/site-packages/tornado/platform/caresresolver.pyt   <lambda>=   s    s/   C-Ares returned error %s: %s while resolving %st   .t   :s%   Requested socket family %d but got %d(   R   R   R   t   gethostbynamet   IOErrorR   t   errnot   strerrort	   addressest   sockett   AF_INETt   AF_INET6t	   AF_UNSPECt   appendR   t   Return(
   R   t   hostt   portt   familyR-   R#   R$   t   addrinfot   addresst   address_family(    (   R%   s=   lib/python2.7/site-packages/tornado/platform/caresresolver.pyt   resolve5   s,    	"		(	   t   __name__t
   __module__t   __doc__R   R   R   R   t	   coroutineR:   (    (    (    s=   lib/python2.7/site-packages/tornado/platform/caresresolver.pyR      s   				(   t
   __future__R    R   R   R   R.   t   tornado.concurrentR   t   tornadoR   t   tornado.ioloopR   t   tornado.netutilR   R   R   (    (    (    s=   lib/python2.7/site-packages/tornado/platform/caresresolver.pyt   <module>   s   