o
    bQ                     @   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   Y/var/www/secure340b-portal/env/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)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 |  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&   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 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                       t t j|| d S r9   )r    r"   r>   handle_quitr   sigframer@   r   r   rD         zEventletWorker.handle_quitc                    rC   r9   )r    r"   r>   handle_usr1rE   r@   r   r   rI      rH   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)rK   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 ]$}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"   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   s>   





&
zEventletWorker.run)__name__
__module____qualname__r;   r?   rB   rD   rI   rM   r(   rY   __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(   
'