a
    &Úwhµ  ã                   @   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Zd dlZd dlmZ d d	lmZ eejd
dƒZeejddƒ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)Úparsez0.24.1)ÚhubsÚgreenthread)ÚGreenSocket)ÚAsyncWorker)Ússl_wrap_socketZ
WSGI_LOCALZALREADY_HANDLEDc           
   
   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   úT/var/www/battlenet.uz/venv/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_serveE   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$   \   s    
r$   c                   C   s   t tdƒstt_d S )NÚsendfile)r   r   r   r6   r   r   r   r   Úpatch_sendfilen   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   Úpatch~   s    zEventletWorker.patchc                    s,   t tdd ƒrtƒ ‚|tkr tƒ ‚tƒ  |¡S )NZalready_handled)ÚgetattrÚEVENTLET_WSGI_LOCALÚStopIterationÚEVENTLET_ALREADY_HANDLEDÚsuperÚis_already_handled)r   Zrespiter©Ú	__class__r   r   rA   ƒ   s
    z!EventletWorker.is_already_handledc                    s   |   ¡  tƒ  ¡  d S r9   )r;   r@   Úinit_processr:   rB   r   r   rD   Œ   s    zEventletWorker.init_processc                    s   t  tƒ j||¡ d S r9   )r    r"   r@   Úhandle_quit©r   ÚsigÚframerB   r   r   rE      s    zEventletWorker.handle_quitc                    s   t  tƒ j||¡ d S r9   )r    r"   r@   Úhandle_usr1rF   rB   r   r   rI   “   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                    s(   | j jrt|| j ƒ}tƒ  |||¡ d S r9   )rK   Zis_sslr   r@   r(   )r   Zlistenerr4   r+   rB   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|  ¡  d }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ÚnotifyrJ   rK   Zgraceful_timeoutr1   r%   r.   )	r   Z	acceptorsr'   ZgsockZhfunZacceptorÚtÚaÚter   r   r   Úrunž   s4    


ÿ
,zEventletWorker.run)Ú__name__Ú
__module__Ú__qualname__r;   rA   rD   rE   rI   rM   r(   rW   Ú__classcell__r   r   rB   r   r8   |   s   	r8   )r   N)Ú	functoolsr   r2   r    ÚImportErrorÚRuntimeErrorZpackaging.versionr   Úparse_versionÚ__version__r   r   Zeventlet.greenior   Zeventlet.wsgir/   Zgunicorn.workers.base_asyncr   Zgunicorn.sockr   r<   Zwsgir=   r?   r   r-   r$   r7   r8   r   r   r   r   Ú<module>   s*   
&