
    Tf1                         d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlmZ d dlmZ d dlmZ ddlmZ d	d
lmZ d	dlmZ d	dlmZ d	dlmZ  G d de          Z G d dej                  ZdS )    )futuresN)deque)datetime)partial)RLock   )base   )http)util)sock)wsgic                   &    e Zd Zd Zd Zd Zd ZdS )TConnc                     || _         || _        || _        || _        d | _        d | _        d| _        | j                            d           d S )NF)cfgr   clientservertimeoutparserinitializedsetblocking)selfr   r   r   r   s        J/var/www/html/env/lib/python3.11/site-packages/gunicorn/workers/gthread.py__init__zTConn.__init__$   sR    	  		e$$$$$    c                    d| _         | j                            d           | j        \| j        j        r$t          j        | j        | j                  | _        t          j        | j        | j        | j	                  | _        d S d S )NT)
r   r   r   r   r   is_sslssl_wrap_socketr   RequestParserr   r   s    r   initz
TConn.init1   sw    	d###;x F 0DHEE	 ,TXty$+NNDKKK r   c                 P    t          j                     | j        j        z   | _        d S N)timer   	keepaliver   r!   s    r   set_timeoutzTConn.set_timeout=   s    y{{TX%77r   c                 8    t          j        | j                   d S r$   )r   closer   r!   s    r   r)   zTConn.closeA   s    
49r   N)__name__
__module____qualname__r   r"   r'   r)    r   r   r   r   "   sS        % % %
O 
O 
O8 8 8    r   r   c                        e Zd Z fdZed             Z fdZd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Z xZS )ThreadWorkerc                     t                      j        |i | | j        j        | _        | j        j        | j        j        z
  | _        d | _        d | _        d | _        t                      | _
        t                      | _        d| _        d S )Nr   )superr   r   worker_connectionsthreadsmax_keepalivedtpoolpoller_lockr   r   _keepnr_conns)r   argskwargs	__class__s      r   r   zThreadWorker.__init__G   sy    $)&)))"&("="h9DH<LL

wwWW
r   c                 p    |j         |j        z
  }|dk    r|j        r|                    d           d S d S d S )Nr   z]No keepalived connections can be handled. Check the number of worker connections and threads.)r2   r3   r&   warning)clsr   logr4   s       r   check_configzThreadWorker.check_configS   s\    /#+=Q3=KK N O O O O O r   c                     |                                  | _        t          j                    | _        t                      | _        t                                                       d S r$   )	get_thread_poolr5   	selectorsDefaultSelectorr6   r   r7   r1   init_process)r   r<   s    r   rF   zThreadWorker.init_process[   sM    ))++
