o
    2cQ                     @   s   d dl mZ d dlZzd dlZW n ey   edw d dlmZ eejedk r/e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|| |rt|dnd}d}|j}| j}zR	 |r2t|| |}|dkr2n.t||}|s;n%	 z||}	W n	 tyK   Y q;w ||	7 }|	t|k r]||	d  }nnq<q$|W |dkrst	|drt|||  S S S |dkrt	|dr|||  w w w )Nr   z&non-blocking sockets are not supportedi    Tseek)

gettimeout
ValueErrorr	   minreadsend
memoryviewBlockingIOErrorlenhasattr)
selffileoffsetcount	blocksize
total_sent	file_read	sock_senddatasent r   P/var/www/html/gps/gps/lib/python3.10/site-packages/gunicorn/workers/geventlet.py_eventlet_socket_sendfile   sF   
r   c                 C   sx   t j|}t j }	 z|  \}}||||}|t|| d\}}}W n t j	y:   | 
  |  Y dS w q)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.
    T)NNNN)eventlet	greenpool	GreenPoolr   
getcurrentacceptspawnlink_eventlet_stop	StopServeclosewaitall)sockhandleconcurrencypool	server_gtconnaddrgtr   r   r   _eventlet_serveA   s   
r3   c                 C   sd   zz|    W |  W dS |  w  tjy   Y dS  ty1   tj|gt R   Y dS w )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)   greenletGreenletExit	Exceptionr   killsysexc_info)clientserverr0   r   r   r   r'   X   s   
r'   c                   C   s   t tds
tt_d S d S )Nsendfile)r   r   r   r=   r   r   r   r   patch_sendfilej   s   


r>   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   use_hubr    monkey_patchr>   r   r   r   r   patchz   s   
zEventletWorker.patchc                    s   |t krt t |S r@   )EVENTLET_ALREADY_HANDLEDStopIterationsuperis_already_handled)r   respiter	__class__r   r   rH      s   z!EventletWorker.is_already_handledc                    s   |    t   d S r@   )rD   rG   init_processrC   rJ   r   r   rL      s   zEventletWorker.init_processc                       t t j|| d S r@   )r    r%   rG   handle_quitr   sigframerJ   r   r   rN         zEventletWorker.handle_quitc                    rM   r@   )r    r%   rG   handle_usr1rO   rJ   r   r   rS      rR   zEventletWorker.handle_usr1c                 C   s   t | jjpd dS )NF)r    Timeoutcfg	keepaliverC   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)rU   is_sslr    wrap_sslssl_optionsrG   r,   )r   listenerr;   r1   rJ   r   r   r,      s
   zEventletWorker.handlec           	   
   C   s"  g }| j D ]$}t|}|d t| j|}tt||| j}|	| t
d q| jr9|   t
d | js-|   z1t| jj}|D ]	}|t  qH|D ]}|  qTW d    W d S 1 sgw   Y  W d S  tjy } z||kr| |D ]}|  q~W Y d }~d S d }~ww )N   g        g      ?)socketsr   setblockingr   r,   r    r%   r3   worker_connectionsappendsleepalivenotifyrT   rU   graceful_timeoutr8   r(   r4   )	r   	acceptorsr+   gsockhfunacceptortater   r   r   run   s>   





&
zEventletWorker.run)__name__
__module____qualname__rD   rH   rL   rN   rS   rW   r,   rm   __classcell__r   r   rJ   r   r?   x   s    r?   )r   N)	functoolsr   r9   r    ImportErrorRuntimeErrorpkg_resourcesr   __version__r   r   eventlet.greenior   eventlet.wsgir   rE   r5   gunicorn.workers.base_asyncr   r   r3   r'   r>   r?   r   r   r   r   <module>   s(   
'