U
    +5øiŽ  ã                   @   sB  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 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 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-pa3uujlc/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dt| j ƒi}| jD ]¨}| d¡ t| jƒ}| jd k	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�r@|	d7 }	�q@|	�spW d S |  ¡  t d¡ �q"| j !d| j"¡ |D ]}|j#dd� �qšW 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   Úrun8   sl    




þÿ   þý

zGeventWorker.runc                    s   |  d¡ tƒ  |||¡ d S )Nr)   )r1   r   r-   )r   ZlistenerÚclientÚaddrr"   r   r   r-   w   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   sŠ   t  | j¡}t  | j¡}|| }t| di ƒ}t| jtƒrB| j ¡ n| j}t	||| j
ƒ}t| dƒrl| j ¡ }ng }| jj ||| j|¡ d S )NÚresponse_headersrX   )r   ÚfromtimestampZ
time_startZtime_finishÚgetattrÚ
isinstancerW   ÚbytesÚdecoderV   Zresponse_lengthr:   rX   ÚitemsrB   r   Úaccessr,   )r   r7   ÚfinishZresponse_timeZresp_headersrW   Ú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)rR   rS   rT   rg   rh   rU   r   r   r"   r   r\   ¡   s   r\   c                   @   s   e Zd ZdS )ÚPyWSGIServerN)rR   rS   rT   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)rR   rS   rT   Ú__doc__rk   r2   r\   r5   r   r   r   r   rl   ¾   s   rl   )$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   rV   ZWSGIHandlerr\   Z
WSGIServerrk   rl   r   r   r   r   Ú<module>   s0   u