/11WW
r   c                 @    t          j        | j        j                  S )z@Override this method to customize how the thread pool is created)max_workers)r   ThreadPoolExecutorr   r3   r!   s    r   rC   zThreadWorker.get_thread_poola   s    )dh6FGGGGr   c                     d| _         | j                            |            | j                            d           t          j        d           t          j        d           d S )NFg?r   )	aliver   
worker_intr5   shutdownr%   sleepsysexit)r   sigframes      r   handle_quitzThreadWorker.handle_quite   sS    
D!!!
E"""
3r   c                 |    ||_         | j                            |           |                    | j                   d S r$   )connr   appendadd_done_callbackfinish_request)r   fsrU   s      r   _wrap_futurezThreadWorker._wrap_futurem   s<    B
T011111r   c                     |                                  | j                            | j        |          }|                     ||           d S r$   )r"   r5   submithandlerZ   )r   rU   rY   s      r   enqueue_reqzThreadWorker.enqueue_reqr   sD    		Zt{D11"d#####r   c           	         	 |                                 \  }}t          | j        |||          }| xj        dz  c_        | j        5  | j                            |j        t          j	        t          | j        |                     d d d            d S # 1 swxY w Y   d S # t          $ r6}|j        t          j        t          j        t          j        fvr Y d }~d S d }~ww xY w)Nr   )acceptr   r   r9   r7   r6   registerr   rD   
EVENT_READr   on_client_socket_readableEnvironmentErrorerrnoEAGAINECONNABORTEDEWOULDBLOCK)r   r   listenerr   r   rU   es          r   r`   zThreadWorker.acceptx   sZ   	#??,,LD&488DMMQMM T T$$TY	0D%,T-KT%R%RT T TT T T T T T T T T T T T T T T T T T   	 	 	wu|U-?$02 2 22 2 2 2 2 2	s<   AB  ?BB  BB  BB   
C *+CC c                     | j         5  | j                            |           |j        r8	 | j                            |           n# t          $ r Y d d d            d S w xY wd d d            n# 1 swxY w Y   |                     |           d S r$   )r7   r6   
unregisterr   r8   remove
ValueErrorr^   )r   rU   r   s      r   rc   z&ThreadWorker.on_client_socket_readable   s    Z 
	 
	K""6*** J%%d++++!   
	 
	 
	 
	 
	 
	 
	 
	
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 	s4   "A.AA.
AA.AA..A25A2c                    t          j                     }	 | j        5  	 | j                                        }n# t          $ r Y d d d            d S w xY w	 d d d            n# 1 swxY w Y   |j        |z
  }|dk    r;| j        5  | j                            |           d d d            n# 1 swxY w Y   d S | xj        dz  c_        | j        5  	 | j        	                    |j
                   nC# t          $ r }|j        t          j        k    r Y d }~nd }~wt          $ r Y nt          $ r Y nw xY wd d d            n# 1 swxY w Y   |                                 K)NTr   r   )r%   r7   r8   popleft
IndexErrorr   
appendleftr9   r6   rl   r   rd   re   EBADFKeyErrorrn   r)   )r   nowrU   deltarj   s        r   murder_keepalivedzThreadWorker.murder_keepalived   st   ikk	  :--//DD!                          L3&EqyyZ 0 0J))$///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"Z  
..ty9999+ " " "7ek11! 21111#   %                  

?	s   A!8A!
AA!AA!!A%(A%B**B.1B.D?C0/D?0
D0:DD?D0"D?$	D0-D?/D00D??EEc                 x    | j         t          j                    k    r| j                            d|            dS dS )Nz!Parent changed, shutting down: %sFT)ppidosgetppidr@   infor!   s    r   is_parent_alivezThreadWorker.is_parent_alive   s6    9
$$HMM=tDDD5tr   c                    | j         D ]\} |j        d            |j                    }t          | j        |          }| j                            |t          j        |           ]| j	        r| 
                                 | j        | j        k     r`| j                            d          }|D ]\  }}|j        } ||j                   t!          j        | j        dt           j                  }n&t!          j        | j        dt           j                  }|j        D ]}	| j                            |	           |                                 sn|                                  | j	        | j                            d           | j                                         | j         D ]}
|
                                 t!          j        | j        | j        j                   d S )NFg      ?r   )r   return_when)r   )socketsr   getsocknamer   r`   r6   ra   rD   rb   rK   notifyr9   r2   selectdatafileobjr   waitFIRST_COMPLETEDdonerm   r}   rw   r5   rM   r)   r   graceful_timeout)r   r   r   acceptoreventskey_callbackresultfutss              r   runzThreadWorker.run   s   L 	G 	GDDU### &T%''Ft{F33HK  y';XFFFFj 	%KKMMM }t666++C00$ * *FC"xHHS[)))) !dlA292IK K K !dlC292IK K K { ) )##C((((''))  ""$$$9 j 	%< 	
E""" 	 	AGGIIIIT\48+DEEEEEEr   c           	         |                                 r+| xj        dz  c_        |j                                         d S 	 |                                \  }}|r| j        r|j                            d           |                                 | j	        5  | j
                            |           | j                            |j        t          j        t!          | j        |                     d d d            d S # 1 swxY w Y   d S | xj        dz  c_        |                                 d S # t$          $ r- | xj        dz  c_        |j                                         Y d S w xY w)Nr   F)	cancelledr9   rU   r)   r   rK   r   r   r'   r7   r8   rV   r6   ra   rD   rb   r   rc   	Exception)r   rY   r&   rU   s       r   rX   zThreadWorker.finish_request   s   <<>> 	MMQMMGMMOOOF	 "		Y  TZ 	%%e,,,   """Z X XJ%%d+++ K((I4H)01OQU)V)VX X X	X X X X X X X X X X X X X X X X X X "

 	 	 	 MMQMMGMMOOOOOO		s>   AD/ AC</D/ <D  D/ D D/ 	$D/ /3E&%E&c                    d}d }	 t          |j                  }|sd|fS |                     ||          }|r||fS n# t          j        j        $ r&}| j                            d|           Y d }~nd }~wt          $ r&}| j                            d|           Y d }~nd }~wt          j
        $ r}|j        d         t          j        k    r4| j                            d           |j                                         n<| j                            d           |                     ||j        |j        |           Y d }~nd }~wt"          $ r}|j        t$          j        t$          j        t$          j        fvr| j                            d           nz|j        t$          j        k    r| j                            d           nJ|j        t$          j        k    r| j                            d	           n| j                            d
           Y d }~n<d }~wt.          $ r,}|                     ||j        |j        |           Y d }~nd }~ww xY wd|fS )NFz*Ignored premature client disconnection. %szClosing connection. %sr   zssl connection closedzError processing SSL request.z Socket error processing request.zIgnoring connection resetzIgnoring socket not connectedzIgnoring connection epipe)nextr   handle_requestr   errors
