
    2Bh                     b   S SK Jr  S SKr S SKrS SKJr  \" \R                  5      \" S5      :  a  \" S5      e S SKJ
r
Jr  S SKJr  S SKrS SKrS SKJr  S S	KJr  \" \R*                  S
S5      r\" \R*                  SS5      rSS jrS rS rS r " S S\5      rg! \	 a	    \" S5      ef = f)    )partialN)parsez0.24.1z2eventlet worker requires eventlet 0.24.1 or higher)hubsgreenthread)GreenSocket)AsyncWorker)ssl_wrap_socket
WSGI_LOCALALREADY_HANDLEDc                 j   U R                  5       S:X  a  [        S5      eU(       a  UR                  U5        U(       a  [        US5      OSnSnUR                  nU R
                  n  U(       a  [        X5-
  U5      nUS::  a  O@[        U" U5      5      nU(       d  O'  U" U5      n	XY-  nU	[        U5      :  a  XS  nOOM$  M\  UUS:  a&  [        US5      (       a  UR                  X%-   5        $ $ $ ! [         a     Mb  f = f! US:  a&  [        US5      (       a  UR                  X%-   5        f f f = f)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
             L/var/www/html/env/lib/python3.13/site-packages/gunicorn/workers/geventlet.py_eventlet_socket_sendfiler"      s9    AABB		&$)E4 tIJ		I		I+ 2I>	>i	23D	$T?D &Jc$i'#E{  & >gdF33IIf)* 4> '  >gdF33IIf)* 4>s0   (7D  C3 (D 3
D=D  DD .D2c                 v   [         R                  R                  U5      n[         R                  R	                  5       n  U R                  5       u  pVUR                  XU5      nUR                  [        XE5        Su  pVnMB  ! [         R                   a#    U R                  5         UR                  5          gf = f)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_server7   E   s     ''4D$$//1I
	JDF$/BGGNI4-ND  !! 	JJLLLN	s    ?B 4B87B8c                      U R                  5         UR                  5         g! UR                  5         f = f! [        R                   a     g[         a-    [
        R                  " U/[        R                  " 5       Q76    gf = f)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   s      r!   r+   r+   \   s`    2	KKMJJLDJJL    21#,,.12s!   $ 9 69 B3BBc                  N    [        [        S5      (       d  [        [        l        g g )Nsendfile)r   r   r"   rC        r!   patch_sendfilerF   n   s     ;
++8 ,rE   c                   j   ^  \ rS rSrS rU 4S jrU 4S jrU 4S jrU 4S jrS r	U 4S jr
S	 rS
rU =r$ )EventletWorker|   c                 l    [         R                  " 5         [        R                  " 5         [	        5         g N)r   use_hubr$   monkey_patchrF   r   s    r!   patchEventletWorker.patch~   s    rE   c                    > [        [        SS 5      (       a
  [        5       eU[        :X  a
  [        5       e[        TU ]  U5      $ )Nalready_handled)getattrEVENTLET_WSGI_LOCALStopIterationEVENTLET_ALREADY_HANDLEDsuperis_already_handled)r   respiter	__class__s     r!   rX   !EventletWorker.is_already_handled   s=    &(94@@/!///!w)(33rE   c                 B   > U R                  5         [        TU ]	  5         g rK   )rO   rW   init_process)r   rZ   s    r!   r]   EventletWorker.init_process   s    

rE   c                 D   > [         R                  " [        TU ]  X5        g rK   )r$   r)   rW   handle_quitr   sigframerZ   s      r!   r`   EventletWorker.handle_quit       uw*C7rE   c                 D   > [         R                  " [        TU ]  X5        g rK   )r$   r)   rW   handle_usr1ra   s      r!   rg   EventletWorker.handle_usr1   re   rE   c                 j    [         R                  " U R                  R                  =(       d    S S5      $ )NF)r$   Timeoutcfg	keepaliverN   s    r!   timeout_ctxEventletWorker.timeout_ctx   s$     2 2 :dEBBrE   c                    > U R                   R                  (       a  [        X R                   5      n[        TU ]  XU5        g rK   )rk   is_sslr	   rW   r0   )r   listenerr@   r5   rZ   s       r!   r0   EventletWorker.handle   s*    88??$VXX6Fx.rE   c                 z   / nU R                    H  n[        U5      nUR                  S5        [        U R                  U5      n[
        R                  " [        X4U R                  5      nUR                  U5        [
        R                  " S5        M     U R                  (       a9  U R                  5         [
        R                  " S5        U R                  (       a  M9  U R                  5         S n [
        R                  " U R                  R                  5       nU H'  nUR!                  [
        R"                  " 5       5        M)     U H  nUR%                  5         M     S S S 5        g ! , (       d  f       g = f! [
        R                   a)  nX:w  a  e U H  nUR!                  5         M      S nAg S nAff = f)N   g        g      ?)socketsr   setblockingr   r0   r$   r)   r7   worker_connectionsappendsleepalivenotifyrj   rk   graceful_timeoutr=   r,   r9   )	r   	acceptorsr/   gsockhfunacceptortates	            r!   runEventletWorker.run   s<   	LLD%Ea 4;;.D~~ou&*&=&=?H X&NN3 ! jjKKMNN3 jjj 	
	!!$((";";<"AFF8--/0 #"AFFH # =<<
  	w 	s7   2*E= AE,#E= ,
E:6E= :E= =F:F55F:rD   )__name__
__module____qualname____firstlineno__rO   rX   r]   r`   rg   rm   r0   r   __static_attributes____classcell__)rZ   s   @r!   rH   rH   |   s1    
488C/
 rE   rH   )r   N)	functoolsr   r>   r$   packaging.versionr   parse_version__version__RuntimeErrorImportErrorr   r   eventlet.greenior   eventlet.wsgir:   gunicorn.workers.base_asyncr   gunicorn.sockr	   rS   wsgirT   rV   r"   r7   r+   rF   rH   rD   rE   r!   <module>r      s   
  
Q 9X))*]8-DDOPP E ' (   3 ) hmm\4@ "8==2CTJ #+L.2$9>[ >e  M
K
LLMs   B B.