U
    Bf                     @   sD  d dl Z d dlZd dlmZ d dlmZ d dlZzd dlZW n ek
rX   edY n(X d dl	m
Z eejedk redd dlmZ d dlmZ d d	lmZmZmZ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G dd deZG dd deZG dd dej Z!G dd dej"Z#G dd deZ$dS )    N)datetime)partialz+gevent worker requires gevent 1.4 or higher)parsez1.4)Pool)StreamServer)hubmonkeysocketpywsgi)base_environ)ssl_context)AsyncWorkerzgevent/%s gunicorn/%sc                       sx   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
 fddZ fddZ fddZ  ZS )GeventWorkerNc                 C   sB   t   g }| jD ]$}|tj|jtj|j d q|| _d S )N)fileno)	r   Z	patch_allsocketsappendr	   ZFAMILYSOCK_STREAMsockr   )selfr   s r   </tmp/pip-unpacked-wheel-s8855r93/gunicorn/workers/ggevent.pypatch&   s    

zGeventWorker.patchc                    s4   t    | jt kr0| jd|  td d S )Nz!Parent changed, shutting down: %sr   )	supernotifyZppidosgetppidloginfosysexitr   	__class__r   r   r   0   s    
zGeventWorker.notifyc                 C   s   t | jjdS )NF)geventTimeoutcfg	keepaliver!   r   r   r   timeout_ctx6   s    zGeventWorker.timeout_ctxc           
   	   C   s  g }i }| j jrdt| j i}| jD ]}|d t| j}| jd k	rt| j }|	dt
d | j|f| j|| j| j|d|}n4t| j|}t|f||d|}| j jdkrd|_|  || q$| jr|   td qz|D ]*}t|dr|  t|d	r|  qt }t | | j jkrd
}	|D ]"}|j |jj kr@|	d7 }	q@|	spW d S |   td q"| j!d| j" |D ]}|j#dd qW n t$k
r   Y nX d S )Nr      T)zwsgi.multithreadSERVER_SOFTWARE)Zapplicationspawnr   Zhandler_classenviron)handler+   g      ?closekillr   z Worker graceful timeout (pid:%s))timeout)%r&   Zis_sslr   r   setblockingr   Zworker_connectionsserver_classr   updateVERSIONZwsgir   wsgi_handlerr   r-   r   workersZ
max_acceptstartr   aliver   r$   sleephasattrr.   r/   timeZgraceful_timeoutpoolZ
free_countsizewarningpidstop	Exception)
r   ZserversZssl_argsr   r<   r,   serverZhfuntsZ	acceptingr   r   r   run9   sl    




   

zGeventWorker.runc                    s   | d t ||| d S )Nr)   )r1   r   r-   )r   Zlistenerclientaddrr"   r   r   r-   x   s    
zGeventWorker.handlec                    sD   zt  |||| W n( tjk
r,   Y n tk
r>   Y nX d S N)r   handle_requestr$   ZGreenletExit
SystemExit)r   Zlistener_namereqr   rF   r"   r   r   rH   ~   s    zGeventWorker.handle_requestc                    s   t t j|| d S rG   )r$   r+   r   handle_quitr   sigframer"   r   r   rK      s    zGeventWorker.handle_quitc                    s   t t j|| d S rG   )r$   r+   r   handle_usr1rL   r"   r   r   rO      s    zGeventWorker.handle_usr1c                    s   |    t  t   d S rG   )r   r   reinitr   init_processr!   r"   r   r   rQ      s    zGeventWorker.init_process)__name__
__module____qualname__r2   r5   r   r   r(   rD   r-   rH   rK   rO   rQ   __classcell__r   r   r"   r   r   !   s   
?r   c                   @   s    e Zd ZdZdZdZdd ZdS )GeventResponseNc                 C   s   || _ || _|| _d S rG   )statusheaderssent)r   rW   rX   clengthr   r   r   __init__   s    zGeventResponse.__init__)rR   rS   rT   rW   rX   rY   r[   r   r   r   r   rV      s   rV   c                       s$   e Zd Zdd Z fddZ  ZS )PyWSGIHandlerc                 C   sp   t | j}t | j}|| }t| di }t| j|| j}t| drR| j	
 }ng }| jj||| j| d S )Nresponse_headersrX   )r   fromtimestampZ
time_startZtime_finishgetattrrV   rW   Zresponse_lengthr:   rX   itemsrB   r   accessr,   )r   r7   finishZresponse_timeZresp_headersrespZreq_headersr   r   r   log_request   s    
zPyWSGIHandler.log_requestc                    s"   t   }| j|d< | j|d< |S )Nzgunicorn.sockZRAW_URI)r   get_environr	   path)r   envr"   r   r   re      s    


zPyWSGIHandler.get_environ)rR   rS   rT   rd   re   rU   r   r   r"   r   r\      s   r\   c                   @   s   e Zd ZdS )PyWSGIServerN)rR   rS   rT   r   r   r   r   rh      s   rh   c                   @   s   e Zd ZdZeZeZdS )GeventPyWSGIWorkerz&The Gevent StreamServer based workers.N)rR   rS   rT   __doc__rh   r2   r\   r5   r   r   r   r   ri      s   ri   )%r   r   r   	functoolsr   r;   r$   ImportErrorRuntimeErrorZpackaging.versionr   parse_version__version__Zgevent.poolr   Zgevent.serverr   r   r   r	   r
   ZgunicornZgunicorn.http.wsgir   Zgunicorn.sockr   Zgunicorn.workers.base_asyncr   r4   r   objectrV   ZWSGIHandlerr\   Z
WSGIServerrh   ri   r   r   r   r   <module>   s0   u