a
    �ÏOcQ  ã                   @   sÔ   d dl mZ d dlZzd dlZW n ey:   edƒ‚Y n(0 d dlmZ eejƒedƒk rbedƒ‚d dlm	Z	m
Z
 d dlmZ d dlmZ d dlZd d	lmZ dd
d„Zdd„ Zdd„ Zdd„ ZG dd„ deƒZdS )é    )ÚpartialNz2eventlet worker requires eventlet 0.24.1 or higher)Úparse_versionz0.24.1)ÚhubsÚgreenthread)ÚGreenSocket)ÚALREADY_HANDLED)ÚAsyncWorkerc           
   
   C   s  |   ¡ dkrtdƒ‚|r"| |¡ |r0t|dƒnd}d}|j}| j}z¢|rbt|| |ƒ}|dkrbqÀt||ƒƒ}|stqÀz||ƒ}	W n ty–   Y qtY qt0 ||	7 }|	t|ƒk r¾||	d … }qtqFqtqF|W |dkrät	|dƒrä| || ¡ S n&|dk�rt	|dƒ�r| || ¡ 0 d S )Nr   z&non-blocking sockets are not supportedi    Úseek)
Ú
gettimeoutÚ
ValueErrorr	   ÚminÚreadÚsendÚ
memoryviewÚBlockingIOErrorÚlenÚhasattr)
ÚselfÚfileÚoffsetÚcountÚ	blocksizeÚ
total_sentÚ	file_readÚ	sock_sendÚdataÚsent© r   úQ/var/www/html/gsl.tools/lib/python3.9/site-packages/gunicorn/workers/geventlet.pyÚ_eventlet_socket_sendfile   s@    

ý ÿr   c                 C   sz   t j |¡}t j ¡ }z6|  ¡ \}}| |||¡}| t||¡ d\}}}W q t j	yr   |  
¡  | ¡  Y dS 0 qdS )zÑ
    Serve requests forever.

    This code is nearly identical to ``eventlet.convenience.serve`` except
    that it attempts to join the pool at the end, which allows for gunicorn
    graceful shutdowns.
    )NNNN)ÚeventletZ	greenpoolZ	GreenPoolr   Z
getcurrentÚacceptÚspawnÚlinkÚ_eventlet_stopÚ	StopServeÚcloseZwaitall)ÚsockÚhandleZconcurrencyÚpoolZ	server_gtÚconnÚaddrÚgtr   r   r   Ú_eventlet_serveA   s    
r-   c                 C   sd   z$z|   ¡  W | ¡  n
| ¡  0 W n: tjy8   Y n( ty^   tj|gt ¡ ¢R Ž  Y n0 dS )z¯
    Stop a greenlet handling a request and close its connection.

    This code is lifted from eventlet so as not to depend on undocumented
    functions in the library.
    N)	Úwaitr&   ÚgreenletZGreenletExitÚ	Exceptionr   ÚkillÚsysÚexc_info)ÚclientÚserverr*   r   r   r   r$   X   s    
r$   c                   C   s   t tdƒstt_d S )NÚsendfile)r   r   r   r6   r   r   r   r   Úpatch_sendfilej   s    

r7   c                       sd   e Zd Zdd„ Z‡ fdd„Z‡ fdd„Z‡ fdd„Z‡ fd	d
„Zdd„ Z‡ fdd„Z	dd„ Z
‡  ZS )ÚEventletWorkerc                 C   s   t  ¡  t ¡  tƒ  d S ©N)r   Zuse_hubr    Zmonkey_patchr7   ©r   r   r   r   Úpatchz   s    zEventletWorker.patchc                    s   |t krtƒ ‚tƒ  |¡S r9   )ÚEVENTLET_ALREADY_HANDLEDÚStopIterationÚsuperÚis_already_handled)r   Zrespiter©Ú	__class__r   r   r?      s    z!EventletWorker.is_already_handledc                    s   |   ¡  tƒ  ¡  d S r9   )r;   r>   Úinit_processr:   r@   r   r   rB   „   s    zEventletWorker.init_processc                    s   t  tƒ j||¡ d S r9   )r    r"   r>   Úhandle_quit©r   ÚsigÚframer@   r   r   rC   ˆ   s    zEventletWorker.handle_quitc                    s   t  tƒ j||¡ d S r9   )r    r"   r>   Úhandle_usr1rD   r@   r   r   rG   ‹   s    zEventletWorker.handle_usr1c                 C   s   t  | jjpd d¡S )NF)r    ÚTimeoutÚcfgÚ	keepaliver:   r   r   r   Útimeout_ctxŽ   s    zEventletWorker.timeout_ctxc                    s6   | j jr"tj|fddi| j j¤Ž}tƒ  |||¡ d S )NÚserver_sideT)rI   Zis_sslr    Zwrap_sslZssl_optionsr>   r(   )r   Zlistenerr4   r+   r@   r   r   r(   ‘   s
    ÿzEventletWorker.handlec           	   
   C   s  g }| j D ]H}t|ƒ}| d¡ t| j|ƒ}t t||| j¡}| 	|¡ t 
d¡ q
| jrn|  ¡  t 
d¡ qT|  ¡  z\t | jj¡�:}|D ]}| t ¡ ¡ qŒ|D ]}| ¡  q¤W d   ƒ n1 sÆ0    Y  W nD tj�y } z(||krð‚ |D ]}| ¡  qôW Y d }~n
d }~0 0 d S )Né   g        g      ð?)Zsocketsr   Úsetblockingr   r(   r    r"   r-   Zworker_connectionsÚappendÚsleepÚaliveÚnotifyrH   rI   Zgraceful_timeoutr1   r%   r.   )	r   Z	acceptorsr'   ZgsockZhfunZacceptorÚtÚaÚter   r   r   Úrun˜   s2    


ÿ
,zEventletWorker.run)Ú__name__Ú
__module__Ú__qualname__r;   r?   rB   rC   rG   rK   r(   rV   Ú__classcell__r   r   r@   r   r8   x   s   r8   )r   N)Ú	functoolsr   r2   r    ÚImportErrorÚRuntimeErrorÚpkg_resourcesr   Ú__version__r   r   Zeventlet.greenior   Zeventlet.wsgir   r<   r/   Zgunicorn.workers.base_asyncr   r   r-   r$   r7   r8   r   r   r   r   Ú<module>   s$   
'