o
    be                     @   s2  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y)   edw d dl	m
Z
 e
eje
dk r=e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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)parse_versionz1.4)Pool)StreamServer)hubmonkeysocketpywsgi)base_environ)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   W/var/www/secure340b-portal/env/lib/python3.10/site-packages/gunicorn/workers/ggevent.pypatch%   s   


zGeventWorker.patchc                    s8   t    | jt kr| jd|  td d S d S )Nz!Parent changed, shutting down: %sr   )	supernotifyZppidosgetppidloginfosysexitr   	__class__r   r   r   /   s
   
zGeventWorker.notifyc                 C   s   t | jjdS )NF)geventTimeoutcfg	keepaliver    r   r   r   timeout_ctx5   s   zGeventWorker.timeout_ctxc           
   	   C   s  g }i }| j jrtdddi| j j}| jD ]T}|d t| j}| jd urGt	| j }|
dtd | j|f| j|| j| j|d|}nt| j|}t|f||d|}| j jdkrad|_|  || q| jrz|   td | jsnzh|D ]}t|dr|  t|d	r|  q}t }t | | j jkrd
}	|D ]}|j  |jj!kr|	d7 }	q|	sW d S |   td t | | j jks| j"d| j#  |D ]}|j$dd qW d S  t%y   Y d S w )Nserver_sideT   )zwsgi.multithreadSERVER_SOFTWARE)Zapplicationspawnr   Zhandler_classenviron)handler+   g      ?closekillr   z Worker graceful timeout (pid:%s))timeoutr   )&r%   Zis_ssldictZssl_optionsr   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   run8   sr   









zGeventWorker.runc                    s   | d t ||| d S )Nr)   )r2   r   r-   )r   Zlistenerclientaddrr!   r   r   r-   w   s   
zGeventWorker.handlec                    sB   zt  |||| W d S  tjy   Y d S  ty    Y d S w N)r   handle_requestr#   ZGreenletExit
SystemExit)r   Zlistener_namereqr   rG   r!   r   r   rI   }   s   zGeventWorker.handle_requestc                       t t j|| d S rH   )r#   r+   r   handle_quitr   sigframer!   r   r   rM         zGeventWorker.handle_quitc                    rL   rH   )r#   r+   r   handle_usr1rN   r!   r   r   rR      rQ   zGeventWorker.handle_usr1c                    s   |    t  t   d S rH   )r   r   reinitr   init_processr    r!   r   r   rT      s   zGeventWorker.init_process)__name__
__module____qualname__r3   r6   r   r   r'   rE   r-   rI   rM   rR   rT   __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 rH   )statusheaderssent)r   rZ   r[   clengthr   r   r   __init__   s   
zGeventResponse.__init__)rU   rV   rW   rZ   r[   r\   r^   r   r   r   r   rY      s
    rY   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r)| j	
 }ng }| jj||| j| d S )Nresponse_headersr[   )r   fromtimestampZ
time_startZtime_finishgetattrrY   rZ   Zresponse_lengthr;   r[   itemsrC   r   accessr,   )r   r8   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   rh      s   


zPyWSGIHandler.get_environ)rU   rV   rW   rg   rh   rX   r   r   r!   r   r_      s    r_   c                   @   s   e Zd ZdS )PyWSGIServerN)rU   rV   rW   r   r   r   r   rk      s    rk   c                   @   s   e Zd ZdZeZeZdS )GeventPyWSGIWorkerz&The Gevent StreamServer based workers.N)rU   rV   rW   __doc__rk   r3   r_   r6   r   r   r   r   rl      s    rl   )"r   r   r   	functoolsr   r<   r#   ImportErrorRuntimeErrorpkg_resourcesr   __version__Zgevent.poolr   Zgevent.serverr   r   r   r	   r
   ZgunicornZgunicorn.http.wsgir   Zgunicorn.workers.base_asyncr   r5   r   objectrY   ZWSGIHandlerr_   Z
WSGIServerrk   rl   r   r   r   r   <module>   s2   u