î
yË X  ã               @   sÁ   d  d l  Z  d  d l Z d  d l Z y d  d l Z Wn e k
 rT e d ƒ ‚ Yn Xd  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 Gd d „  d e ƒ Z d S)	é    Nz.You need tornado installed to use this worker.)ÚIOLoopÚPeriodicCallback)ÚWSGIContainer)ÚWorker)Ú__version__c                   sd   e  Z d  Z e d d „  ƒ Z ‡  f d d †  Z d d „  Z d d „  Z d	 d
 „  Z d d „  Z	 ‡  S)ÚTornadoWorkerc                sM   t  j j d ƒ } | j j ‰  ‡  f d d †  } | | j _ | t  j d <d  S)Nztornado.webc                s9   ˆ  |  ƒ d |  j  d k r5 |  j  d d t 7<n  d  S)NZGunicornÚServerz (Gunicorn/%s))Ú_headersÚgversion)Úself)Ú	old_clear© úI/home/ubuntu/projects/ifolica/build/gunicorn/gunicorn/workers/gtornado.pyÚclear   s    
z"TornadoWorker.setup.<locals>.clear)ÚsysÚmodulesÚpopZRequestHandlerr   )ÚclsÚwebr   r   )r   r   Úsetup   s
    zTornadoWorker.setupc                s)   |  j  r% t t |  ƒ j | | ƒ n  d  S)N)ÚaliveÚsuperr   Úhandle_exit)r   ÚsigÚframe)Ú	__class__r   r   r   #   s    	zTornadoWorker.handle_exitc             C   sJ   |  j  d 7_  |  j rF |  j  |  j k rF |  j j d ƒ d |  _ n  d  S)Né   z,Autorestarting worker after current request.F)Únrr   Zmax_requestsÚlogÚinfo)r   r   r   r   Úhandle_request'   s    zTornadoWorker.handle_requestc             C   sN   |  j  r |  j ƒ  n  |  j t j ƒ  k rJ |  j j d |  ƒ d |  _  n  d  S)Nz!Parent changed, shutting down: %sF)r   ÚnotifyZppidÚosÚgetppidr   r   )r   r   r   r   Úwatchdog-   s
    	zTornadoWorker.watchdogc             C   sy   |  j  su |  j rV t |  d ƒ rJ y |  j j ƒ  WqJ t k
 rF YqJ Xn  d |  _ qu |  j j su |  j j ƒ  qu n  d  S)NÚserverF)r   Úserver_aliveÚhasattrr%   ÚstopÚ	ExceptionÚioloopZ
_callbacks)r   r   r   r   Ú	heartbeat5   s    		zTornadoWorker.heartbeatc                sA  t  j ƒ  ˆ _ d ˆ _ d ˆ _ t ˆ j d d ˆ j ƒj ƒ  t ˆ j d d ˆ j ƒj ƒ  ˆ j	 } t
 | t j j ƒ s“ t
 | t j	 j ƒ r¢ t | ƒ } n  t j d } t | d ƒ r| j j ‰ ‡ ‡ f d d †  } | | j _ | t j d <t j j } n+ G‡  ‡ f d	 d
 †  d
 t j j ƒ ‰  ˆ  } ˆ j j rt j ˆ j j ƒ } | d =| d =| | d ˆ j d | ƒ} n | | d ˆ j ƒ} | ˆ _ d ˆ _ xb ˆ j D]W } | j d ƒ t | d ƒ râ| j | ƒ q°t | d ƒ r°| | j  | j! ƒ  <q°q°Wˆ j j" d k | _# | j d d ƒ ˆ j j ƒ  d  S)NTFiè  Zio_loopztornado.httpserverÚHTTPConnectionc                s   ˆ j  ƒ  ˆ  |  ƒ d  S)N)r    )Úother)Úold_connection_finishr   r   r   ÚfinishY   s    
z!TornadoWorker.run.<locals>.finishc                   s(   e  Z d  Z ‡ ‡  ‡ f d d †  Z ‡  S)z&TornadoWorker.run.<locals>._HTTPServerc                s$   ˆ j  ƒ  t ˆ  |  ƒ j | ƒ d  S)N)r    r   Úon_close)ÚinstanceZserver_conn)Ú_HTTPServerr   r   r   r   r0   d   s    
z/TornadoWorker.run.<locals>._HTTPServer.on_close)Ú__name__Ú
__module__Ú__qualname__r0   r   )r2   r   )r   r   r2   b   s   r2   Údo_handshake_on_connectÚsuppress_ragged_eofsÚssl_optionsr   Ú
add_socketÚ_socketsZnum_processesr   )$r   r1   r*   r   r&   r   r$   Ústartr+   ZwsgiÚ
isinstanceÚtornador   ÚApplicationZWSGIApplicationr   r   r   r'   r,   r/   Ú
httpserverZ
HTTPServerÚcfgZis_sslÚcopyÚdeepcopyr8   r%   ZsocketsÚsetblockingr9   r:   ÚfilenoÚ	keepaliveZno_keep_alive)r   Zappr?   r/   Zserver_classZ_ssl_optr%   Úsr   )r2   r.   r   r   ÚrunB   sH    			%		zTornadoWorker.run)
r3   r4   r5   Úclassmethodr   r   r    r$   r+   rG   r   r   )r   r   r      s   r   )rA   r"   r   Ztornado.webr=   ÚImportErrorÚRuntimeErrorZtornado.httpserverZtornado.ioloopr   r   Ztornado.wsgir   Zgunicorn.workers.baser   Zgunicornr   r
   r   r   r   r   r   Ú<module>   s   