NoMoreDatar@   debugStopIterationsslSSLErrorr:   SSL_ERROR_EOFr   r)   handle_errorr   rd   re   EPIPE
ECONNRESETENOTCONN	exceptionr   )r   rU   r&   reqrj   s        r   r]   zThreadWorker.handle  s   	!	>t{##C %t}$ ++C66I )!4((){% 	L 	L 	LHNNGKKKKKKKK 	8 	8 	8HNN3Q77777777| 	B 	B 	BvayC---6777	!!!!>???!!#ty$+qAAA 		@ 		@ 		@wu{E,<enMMM""#EFFFF7e...HNN#>????W..HNN#BCCCCHNN#>??? 	> 	> 	>c49dk1========	> t}sK   > > IA33I B!!I3BEIB?HI""I		Ic                 (   i }d }	 | j                             | |           t          j                    }t	          j        ||j        |j        |j        | j                   \  }}d|d<   | xj	        dz  c_	        | j	        | j
        k    r<| j        r!| j                            d           d| _        |                                 | j        r| j         j        s|                                 n1t!          | j                  | j        k    r|                                 |                     ||j                  }	 t)          ||d                   r|                    |           n|D ]}|                    |           |                                 t          j                    |z
  }| j                            ||||           t3          |d          r|                                 n]# t          j                    |z
  }| j                            ||||           t3          |d          r|                                 w w xY w|                                rf| j                            d           	 	 | j                             | |||           dS # t:          $ r | j                            d	           Y dS w xY wn# t>          $ r" tA          j!        tE          j#                      Y nt:          $ r |r~|j$        rw| j                            d
           	 |j        %                    tL          j'                   |j                                         n# t>          $ r Y nw xY wtQ                       w xY w	 | j                             | |||           nw# t:          $ r | j                            d	           Y nQw xY w# 	 | j                             | |||           w # t:          $ r | j                            d	           Y w w xY wxY wdS )NTzwsgi.multithreadr   z,Autorestarting worker after current request.Fzwsgi.file_wrapperr)   zClosing connection.zException in post_request hookzError handling request))r   pre_requestr   ru   r   creater   r   r   nrmax_requestsrK   r@   r|   force_closer&   lenr8   r4   start_response
isinstance
write_filewriter)   accesshasattrshould_closer   post_requestr   r   rd   r   reraiserO   exc_infoheaders_sentrM   socket	SHUT_RDWRr   )	r   r   rU   environresprequest_startrespiteritemrequest_times	            r   r   zThreadWorker.handle_request9  sl   7	EH  s+++$LNNM KTY(,TX? ?MD'*.G&'GGqLGGw$+++: 'HMM"PQQQ!&DJ  """: #TX%7 #  """"TZD$777  """yy$*=>>H%h0C(DEE )OOH---- ( ) )

4((((

'|~~=c7LAAA8W-- %NN$$$  (|~~=c7LAAA8W-- %NN$$$$%   "" 4555"E%%dC$????? E E E""#CDDDDDDE+   	* 	* 	*L#,..)))) 	 	 	 	&) 	& ""#;<<<I&&v'7888IOO%%%%'   D#oo%	E%%dC$???? E E E""#CDDDDDEE%%dC$???? E E E""#CDDDDDE ts   D2K 9AG+ AK +AI1K 8J $J?>J?O )M9,O .,M9=MM9
M&#M9%M&&M99O =N $OOPO%$P%$P	PPP)r*   r+   r,   r   classmethodrA   rF   rC   rS   rZ   r^   r`   rc   rw   r}   r   rX   r]   r   __classcell__)r<   s   @r   r/   r/   E   s,       
 
 
 
 
 O O [O    H H H  2 2 2
$ $ $      ! ! !F  .F .F .F`  >& & &P< < < < < < <r   r/   )
concurrentr   re   rz   rD   r   r   rO   r%   collectionsr   r   	functoolsr   	threadingr    r	   r   r   r   r   objectr   Workerr/   r-   r   r   <module>r      sh          				      



 



                                                                F      Fp p p p p4; p p p p pr   