U
    luf                     @   s   d 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m	Z	 ddl
ZddlZddlZddlZddlmZmZ ddlmZ ddlmZ ddlmZ ddlZejrdd	lmZmZmZmZ G d
d deZddddZeej drej !eeedddZ"dS )z1Bridges between the Twisted package and Tornado.
    N)Deferredfailure)Futurefuture_set_exc_info)utf8)gen)Resolver)	GeneratorAnyListTuplec                   @   s:   e Zd ZdZddddZejdeeeddd	d
Z	dS )TwistedResolvera  Twisted-based asynchronous resolver.

    This is a non-blocking and non-threaded resolver.  It is
    recommended only when threads cannot be used, since it has
    limitations compared to the standard ``getaddrinfo``-based
    `~tornado.netutil.Resolver` and
    `~tornado.netutil.DefaultExecutorResolver`.  Specifically, it returns at
    most one result, and arguments other than ``host`` and ``family``
    are ignored.  It may fail to resolve when ``family`` is not
    ``socket.AF_UNSPEC``.

    Requires Twisted 12.1 or newer.

    .. 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.
    Nreturnc                 C   s\   t jj | _t jjd}t jjj	| jd}t jj
jd| jd}t jj|||g| _d S )Nz
/etc/hosts)reactorz/etc/resolv.conf)twistedinternetZasyncioreactorZAsyncioSelectorReactorr   nameshostsr	   cacheZCacheResolverclientresolveZResolverChainresolver)selfZhost_resolverZcache_resolverZreal_resolver r   </tmp/pip-unpacked-wheel-bmg6zs32/tornado/platform/twisted.py
initialize=   s     zTwistedResolver.initializer   z*Generator[Any, Any, List[Tuple[int, Any]]])hostportfamilyr   c           
   
   c   s  t jj|r|}tj}nt jj|r4|}tj}n| j	t
|}t }||j |V }t|tjrz|  W q t jjjk
r } zt|W 5 d }~X Y qX n2t jj|rtj}nt jj|rtj}ntj}|tjkr||krtd||f tt|||ffg}	|	S )Nz%Requested socket family %d but got %d)r   r   ZabstractZisIPAddresssocketAF_INETZisIPv6AddressAF_INET6r   ZgetHostByNamer   r   ZaddBoth
set_result
isinstancer   FailureraiseExceptionr   errorZDomainErrorIOError	AF_UNSPEC	Exceptiontypingcastint)
r   r   r   r    ZresolvedZresolved_familydeferredZfuteresultr   r   r   r   K   s4    
zTwistedResolver.resolve)r   )
__name__
__module____qualname____doc__r   r   	coroutinestrr.   r   r   r   r   r   r   '   s      r   r   c                  C   s   ddl m}  |   dS )a  Install ``AsyncioSelectorReactor`` as the default Twisted reactor.

    .. deprecated:: 5.1

       This function is provided for backwards compatibility; code
       that does not require compatibility with older versions of
       Tornado should use
       ``twisted.internet.asyncioreactor.install()`` directly.

    .. versionchanged:: 6.0.3

       In Tornado 5.x and before, this function installed a reactor
       based on the Tornado ``IOLoop``. When that reactor
       implementation was removed in Tornado 6.0.0, this function was
       removed as well. It was restored in Tornado 6.0.3 using the
       ``asyncio`` reactor instead.

    r   installN)twisted.internet.asyncioreactorr9   r8   r   r   r   r9   o   s    r9   register)dr   c                    s.   t   tjd d fdd}|  j|  S )N)r   r   c                    s4   z|    tdW n   t t  Y nX d S )Nzerrback called without error)r'   r+   r   sysexc_infor   fr   r   errback   s
    z_.<locals>.errback)r   r   r&   ZaddCallbacksr$   )r<   rA   r   r?   r   _   s    rB   )#r5   r!   r=   Ztwisted.internet.abstractr   r:   Ztwisted.internet.deferr   Ztwisted.pythonr   Ztwisted.names.cacheZtwisted.names.clientZtwisted.names.hostsZtwisted.names.resolveZtornado.concurrentr   r   Ztornado.escaper   Ztornador   Ztornado.netutilr	   r,   TYPE_CHECKINGr
   r   r   r   r   r9   hasattrZconvert_yieldedr;   rB   r   r   r   r   <module>   s,   H
