
y X                 @   s  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 e d  Z e j	 d k r{ d e j
 d <n  y d  d l Z Wn e k
 r e d   Yn Xd  d	 l m Z d  d
 l m Z d  d l m Z 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 d e j e j f Z d d   Z d d   Z  Gd d   d e  Z! Gd d   d e"  Z# Gd d   d e j$  Z% Gd d   d e j&  Z' Gd d   d e!  Z( d S)    N)datetime)partialsocketdarwin1ZEVENT_NOKQUEUEz-You need gevent installed to use this worker.)Pool)StreamServer)
wait_writer   )pywsgi)base_environ)AsyncWorker)sendfilezgevent/%s gunicorn/%sc             C   sp   xi y t  |  | | |  SWq t k
 rg } z+ | j d t j k rR t |   n   WYd  d  } ~ Xq Xq Wd  S)Nr   )
o_sendfileOSErrorargserrnoEAGAINr	   )fdoutZfdinoffsetnbytese r   H/home/ubuntu/projects/ifolica/build/gunicorn/gunicorn/workers/ggevent.py_gevent_sendfile#   s    r   c              C   s3   d d l  m }  t d  k	 r/ t |  d t  n  d  S)Nr   )wsgir   )Zgunicorn.httpr   r   setattrr   )r   r   r   r   patch_sendfile-   s    r   c                   s   e  Z d  Z d Z d Z d d   Z   f d d   Z d d   Z d d	   Z   f d
 d   Z	   f d d   Z
 e j d d k r   f d d   Z n   f d d   Z   S)GeventWorkerNc             C   s   d d l  m } d | _ t  j d d k r9 | j   n | j d d  t   g  } xt |  j D]i } t j d d k r | j t	 | j
 t j d | j j    q` | j t	 | j
 t j d |  q` W| |  _ d  S)	Nr   )monkeyF
subprocessT   fileno_sock)geventr   Znoisyversion_infoZ	patch_allr   socketssysappendr   ZFAMILY_socketSOCK_STREAMsockr!   )selfr   r%   sr   r   r   patch9   s    	zGeventWorker.patchc                sO   t  t |   j   |  j t j   k rK |  j j d |   t j	 d  n  d  S)Nz!Parent changed, shutting down: %sr   )
superr   notifyZppidosgetppidloginfor&   exit)r+   )	__class__r   r   r/   Q   s    zGeventWorker.notifyc             C   s   t  j |  j j d  S)NF)r#   Timeoutcfg	keepalive)r+   r   r   r   timeout_ctxW   s    zGeventWorker.timeout_ctxc       
      C   sV  g  } i  } |  j  j r3 t d d |  j  j  } n  x |  j D] } | j d  t |  j  } |  j d  k	 r t	 |  j   } | j
 i d d 6t d 6 |  j | d |  j d | d |  j d	 |  j d
 | | } n- t |  j |  } t | d | d | | } | j   | j |  q= Wx$ |  j rB|  j   t j d  qWyxF | D]> } t | d  ro| j   n  t | d  rM| j   qMqMWt j   } x t j   | |  j  j k rd }	 x6 | D]. } | j j   | j j k r|	 d 7}	 qqW|	 sd  S|  j   t j d  qW|  j j  d |  j!  d d   | D Wn Yn Xd  S)Nserver_sideT   zwsgi.multithreadZSERVER_SOFTWAREZapplicationspawnr2   Zhandler_classenvironhandleg      ?closekillr   z Worker graceful timeout (pid:%s)c             S   s"   g  |  ] } | j  d  d   q S)timeoutr;   )stop).0serverr   r   r   
<listcomp>   s   	 z$GeventWorker.run.<locals>.<listcomp>)"r7   Zis_ssldictZssl_optionsr%   setblockingr   Zworker_connectionsserver_classr   updateVERSIONr   r2   wsgi_handlerr   r>   r   startr'   aliver/   r#   sleephasattrr?   r@   timeZgraceful_timeoutpoolZ
free_countsizewarningpid)
r+   ZserversZssl_argsr,   rQ   r=   rD   ZhfuntsZ	acceptingr   r   r   runZ   sV    	


zGeventWorker.runc                sG   y t  t |   j |   Wn& t j k
 r1 Yn t k
 rB Yn Xd  S)N)r.   r   handle_requestr#   ZGreenletExit
SystemExit)r+   r   )r5   r   r   rW      s    zGeventWorker.handle_requestc                s#   t  j t t |   j | |  d  S)N)r#   r<   r.   r   handle_quit)r+   sigframe)r5   r   r   rY      s    zGeventWorker.handle_quitr   c                sZ   |  j    d d  l } | j j   | j j d d  | j j   t t |   j   d  S)Nr   Zfail_requestsr;   )	r-   Zgevent.corecorereinitZdns_shutdownZdns_initr.   r   init_process)r+   r#   )r5   r   r   r^      s    
zGeventWorker.init_processc                s;   |  j    d d l m } | j   t t |   j   d  S)Nr   )hub)r-   r#   r_   r]   r.   r   r^   )r+   r_   )r5   r   r   r^      s    

)__name__
__module____qualname__rH   rK   r-   r/   r9   rV   rW   rY   r#   r$   r^   r   r   )r5   r   r   4   s   <r   c               @   s.   e  Z d  Z d Z d Z d Z d d   Z d S)GeventResponseNc             C   s   | |  _  | |  _ | |  _ d  S)N)statusheaderssent)r+   rd   re   clengthr   r   r   __init__   s    		zGeventResponse.__init__)r`   ra   rb   rd   re   rf   rh   r   r   r   r   rc      s   rc   c                   s.   e  Z d  Z d d   Z   f d d   Z   S)PyWSGIHandlerc             C   s   t  j |  j  } t  j |  j  } | | } t |  d i   } t |  j | |  j  } t |  d  r d d   |  j	 j	 D } n g  } |  j
 j j | | |  j |  d  S)NZresponse_headersre   c             S   s"   g  |  ] } | j  d  d   q S):r;   )split)rC   hr   r   r   rE      s   	 z-PyWSGIHandler.log_request.<locals>.<listcomp>)r   fromtimestampZ
time_startZtime_finishgetattrrc   rd   Zresponse_lengthrO   re   rD   r2   accessr=   )r+   rL   finishZresponse_timeZresp_headersrespZreq_headersr   r   r   log_request   s    
zPyWSGIHandler.log_requestc                s3   t  t |   j   } |  j | d <|  j | d <| S)Nzgunicorn.sockZRAW_URI)r.   ri   get_environr   path)r+   env)r5   r   r   rs      s    zPyWSGIHandler.get_environ)r`   ra   rb   rr   rs   r   r   )r5   r   ri      s   ri   c               @   s   e  Z d  Z d S)PyWSGIServerN)r`   ra   rb   r   r   r   r   rv      s   rv   c               @   s"   e  Z d  Z d Z e Z e Z d S)GeventPyWSGIWorkerz&The Gevent StreamServer based workers.N)r`   ra   rb   __doc__rv   rH   ri   rK   r   r   r   r   rw      s   rw   ))r   r0   r&   r   	functoolsr   rP   
__import__r(   platformr=   r#   ImportErrorRuntimeErrorZgevent.poolr   Zgevent.serverr   Zgevent.socketr	   r   r
   ZgunicornZgunicorn.http.wsgir   Zgunicorn.workers.asyncr   r   r   __version__rJ   r   r   r   objectrc   ZWSGIHandlerri   Z
WSGIServerrv   rw   r   r   r   r   <module>   s8   
