U
    i                     @   s   d dl mZ d dlZzd dlZW n ek
r<   edY n(X d dlmZ eej	edk rde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rbqt||}|stqz||}	W n tk
r   Y qtY qtX ||	7 }|	t	|k r||	d  }qtqFqtqF|W S |dkrt|dr|||  X d S )Nr   z&non-blocking sockets are not supportedi    seek)

gettimeout
ValueErrorr	   minreadsendhasattr
memoryviewBlockingIOErrorlen)
selffileoffsetcount	blocksize
total_sent	file_read	sock_senddatasent r   P/var/www/SKSBV.IN/venv/lib/python3.8/site-packages/gunicorn/workers/geventlet.py_eventlet_socket_sendfile   s6    

r   c                 C   s|   t j|}t j }z6|  \}}||||}|t|| d\}}}W q t j	k
rt   | 
  |  Y dS X 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   s^   zz|   W 5 |   X W n< tjk
r2   Y n( tk
rX   tj|ft   Y nX 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)	r&   wait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 }zHt| jj0}|D ]}|t  q|D ]}|  qW 5 Q R X W nB tjk
r } z ||kr |D ]}|  qW 5 d }~X Y nX 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*   
&