
    Tf                     l   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          n# e	$ r  ed          w xY w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dS )    )partialN)parsez0.24.1z2eventlet worker requires eventlet 0.24.1 or higher)hubsgreenthread)GreenSocket)AsyncWorker)ssl_wrap_socket
WSGI_LOCALALREADY_HANDLEDc                    |                                  dk    rt          d          |r|                    |           |rt          |d          nd}d}|j        }| j        }	 	 |rt          ||z
  |          }|dk    rn^t           ||                    }|snC	 	  ||          }	||	z  }|	t          |          k     r||	d          }nn# t          $ r Y =w xY wAz||dk    r)t          |d          r|                    ||z              S S S # |dk    r)t          |d          r|                    ||z              w w w xY w)Nr   z&non-blocking sockets are not supportedi    T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.11/site-packages/gunicorn/workers/geventlet.py_eventlet_socket_sendfiler"       s    AABBB 		&$)3E4   tIJ	I	I+	 
 2I>>	>>ii	2233D 
	$9T??D $&Jc$ii''#DEE{ '   H
	& >>gdF33>IIfz)**** >:>>gdF33>IIfz)**** >s0   $9D C )$D 
CD CD 2Ec                    t           j                            |          }t           j                                        }	 	 |                                 \  }}|                    |||          }|                    t          ||           d\  }}}n># t           j	        $ r, | 
                                 |                                 Y dS 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.
    T)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     ''44D$//11I		JD$FD$//BGGNIt444-ND$! 	 	 	JJLLLLLNNNFF		s    AB 7CCc                    	 	 |                                   |                                 dS # |                                 w xY w# t          j        $ r Y dS t          $ r' t          j        |gt          j                    R   Y dS 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	KKMMMJJLLLLLDJJLLLL     2 2 21#,..11111112s&   - A AA B,BBc                  V    t          t          d          st          t          _        d S d S )Nsendfile)r   r   r"   rC        r!   patch_sendfilerF   o   s.     ;
++ 989 9rE   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                 n    t          j                     t          j                     t	                       d S 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   sQ    &(94@@ 	"//!/////!ww))(333rE   c                 p    |                                   t                                                       d S rJ   )rN   rU   init_process)r   rX   s    r!   rZ   zEventletWorker.init_process   s,    

rE   c                 V    t          j        t                      j        ||           d S rJ   )r$   r)   rU   handle_quitr   sigframerX   s      r!   r\   zEventletWorker.handle_quit   $    uww*C77777rE   c                 V    t          j        t                      j        ||           d S rJ   )r$   r)   rU   handle_usr1r]   s      r!   rb   zEventletWorker.handle_usr1   r`   rE   c                 D    t          j        | j        j        pd d          S )NF)r$   Timeoutcfg	keepaliverM   s    r!   timeout_ctxzEventletWorker.timeout_ctx   s     2 :dEBBBrE   c                     | j         j        rt          || j                   }t                                          |||           d S rJ   )re   is_sslr	   rU   r0   )r   listenerr@   r5   rX   s       r!   r0   zEventletWorker.handle   s@    8? 	7$VTX66Fx.....rE   c                 0   g }| j         D ]}t          |          }|                    d           t          | j        |          }t          j        t          ||| j                  }|	                    |           t          j
        d           | j        r/|                                  t          j
        d           | j        /|                                  d }	 t          j        | j        j                  5 }|D ](}|                    t          j                               )|D ]}|                                 	 d d d            d S # 1 swxY w Y   d S # t
          j        $ r+}||k    r |D ]}|                                 Y d }~d S 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   	L 	  	 D%%Ea   4;..D~oud&*&=? ?H X&&&N3j 	 KKMMMN3 j 	  	
	!$(";<< " 1 1AFF8-//0000"  AFFHHHH                 
  	 	 	Qww       	s=   E ;AEE EE EE F* FF)__name__
__module____qualname__rN   rV   rZ   r\   rb   rg   r0   r|   __classcell__)rX   s   @r!   rH   rH   }   s          
4 4 4 4 4    8 8 8 8 88 8 8 8 8C C 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OOO 988888}X)**]]8-D-DDDlOPPP E	  M M M
,K
L
LLM ' & & & & & & & ( ( ( ( ( (      3 3 3 3 3 3 ) ) ) ) ) ) ghm\4@@ "78=2CTJJ #+ #+ #+ #+L  .2 2 2$9 9 9> > > > >[ > > > > >s	   ? A