
    +h                     Z   d dl mZ d dlZ	 d dlZ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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Zd Zd Zd Z G d de      Zy# e	$ r	  ed      w xY w)    )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                         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
             M/var/www/html/venv/lib/python3.12/site-packages/gunicorn/workers/geventlet.py_eventlet_socket_sendfiler"       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_server7   F   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serverr4   s      r!   r+   r+   ]   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"   rC        r!   patch_sendfilerF   o   s     ;
+8 ,rE   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                 h    t        j                          t        j                          t	                y N)r   use_hubr$   monkey_patchrF   r   s    r!   patchzEventletWorker.patch   s    rE   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!   rV   z!EventletWorker.is_already_handled   s:    &(94@/!///!w)(33rE   c                 B    | j                          t        | 	          y rJ   )rN   rU   init_process)r   rX   s    r!   rZ   zEventletWorker.init_process   s    

rE   c                 D    t        j                  t        |   ||       y rJ   )r$   r)   rU   handle_quitr   sigframerX   s      r!   r\   zEventletWorker.handle_quit       uw*C7rE   c                 D    t        j                  t        |   ||       y rJ   )r$   r)   rU   handle_usr1r]   s      r!   rb   zEventletWorker.handle_usr1   r`   rE   c                 ^    t        j                  | j                  j                  xs d d      S )NF)r$   Timeoutcfg	keepaliverM   s    r!   timeout_ctxzEventletWorker.timeout_ctx   s$     2 2 :dEBBrE   c                     | j                   j                  rt        || j                         }t        |   |||       y rJ   )re   is_sslr	   rU   r0   )r   listenerr@   r5   rX   s       r!   r0   zEventletWorker.handle   s.    88??$VTXX6Fx.rE   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   r0   r$   r)   r7   worker_connectionsappendsleepalivenotifyrd   re   graceful_timeoutr=   r,   r9   )	r   	acceptorsr/   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__rN   rV   rZ   r\   rb   rg   r0   r|   __classcell__)rX   s   @r!   rH   rH   }   s,    
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	   rQ   wsgirR   rT   r"   r7   r+   rF   rH   rD   rE   r!   <module>r      s     
Q 9X))*]8-DDOPP & (   3 ) hmm\4@ "8==2CTJ #+L.2$9>[ >e  M
K
LLMs   B B*