
    +h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j0                        Zy)    )futuresN)deque)datetime)partial)RLock   )base   )http)util)sock)wsgic                   $    e Zd Zd Zd Zd Zd Zy)TConnc                     || _         || _        || _        || _        d | _        d | _        d| _        | j                  j                  d       y )NF)cfgr   clientservertimeoutparserinitializedsetblocking)selfr   r   r   r   s        K/var/www/html/venv/lib/python3.12/site-packages/gunicorn/workers/gthread.py__init__zTConn.__init__$   sH    	  			e$    c                 `   d| _         | j                  j                  d       | j                  | j                  j
                  r/t        j                  | j                  | j                        | _        t        j                  | j                  | j                  | j                        | _        y y )NT)
r   r   r   r   r   is_sslssl_wrap_socketr   RequestParserr   r   s    r   initz
TConn.init1   sv    		d#;;xx 00DHHE	 ,,TXXtyy$++NDK r   c                 d    t        j                          | j                  j                  z   | _        y N)timer   	keepaliver   r!   s    r   set_timeoutzTConn.set_timeout=   s    yy{TXX%7%77r   c                 B    t        j                  | j                         y r$   )r   closer   r!   s    r   r)   zTConn.closeA   s    

499r   N)__name__
__module____qualname__r   r"   r'   r)    r   r   r   r   "   s    %
O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                 2   t        |   |i | | j                  j                  | _        | j                  j                  | j                  j                  z
  | _        d | _        d | _        d | _        t               | _
        t               | _        d| _        y )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   sv    $)&)"&(("="="hh99DHH<L<LL

wW
r   c                 ~    |j                   |j                  z
  }|dk  r|j                  r|j                  d       y y y )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 $1r   c                     | j                         | _        t        j                         | _        t               | _        t        | !          y r$   )	get_thread_poolr5   	selectorsDefaultSelectorr6   r   r7   r1   init_process)r   r<   s    r   rF   zThreadWorker.init_process[   s7    ))+
//1W
r   c                 V    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    ))dhh6F6FGGr   c                     d| _         | j                  j                  |        | j                  j	                  d       t        j                  d       t        j                  d       y )NFg?r   )	aliver   
worker_intr5   shutdownr%   sleepsysexit)r   sigframes      r   handle_quitzThreadWorker.handle_quite   sC    
D!

E"

3r   c                 ~    ||_         | j                  j                  |       |j                  | j                         y r$   )connr   appendadd_done_callbackfinish_request)r   fsrU   s      r   _wrap_futurezThreadWorker._wrap_futurem   s/    B
T001r   c                     |j                          | j                  j                  | j                  |      }| j	                  ||       y r$   )r"   r5   submithandlerZ   )r   rU   rY   s      r   enqueue_reqzThreadWorker.enqueue_reqr   s5    		ZZt{{D1"d#r   c           	         	 |j                         \  }}t        | j                  |||      }| xj                  dz  c_        | j                  5  | j
                  j                  |j                  t        j                  t        | j                  |             d d d        y # 1 sw Y   y xY w# t        $ rF}|j                  t        j                  t        j                  t        j                   fvr Y d }~y 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   s    	#??,LD&48DMMQM T$$TYY	0D0D%,T-K-KT%RTT T T   	wwu||U-?-?$002 22	s7   AB- A
B!B- !B*&B- *B- -	C<6<C77C<c                    | j                   5  | j                  j                  |       |j                  r	 | j                  j                  |       d d d        | j                  |       y # t        $ r Y d d d        y w xY w# 1 sw Y   2xY wr$   )r7   r6   
unregisterr   r8   remove
ValueErrorr^   )r   rU   r   s      r   rc   z&ThreadWorker.on_client_socket_readable   s~    ZZ 
	KK""6*JJ%%d+
	 	 " 
	 
	
	 
	s(   (BA++	A?4B>A??BBc                    t        j                          }	 | j                  5  	 | j                  j                         }	 d d d        j
                  |z
  }|dkD  r1| j                  5  | j                  j                  |       d d d        y | xj                  dz  c_        | j                  5  	 | j                  j                  |j                         d d d        |j!                          # t        $ r Y d d d        y w xY w# 1 sw Y   xY w# 1 sw Y   y xY w# t        $ r(}|j                  t        j                  k7  r Y d }~td }~wt        $ r Y t        $ r Y w xY w# 1 sw Y   xY w)Nr   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   s;   iik ::--/D LL3&EqyZZ 0JJ))$/0"ZZ 
..tyy9 

? 
 "  	 0 , "77ekk1! 2# %  s|   DC-'D-E$/%D-	D6D DDDD	E!%EE$E!E$E!E$ E!!E$$E-c                     | j                   t        j                         k7  r| j                  j	                  d|        yy)Nz!Parent changed, shutting down: %sFT)ppidosgetppidr@   infor!   s    r   is_parent_alivezThreadWorker.is_parent_alive   s-    99

$HHMM=tDr   c                 n   | j                   D ]f  } |j                  d        |j                         }t        | j                  |      }| j
                  j                  |t        j                  |       h | j                  r(| j                          | j                  | j                  k  rt| j
                  j                  d      }|D ]#  \  }}|j                  } ||j                         % t!        j"                  | j                   dt         j$                        }n0t!        j"                  | j                   dt         j$                        }|j&                  D ]  }	| j                   j)                  |	        | j+                         sn| j-                          | j                  r(| j.                  j1                  d       | j
                  j3                          | j                   D ]  }
|
j3                           t!        j"                  | j                   | j4                  j6                         y )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   LL 	GDDU# &T%%'Ft{{F3HKK  y';';XF	G jjKKM }}t666++C0$ *FC"xxHS[[)*
 !dllA292I2IK !dllC292I2IK {{ )##C() '') ""$9 jj< 	

E" 	AGGI	 	T\\488+D+DEr   c           	         |j                         r0| xj                  dz  c_        |j                  j                          y 	 |j	                         \  }}|r| j
                  r|j                  j                  d       |j                          | j                  5  | j                  j                  |       | j                  j                  |j                  t        j                  t!        | j"                  |             d d d        y | xj                  dz  c_        |j                          y # 1 sw Y   y xY w# t$        $ r2 | xj                  dz  c_        |j                  j                          Y y 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MGGMMO	 "		Y TZZ		%%e,   "ZZ XJJ%%d+ KK((I4H4H)01O1OQU)VX	X X "

X X  	 MMQMGGMMO		s8   AD: A%D.?D: %D: .D73D: 7D: :8E54E5c                 D   d}d }	 t        |j                        }|sd|fS | j                  ||      }|r||fS 	 d|fS # t        j                  j
                  $ r)}| j                  j                  d|       Y d }~d|fS d }~wt        $ r)}| j                  j                  d|       Y d }~d|fS d }~wt        j                  $ r}|j                  d   t        j                  k(  r6| j                  j                  d       |j                  j                          nC| j                  j                  d       | j                  ||j                  |j                   |       Y d }~d|fS d }~wt"        $ r}|j$                  t$        j&                  t$        j(                  t$        j*                  fvr| j                  j-                  d       n|j$                  t$        j(                  k(  r| j                  j                  d       nT|j$                  t$        j*                  k(  r| j                  j                  d	       n| j                  j                  d
       Y d }~d|fS d }~wt.        $ r5}| j                  ||j                  |j                   |       Y d }~d|fS d }~ww xY w)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6I!4(( 8 t}5 {{%% 	LHHNNGKK2 t}/  	8HHNN3Q77, t}+ || 	BvvayC---67		!>?!!#tyy$++qA t}   		@wwu{{E,<,<ennMM""#EF77e...HHNN#>?WW.HHNN#BCHHNN#>? t}  	>c499dkk1==t}	>sK   > > JA??JB//JBE&&J2C$IJ*(JJc                 r   i }d }	 | j                   j                  | |       t        j                         }t	        j
                  ||j                  |j                  |j                  | j                         \  }}d|d<   | xj                  dz  c_	        | j                  | j                  k\  r>| j                  r"| j                  j                  d       d| _        |j                          | j                  r| j                   j                  s|j                          n2t!        | j"                        | j$                  k\  r|j                          | j	                  ||j&                        }	 t)        ||d         r|j+                  |       n|D ]  }|j-                  |        |j/                          t        j                         |z
  }| j                  j1                  ||||       t3        |d      r|j/                          	 |j5                         r<| j                  j7                  d       	 	 | j                   j9                  | |||       y	 	 | j                   j9                  | |||       y# t        j                         |z
  }| j                  j1                  ||||       t3        |d      r|j/                          w w xY w# t:        $ r | j                  j=                  d	       Y yw xY w# t>        $ r' tA        jB                  tE        jF                           Y t:        $ r |r|jH                  r| j                  j=                  d
       	 |j                  jK                  tL        jN                         |j                  j/                          tQ               # t>        $ r Y tQ               w xY w w xY w# t:        $ r | j                  j=                  d	       Y yw xY w# 	 | j                   j9                  | |||       w # t:        $ r | j                  j=                  d	       Y w w xY wxY w)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  sc   7	EHH  s+$LLNM KKTYY(,TXX?MD'*.G&'GGqLGww$+++::HHMM"PQ!&DJ  "::TXX%7%7  "TZZD$7$77  "yy$*=*=>H%h0C(DEOOH- ( )

4() 

'||~=c7LA8W-NN$  "45"E%%dC$?) #&E%%dC$? ;  (||~=c7LA8W-NN$ .0  E""#CDE%   	*LL#,,.) 	)) ""#;<II&&v'7'78IIOO% $o% ( #o% 	  E""#CDEE%%dC$? E""#CDEs   E&K6 -A	I5 6A=K6 5K O+ O 5AK		K6 $K32K36-N>#O+ %1N>AN$
N>$	N9-N>8N99N>>O+ $O('O(+P6-PP6$P30P62P33P6)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   sd    
 O OH2
$  !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      sY      	   
 
           F  Fp4;; pr   