o
    i                     @   s<  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 dlmZ dejejf ZG dd deZG dd d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 24.10.1 or higher)parsez24.10.1)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   	patch_allsocketsappendr	   FAMILYSOCK_STREAMsockdetach)selfr   s r   L/home/ubuntu/.local/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notify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dt| j i}| jD ]T}|d t| j}| jd urCt| j }|	dt
d | j|f| j|| j| j|d|}nt| j|}t|f||d|}| j jdkr]d|_|  || q| jrv|   td | jsjzY|D ]}|  qyt }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 )Nr      T)zwsgi.multithreadSERVER_SOFTWARE)applicationspawnr!   handler_classenviron)handler0   g      ?r   z Worker graceful timeout (pid:%s))timeout)#r*   is_sslr   r   setblockingr   worker_connectionsserver_classr   updateVERSIONwsgir!   wsgi_handlerr   r3   r   workers
max_acceptstartr   aliver   r(   sleepclosetimegraceful_timeoutpool
free_countsizewarningpidstop	Exception)
r   serversssl_argsr   rE   r2   serverhfunts	acceptingr   r   r   run8   sj   








zGeventWorker.runc                    s   | d t ||| d S )Nr-   )r6   r   r3   )r   listenerclientaddrr&   r   r   r3   t   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(   GreenletExit
SystemExit)r   listener_namereqr   rU   r&   r   r   rW   z   s   zGeventWorker.handle_requestc                       t t j|| d S rV   )r(   r0   r   handle_quitr   sigframer&   r   r   r]         zGeventWorker.handle_quitc                    r\   rV   )r(   r0   r   handle_usr1r^   r&   r   r   rb      ra   zGeventWorker.handle_usr1c                    s   |    t  t   d S rV   )r   r   reinitr   init_processr%   r&   r   r   rd      s   zGeventWorker.init_process)__name__
__module____qualname__r8   r<   r   r   r,   rR   r3   rW   r]   rb   rd   __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 rV   )statusheaderssent)r   rj   rk   clengthr   r   r   __init__   s   
zGeventResponse.__init__)re   rf   rg   rj   rk   rl   rn   r   r   r   r   ri      s
    ri   c                       s$   e Zd Zdd Z fddZ  ZS )PyWSGIHandlerc                 C   s   t | j}t | j}|| }t| di }t| jtr!| j n| j}t	||| j
}t| dr6| j }ng }| jj||| j| d S )Nresponse_headersrk   )r   fromtimestamp
time_starttime_finishgetattr
isinstancerj   bytesdecoderi   response_lengthhasattrrk   itemsrN   r!   accessr2   )r   r?   finishresponse_timeresp_headersrj   respreq_headersr   r   r   log_request   s   
zPyWSGIHandler.log_requestc                    s"   t   }| j|d< | j|d< |S )Nzgunicorn.sockRAW_URI)r   get_environr	   path)r   envr&   r   r   r      s   


zPyWSGIHandler.get_environ)re   rf   rg   r   r   rh   r   r   r&   r   ro      s    ro   c                   @   s   e Zd ZdS )PyWSGIServerN)re   rf   rg   r   r   r   r   r      s    r   c                   @   s   e Zd ZdZeZeZdS )GeventPyWSGIWorkerz&The Gevent StreamServer based workers.N)re   rf   rg   __doc__r   r8   ro   r<   r   r   r   r   r      s    r   )$r   r#   r   	functoolsr   rC   r(   ImportErrorRuntimeErrorpackaging.versionr   parse_version__version__gevent.poolr   gevent.serverr   r   r   r	   r
   gunicorngunicorn.http.wsgir   gunicorn.sockr   gunicorn.workers.base_asyncr   r:   r   ri   WSGIHandlerro   
WSGIServerr   r   r   r   r   r   <module>   s4   r