o
    i<                     @   s  d dl Z e jdedd zd dlZW n ey   edw d dlmZ eej	edk r1ede
  d dlmZ d dlZ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 )    NzThe eventlet worker is deprecated and will be removed in Gunicorn 26.0. Please migrate to gevent, gthread, or another supported worker type. See: https://docs.gunicorn.org/en/stable/design.html#choosing-a-worker-type   )
stacklevelz2eventlet worker requires eventlet 0.40.3 or higher)parsez0.40.3)partial)hubsgreenthread)GreenSocket)AsyncWorker)ssl_wrap_socket
WSGI_LOCALALREADY_HANDLEDc           
   
   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!   N/home/ubuntu/.local/lib/python3.10/site-packages/gunicorn/workers/geventlet.py_eventlet_socket_sendfile7   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_serve]   s   
r7   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serverr4   r!   r!   r"   r+   t   s   
r+   c                   C   s   t tds
tt_d S d S )Nsendfile)r   r   r#   rA   r!   r!   r!   r"   patch_sendfile   s   


rB   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  d S N)r   use_hubrB   r   r!   r!   r"   patch   s   
zEventletWorker.patchc                    s,   t tdd r	t |tkrt t |S )Nalready_handled)getattrEVENTLET_WSGI_LOCALStopIterationEVENTLET_ALREADY_HANDLEDsuperis_already_handled)r   respiter	__class__r!   r"   rN      s
   z!EventletWorker.is_already_handledc                    s"   | j d |   t   d S )NzThe eventlet worker is DEPRECATED and will be removed in Gunicorn 26.0. Please migrate to gevent, gthread, or another supported worker type.)logwarningrG   rM   init_processrF   rP   r!   r"   rT      s
   zEventletWorker.init_processc                       t t j|| d S rD   )r$   r)   rM   handle_quitr   sigframerP   r!   r"   rV         zEventletWorker.handle_quitc                    rU   rD   )r$   r)   rM   handle_usr1rW   rP   r!   r"   r[      rZ   zEventletWorker.handle_usr1c                 C   s   t | jjpd dS )NF)r$   Timeoutcfg	keepaliverF   r!   r!   r"   timeout_ctx   s   zEventletWorker.timeout_ctxc                    s(   | j jr
t|| j }t ||| d S rD   )r]   is_sslr
   rM   r0   )r   listenerr?   r5   rP   r!   r"   r0      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-|   d }z1t| jj}|D ]	}|t  qJ|D ]}|  qVW d    W d S 1 siw   Y  W d S  tjy } z||kr~ |D ]}|  qW Y d }~d S d }~ww )N   g        g      ?)socketsr   setblockingr   r0   r$   r)   r7   worker_connectionsappendsleepalivenotifyr\   r]   graceful_timeoutr<   r,   r8   )	r   	acceptorsr/   gsockhfunacceptortater!   r!   r"   run   s@   





&
zEventletWorker.run)__name__
__module____qualname__rG   rN   rT   rV   r[   r_   r0   rr   __classcell__r!   r!   rP   r"   rC      s    	rC   )r   N)!warningswarnDeprecationWarningr$   ImportErrorRuntimeErrorpackaging.versionr   parse_version__version__monkey_patch	functoolsr   r=   r   r   eventlet.greenior   eventlet.wsgir9   gunicorn.workers.base_asyncr	   gunicorn.sockr
   rI   wsgirJ   rL   r#   r7   r+   rB   rC   r!   r!   r!   r"   <module>   s<   	

&