a
    �ÏOce  ã                   @   s6  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yV   edƒ‚Y n(0 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   úO/var/www/html/gsl.tools/lib/python3.9/site-packages/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   /   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f ddi| j j¤Ž}| jD ]¨}| d¡ t| jƒ}| jd urŽt	| j ƒ}| 
dtdœ¡ | j|f| j|| j| j|dœ|¤Ž}n4t| j|ƒ}t|f||dœ|¤Ž}| j jdkrÂd|_| ¡  | |¡ q,| jrð|  ¡  t d¡ qÖzÊ|D ]*}t|dƒ�r| ¡  t|d	ƒrö| ¡  qöt ¡ }t ¡ | | j jk�rŽd
}	|D ]"}|j  ¡ |jj!k�rH|	d7 }	�qH|	�sxW d S |  ¡  t d¡ �q*| j "d| j# ¡ |D ]}|j$dd� �q¤W n t%�yÎ   Y n0 d S )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))Útimeout)&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   sf    




þÿ
þý

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                    s@   zt ƒ  ||||¡ W n$ tjy*   Y n ty:   Y n0 d S ©N)r   Úhandle_requestr#   ZGreenletExitÚ
SystemExit)r   Zlistener_nameÚreqr   rG   r!   r   r   rI   }   s    zGeventWorker.handle_requestc                    s   t  tƒ j||¡ d S rH   )r#   r+   r   Úhandle_quit©r   ÚsigÚframer!   r   r   rL   …   s    zGeventWorker.handle_quitc                    s   t  tƒ j||¡ d S rH   )r#   r+   r   Úhandle_usr1rM   r!   r   r   rP   Š   s    zGeventWorker.handle_usr1c                    s   |   ¡  t ¡  tƒ  ¡  d S rH   )r   r   Úreinitr   Úinit_processr    r!   r   r   rR   �   s    zGeventWorker.init_process)Ú__name__Ú
__module__Ú__qualname__r3   r6   r   r   r'   rE   r-   rI   rL   rP   rR   Ú__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   rX   rY   Úclengthr   r   r   Ú__init__›   s    zGeventResponse.__init__)rS   rT   rU   rX   rY   rZ   r\   r   r   r   r   rW   •   s   rW   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_headersrY   )r   ÚfromtimestampZ
time_startZtime_finishÚgetattrrW   rX   Zresponse_lengthr;   rY   Ú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   rf   ¯   s    


zPyWSGIHandler.get_environ)rS   rT   rU   re   rf   rV   r   r   r!   r   r]   ¡   s   r]   c                   @   s   e Zd ZdS )ÚPyWSGIServerN)rS   rT   rU   r   r   r   r   ri   ¶   s   ri   c                   @   s   e Zd ZdZeZeZdS )ÚGeventPyWSGIWorkerz&The Gevent StreamServer based workers.N)rS   rT   rU   Ú__doc__ri   r3   r]   r6   r   r   r   r   rj   º   s   rj   )"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   ÚobjectrW   ZWSGIHandlerr]   Z
WSGIServerri   rj   r   r   r   r   Ú<module>   s.   u