
    AҐi<                        d dl Z  e j                  ded       	 d dlZd dlmZ  eej                         ed      k  r ed       ej                          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j2                  dd      Z eej2                  dd      ZddZd Zd Zd Z G d de      Z y# e	$ r	  ed      w xY w)    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   )
stacklevel)parsez0.40.3z2eventlet worker requires eventlet 0.40.3 or higher)partial)hubsgreenthread)GreenSocket)AsyncWorker)ssl_wrap_socket
WSGI_LOCALALREADY_HANDLEDc                 &   | j                         dk(  rt        d      |r|j                  |       |rt        |d      nd}d}|j                  }| j
                  }	 	 |rt        ||z
  |      }|dk  rn:t         ||            }|sn&	 	  ||      }	||	z  }|	t        |      k  r||	d  }nn$Q||dkD  r"t        |d      r|j                  ||z          S S S # t        $ r Y Zw xY w# |dkD  r"t        |d      r|j                  ||z          w w w xY w)Nr   z&non-blocking sockets are not supportedi    seek)

gettimeout
ValueErrorr   minreadsend
memoryviewlenBlockingIOErrorhasattr)
selffileoffsetcount	blocksize
total_sent	file_read	sock_senddatasents
             S/var/www/descvideos/venv/lib/python3.12/site-packages/gunicorn/workers/geventlet.py_eventlet_socket_sendfiler$   7   s=    AABB		&$)E4 tIJ		I		I+
 2I>	>i	23D	$T?D $&Jc$i'#DE{  & >gdF3IIfz)* 4> '  >gdF3IIfz)* 4>s0   -C' C C' 	C$!C' #C$$C' ')Dc                 z   t         j                  j                  |      }t         j                  j	                         }	 	 | j                         \  }}|j                  |||      }|j                  t        ||       d\  }}}E# t         j                  $ r# | j                          |j                          Y yw xY w)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)eventlet	greenpool	GreenPoolr   
getcurrentacceptspawnlink_eventlet_stop	StopServeclosewaitall)sockhandleconcurrencypool	server_gtconnaddrgts           r#   _eventlet_server9   ]   s     ''4D$$//1I
	JD$FD$/BGGNIt4-ND$  !! 	JJLLLN	s    AB 3B:9B:c                    	 	 | j                          |j                          y# |j                          w xY w# t        j                  $ r Y yt        $ r+ t        j                  |gt        j                           Y yw xY 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serverr6   s      r#   r-   r-   t   s`    2	KKMJJLDJJL    21#,,.12s!   $ 9 69 B0B Bc                  D    t        t        d      st        t        _        y y )Nsendfile)r   r	   r$   rE        r#   patch_sendfilerH      s     ;
+8 ,rG   c                   X     e Zd Zd Z fdZ fdZ fdZ fdZd Z fdZ	d Z
 xZS )	EventletWorkerc                 @    t        j                          t                y N)r   use_hubrH   r   s    r#   patchzEventletWorker.patch   s    
 	rG   c                 ~    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__s     r#   rW   z!EventletWorker.is_already_handled   s:    &(94@/!///!w)(33rG   c                 x    | j                   j                  d       | j                          t        |           y )NzThe eventlet worker is DEPRECATED and will be removed in Gunicorn 26.0. Please migrate to gevent, gthread, or another supported worker type.)logwarningrO   rV   init_process)r   rY   s    r#   r]   zEventletWorker.init_process   s1    S	
 	

rG   c                 D    t        j                  t        |   ||       y rL   )r&   r+   rV   handle_quitr   sigframerY   s      r#   r_   zEventletWorker.handle_quit       uw*C7rG   c                 D    t        j                  t        |   ||       y rL   )r&   r+   rV   handle_usr1r`   s      r#   re   zEventletWorker.handle_usr1   rc   rG   c                 ^    t        j                  | j                  j                  xs d d      S )NF)r&   Timeoutcfg	keepaliverN   s    r#   timeout_ctxzEventletWorker.timeout_ctx   s$     2 2 :dEBBrG   c                     | j                   j                  rt        || j                         }t        |   |||       y rL   )rh   is_sslr   rV   r2   )r   listenerrB   r7   rY   s       r#   r2   zEventletWorker.handle   s.    88??$VTXX6Fx.rG   c                 B   g }| j                   D ]  }t        |      }|j                  d       t        | j                  |      }t        j                  t        ||| j                        }|j                  |       t        j                  d        | j                  r2| j                          t        j                  d       | j                  r2| j                          d }	 t        j                  | j                  j                        5 }|D ]%  }|j!                  t        j"                                ' |D ]  }|j%                           	 d d d        y # 1 sw Y   y xY w# t
        j                  $ r'}||k7  r |D ]  }|j!                           Y d }~y d }~ww xY w)N   g        g      ?)socketsr	   setblockingr   r2   r&   r+   r9   worker_connectionsappendsleepalivenotifyrg   rh   graceful_timeoutr?   r.   r;   )	r   	acceptorsr1   gsockhfunacceptortates	            r#   runzEventletWorker.run   s[   	LL 	 D%Ea 4;;.D~~oud&*&=&=?H X&NN3	  jjKKMNN3 jj 	
	!!$((";";< " 1AFF8--/01" AFFH  
  	Qw 	s7   #)E$ AEE$ E!E$ !E$ $F7FF)__name__
__module____qualname__rO   rW   r]   r_   re   rj   r2   r   __classcell__)rY   s   @r#   rJ   rJ      s,    488C/
rG   rJ   )r   N)!warningswarnDeprecationWarningr&   packaging.versionr   parse_version__version__RuntimeErrorImportErrormonkey_patch	functoolsr   r@   r   r   eventlet.greenior	   eventlet.wsgir<   gunicorn.workers.base_asyncr
   gunicorn.sockr   rR   wsgirS   rU   r$   r9   r-   rH   rJ   rF   rG   r#   <module>r      s     R Q 9X))*]8-DDOPP      
 & (   3 ) hmm\4@ "8==2CTJ #+L.2$9E[ Ey  M
K
LLMs   C C