
[c           @` s  d  Z  d d l m Z m Z m Z d d l Z d d l 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 m Z m Z m Z m Z m Z d d l m Z 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  d d
 l! m" Z" m# Z# d d l$ m% Z% d d l& m' Z' d d l( Z& d d l) m* Z* d d l+ m, Z, d d l- m. Z. m/ Z/ d d l( m0 Z0 d d l1 m2 Z2 e  e  d e3 f d     Y Z4 e  e e  d e f d     Y Z5 d e5 f d     YZ6 d   Z7 e  e e  d e3 f d     Y Z8 d e& j9 j0 f d     YZ: d e, f d     YZ; e< e' j= d  re' j= j> e  d     Z? n  d S(!   sB  Bridges between the Twisted reactor and Tornado IOLoop.

This module lets you run applications and libraries written for
Twisted in a Tornado application.  It can be used in two modes,
depending on which library's underlying event loop you want to use.

This module has been tested with Twisted versions 11.0.0 and newer.
i    (   t   absolute_importt   divisiont   print_functionN(   t   Deferred(   t   PosixReactorBase(   t   IReactorFDSett   IDelayedCallt   IReactorTimet   IReadDescriptort   IWriteDescriptor(   t   failuret   log(   t   error(   t   implementer(   t   Futuret   future_set_exc_info(   t   utf8(   t   gen(   t   app_log(   t   Resolver(   t   NullContextt   wrap(   t   IOLoop(   t   timedelta_to_secondst   TornadoDelayedCallc           B` sM   e  Z d  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 RS(   s   DelayedCall object for Tornado.c         O` se   | |  _  t j | | |  |  _ |  j  j   | |  _ |  j  j j |  j |  j  |  _	 t
 |  _ d  S(   N(   t   _reactort	   functoolst   partialt   _funct   secondst   _timet   _io_loopt   add_timeoutt   _calledt   _timeoutt   Truet   _active(   t   selft   reactorR   t   ft   argst   kw(    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   __init__;   s    	c         C` sH   t  |  _ |  j j |   y |  j   Wn t j d d t n Xd  S(   Ns   _called caught exceptiont   exc_info(   t   FalseR$   R   t   _removeDelayedCallR   R   R   R#   (   R%   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR!   C   s    	c         C` s   |  j  S(   N(   R   (   R%   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   getTimeK   s    c         C` s3   t  |  _ |  j j j |  j  |  j j |   d  S(   N(   R,   R$   R   R   t   remove_timeoutR"   R-   (   R%   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   cancelN   s    	c         C` sJ   |  j  j j |  j  |  j | 7_ |  j  j j |  j |  j  |  _ d  S(   N(   R   R   R/   R"   R   R    R!   (   R%   R   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   delayS   s    c         C` sQ   |  j  j j |  j  |  j  j   | |  _ |  j  j j |  j |  j  |  _ d  S(   N(   R   R   R/   R"   R   R   R    R!   (   R%   R   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   resetY   s    c         C` s   |  j  S(   N(   R$   (   R%   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   active_   s    (
   t   __name__t
   __module__t   __doc__R*   R!   R.   R0   R1   R2   R3   (    (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR   8   s   						t   TornadoReactorc           B` s   e  Z d  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 d	   Z d
   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z RS(   s{  Twisted reactor built on the Tornado IOLoop.

    `TornadoReactor` implements the Twisted reactor interface on top of
    the Tornado IOLoop.  To use it, simply call `install` at the beginning
    of the application::

        import tornado.platform.twisted
        tornado.platform.twisted.install()
        from twisted.internet import reactor

    When the app is ready to start, call ``IOLoop.current().start()``
    instead of ``reactor.run()``.

    It is also possible to create a non-global reactor by calling
    ``tornado.platform.twisted.TornadoReactor()``.  However, if
    the `.IOLoop` and reactor are to be short-lived (such as those used in
    unit tests), additional cleanup may be required.  Specifically, it is
    recommended to call::

        reactor.fireSystemEvent('shutdown')
        reactor.disconnectAll()

    before closing the `.IOLoop`.

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

    .. deprecated:: 5.1

       This class will be removed in Tornado 6.0. Use
       ``twisted.internet.asyncioreactor.AsyncioSelectorReactor``
       instead.

    c         ` s   t  j j j     _ i    _ i    _ i    _ i    _ t	 j
      j d d   j    f d   }   j j |  d  S(   Nt   duringt   shutdownc           ` s     j  s   j d  n  d  S(   Nt   startup(   t   _startedt   fireSystemEvent(    (   R%   (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   start_if_necessary   s    	(   t   tornadot   ioloopR   t   currentR   t   _readerst   _writerst   _fdst   _delayedCallsR   R*   t   addSystemEventTriggert   crasht   add_callback(   R%   R=   (    (   R%   s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR*      s    				c         C` s   |  j  j   S(   N(   R   t   time(   R%   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR      s    c         O` s)   t  |  | | | |  } t |  j | <| S(   N(   R   R#   RD   (   R%   R   R'   R(   R)   t   dc(    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt	   callLater   s    c         C` s#   g  |  j  D] } | j r
 | ^ q
 S(   N(   RD   R$   (   R%   t   x(    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   getDelayedCalls   s    c         C` s    | |  j  k r |  j  | =n  d  S(   N(   RD   (   R%   RI   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR-      s    c         O` sF   t  |  s t d |   t    |  j j | | |  Wd  QXd  S(   Ns   %s is not callable(   t   callablet   AssertionErrorR   R   RG   (   R%   R'   R(   R)   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   callFromThread   s    
c         C` s   d  S(   N(    (   R%   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   installWaker   s    c         C` s   d  S(   N(    (   R%   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   wakeUp   s    c         C` s  | |  j  k r d  S|  j  | \ } } | r d  } | j   d k rS t j   } n% | t j @rx t j | | j	  } n  | d  k r | t j
 @r t j   } n  | d  k	 r |  j |  | j t j |   q n  | rd  } | j   d k rt j   } n% | t j @r't j | | j  } n  | d  k rO| t j
 @rOt j   } n  | d  k	 r|  j |  | j t j |   qn  d  S(   Ni(   RC   t   Nonet   filenoR   t   ConnectionLostR   t   READR   t   callWithLoggert   doReadt   ERRORt   removeReadert   readConnectionLostR
   t   Failuret   WRITEt   doWritet   removeWritert   writeConnectionLost(   R%   t   fdt   eventst   readert   writert   err(    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   _invoke_callback   s2    c         C` s   | |  j  k r d  S| j   } | |  j  | <| |  j k r |  j | \ } } | | f |  j | <| r |  j j | t j t j B q n? t   4 | d  f |  j | <|  j j
 | |  j t j  Wd  QXd  S(   N(   RA   RS   RC   R   t   update_handlerR   RU   R\   R   RR   t   add_handlerRe   (   R%   Rb   R`   t   _Rc   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt	   addReader   s    #
c         C` s   | |  j  k r d  S| j   } | |  j  | <| |  j k r |  j | \ } } | | f |  j | <| r |  j j | t j t j B q n? t   4 d  | f |  j | <|  j j
 | |  j t j  Wd  QXd  S(   N(   RB   RS   RC   R   Rf   R   RU   R\   R   RR   Rg   Re   (   R%   Rc   R`   Rb   Rh   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt	   addWriter   s    #
c         C` s   | |  j  k r |  j  j |  } |  j | \ } } | rf d  | f |  j | <|  j j | t j  q |  j | =|  j j |  n  d  S(   N(	   RA   t   popRC   RR   R   Rf   R   R\   t   remove_handler(   R%   Rb   R`   Rh   Rc   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyRY      s    
c         C` s   | |  j  k r |  j  j |  } |  j | \ } } | rf | d  f |  j | <|  j j | t j  q |  j | =|  j j |  n  d  S(   N(	   RB   Rk   RC   RR   R   Rf   R   RU   Rl   (   R%   Rc   R`   Rb   Rh   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR^     s    
c         C` s   |  j  |  j |  j  S(   N(   t
   _removeAllRA   RB   (   R%   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt	   removeAll  s    c         C` s   |  j  j   S(   N(   RA   t   keys(   R%   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt
   getReaders  s    c         C` s   |  j  j   S(   N(   RB   Ro   (   R%   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt
   getWriters!  s    c         C` s6   t  j |   t j |  j d  } |  j j |  d  S(   NR9   (   R   t   stopR   R   R<   R   RG   (   R%   t   fire_shutdown(    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyRr   '  s    c         C` s   t  j |   |  j j   d  S(   N(   R   RF   R   Rr   (   R%   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyRF   ,  s    c         C` s   t  d   d  S(   Nt   doIteration(   t   NotImplementedError(   R%   R1   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyRt   0  s    c         C` s   |  j  j   d  S(   N(   R   t   start(   R%   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   mainLoop3  s    	(   R4   R5   R6   R*   R   RJ   RL   R-   RO   RP   RQ   Re   Ri   Rj   RY   R^   Rn   Rp   Rq   Rr   RF   Rt   Rw   (    (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR7   c   s*   #																			t   _TestReactorc           B` s5   e  Z d  Z d   Z d d d  Z d d d  Z RS(   s   Subclass of TornadoReactor for use in unittests.

    This can't go in the test.py file because of import-order dependencies
    with the Twisted reactor test builder.
    c         C` s8   t  j   t  d t  t t |   j   t  j   d  S(   Nt   make_current(   R   t   clear_currentR#   t   superRx   R*   (   R%   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR*   E  s    
i2   t    c         C` s4   | s d } n  t  t |   j | | d | d | S(   Ns	   127.0.0.1t   backlogt	   interface(   R{   Rx   t	   listenTCP(   R%   t   portt   factoryR}   R~   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR   L  s    	i    c         C` s4   | s d } n  t  t |   j | | d | d | S(   Ns	   127.0.0.1R~   t   maxPacketSize(   R{   Rx   t	   listenUDP(   R%   R   t   protocolR~   R   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR   S  s    	(   R4   R5   R6   R*   R   R   (    (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyRx   ?  s   	c          C` s'   t    }  d d l m } | |   |  S(   s  Install this package as the default Twisted reactor.

    ``install()`` must be called very early in the startup process,
    before most other twisted-related imports. Conversely, because it
    initializes the `.IOLoop`, it cannot be called before
    `.fork_processes` or multi-process `~.TCPServer.start`. These
    conflicting requirements make it difficult to use `.TornadoReactor`
    in multi-process mode, and an external process manager such as
    ``supervisord`` is recommended instead.

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

    .. deprecated:: 5.1

       This functio will be removed in Tornado 6.0. Use
       ``twisted.internet.asyncioreactor.install`` instead.
    i    (   t   installReactor(   R7   t   twisted.internet.mainR   (   R&   R   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   installZ  s    	
t   _FDc           B` sH   e  Z d    Z d   Z d   Z d   Z d   Z e Z Z d   Z	 RS(   c         C` s:   | |  _  | |  _ | |  _ t |  _ t |  _ t |  _ d  S(   N(   R`   t   fileobjt   handlerR,   t   readingt   writingt   lost(   R%   R`   R   R   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR*   u  s    					c         C` s   |  j  S(   N(   R`   (   R%   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyRS   }  s    c         C` s,   |  j  s( |  j |  j t j j j  n  d  S(   N(   R   R   R   R>   R?   R   RU   (   R%   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyRW     s    	c         C` s,   |  j  s( |  j |  j t j j j  n  d  S(   N(   R   R   R   R>   R?   R   R\   (   R%   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR]     s    	c         C` s5   |  j  s1 |  j |  j t j j j  t |  _  n  d  S(   N(   R   R   R   R>   R?   R   RX   R#   (   R%   t   reason(    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   connectionLost  s    	c         C` s   d S(   NR|   (    (   R%   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt	   logPrefix  s    (
   R4   R5   R*   RS   RW   R]   R   R_   RZ   R   (    (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR   s  s   					
t   TwistedIOLoopc           B` sw   e  Z d  Z d d  Z e d  Z d   Z d   Z d   Z	 d   Z
 d   Z d   Z d	   Z d
   Z d   Z RS(   s  IOLoop implementation that runs on Twisted.

    `TwistedIOLoop` implements the Tornado IOLoop interface on top of
    the Twisted reactor. Recommended usage::

        from tornado.platform.twisted import TwistedIOLoop
        from twisted.internet import reactor
        TwistedIOLoop().install()
        # Set up your tornado application as usual using `IOLoop.instance`
        reactor.run()

    Uses the global Twisted reactor by default.  To create multiple
    ``TwistedIOLoops`` in the same process, you must pass a unique reactor
    when constructing each one.

    Not compatible with `tornado.process.Subprocess.set_exit_callback`
    because the ``SIGCHLD`` handlers used by Tornado and Twisted conflict
    with each other.

    See also :meth:`tornado.ioloop.IOLoop.install` for general notes on
    installing alternative IOLoops.

    .. deprecated:: 5.1

       The `asyncio` event loop will be the only available implementation in
       Tornado 6.0.
    c         K` sS   t  t |   j |   | d  k r= d d  l } | j j } n  | |  _ i  |  _ d  S(   Ni    (   R{   R   t
   initializeRR   t   twisted.internet.reactort   internetR&   t   fds(   R%   R&   t   kwargst   twisted(    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR     s    	c         C` sn   |  j  } |  j j   x! |  j j   D] } | j   q& W| rj x' | j   D] } |  j | j  qM Wn  d  S(   N(   R   R&   Rn   RL   R0   t   valuest   close_fdR   (   R%   t   all_fdsR   t   cR`   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   close  s    	c         C` s   | |  j  k r" t d |   n  |  j |  \ } } t | | t |   |  j  | <| t j j j @r t	 |  j  | _
 |  j j |  j  |  n  | t j j j @r t	 |  j  | _ |  j j |  j  |  n  d  S(   Ns   fd %s added twice(   R   t
   ValueErrort   split_fdR   R   R>   R?   R   RU   R#   R   R&   Ri   R\   R   Rj   (   R%   R`   R   Ra   R   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyRg     s    c         C` s-  |  j  |  \ } } | t j j j @re |  j | j s t |  j | _ |  j j	 |  j |  q n: |  j | j r t
 |  j | _ |  j j |  j |  n  | t j j j @r |  j | j s)t |  j | _ |  j j |  j |  q)n: |  j | j r)t
 |  j | _ |  j j |  j |  n  d  S(   N(   R   R>   R?   R   RU   R   R   R#   R&   Ri   R,   RY   R\   R   Rj   R^   (   R%   R`   Ra   R   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyRf     s    c         C` s   |  j  |  \ } } | |  j k r( d  St |  j | _ |  j | j rb |  j j |  j |  n  |  j | j r |  j j |  j |  n  |  j | =d  S(   N(	   R   R   R#   R   R   R&   RY   R   R^   (   R%   R`   R   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyRl     s    c         C` sb   t  j d t  } z% |  j   |  j   |  j j   Wd  | d  k rS t  j   n
 | j   Xd  S(   Nt   instance(	   R   R@   R,   t   _setup_loggingRy   R&   t   runRR   Rz   (   R%   t   old_current(    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyRv     s    

c         C` s   |  j  j   d  S(   N(   R&   RF   (   R%   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyRr     s    c         O` s   t  | t j  r. t | |  j   d  } n- t  | t j  rO t |  } n t d   |  j	 j
 | |  j t j t |  | |   S(   Ni    s   Unsupported deadline %r(   t
   isinstancet   numberst   Realt   maxRH   t   datetimet	   timedeltaR   t	   TypeErrorR&   RJ   t   _run_callbackR   R   R   (   R%   t   deadlinet   callbackR(   R   R1   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR      s    		c         C` s   | j    r | j   n  d  S(   N(   R3   R0   (   R%   t   timeout(    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR/     s    c         O` s/   |  j  j |  j t j t |  | |   d  S(   N(   R&   RO   R   R   R   R   (   R%   R   R(   R   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyRG     s    	c         O` s   |  j  | | |  d  S(   N(   RG   (   R%   R   R(   R   (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   add_callback_from_signal  s    N(   R4   R5   R6   RR   R   R,   R   Rg   Rf   Rl   Rv   Rr   R    R/   RG   R   (    (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR     s   									t   TwistedResolverc           B` s,   e  Z d  Z d   Z e j d d   Z RS(   s  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.
    c         C` s   t  j j j   |  _ t j j j d  } t j j j	 d |  j  } t j j
 j d d |  j } t j j j | | | g  |  _ d  S(   Ns
   /etc/hostsR&   s   /etc/resolv.conf(   R>   t   platformR   R7   R&   t   namest   hostsR   t   cachet   CacheResolvert   clientt   resolvet   ResolverChaint   resolver(   R%   t   host_resolvert   cache_resolvert   real_resolver(    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR   %  s    i    c   
      c` s{  t  j j j |  r' | } t j } n t  j j j |  rN | } t j } n |  j j	 t
 |   } t   } | j | j  | V} t | t j  r y | j   Wqt  j j j k
 r } t |   qXnK t  j j j |  r t j } n* t  j j j |  rt j } n	 t j } | t j k rS| | k rSt d | | f   n  | | | f f g }	 t j |	   d  S(   Ns%   Requested socket family %d but got %d(   R   R   t   abstractt   isIPAddresst   sockett   AF_INETt   isIPv6Addresst   AF_INET6R   t   getHostByNameR   R   t   addBotht
   set_resultR   R
   R[   t   raiseExceptionR   R   t   DomainErrort   IOErrort	   AF_UNSPECt	   ExceptionR   t   Return(
   R%   t   hostR   t   familyt   resolvedt   resolved_familyt   deferredt   futt   et   result(    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR   1  s2    		(   R4   R5   R6   R   R   t	   coroutineR   (    (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyR     s   	t   registerc         ` s/   t        f d   } |  j   j |    S(   Nc         ` s;   y |  j    t d   Wn t   t j    n Xd  S(   Ns   errback called without error(   R   R   R   t   sysR+   (   R
   (   R'   (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   errbackY  s
    
(   R   t   addCallbacksR   (   t   dR   (    (   R'   s7   lib/python2.7/site-packages/tornado/platform/twisted.pyRh   U  s    	(@   R6   t
   __future__R    R   R   R   R   R   R   R   t   twisted.internet.abstractR   t   twisted.internet.deferR   t   twisted.internet.posixbaseR   t   twisted.internet.interfacesR   R   R   R   R	   t   twisted.pythonR
   R   t   twisted.internetR   t   twisted.names.cachet   twisted.names.clientt   twisted.names.hostst   twisted.names.resolvet   zope.interfaceR   t   tornado.concurrentR   R   t   tornado.escapeR   R>   R   t   tornado.ioloopt   tornado.logR   t   tornado.netutilR   t   tornado.stack_contextR   R   R   t   tornado.utilR   t   objectR   R7   Rx   R   R   R?   R   R   t   hasattrt   convert_yieldedR   Rh   (    (    (    s7   lib/python2.7/site-packages/tornado/platform/twisted.pyt   <module>   sL   (*	@