
    2Bh0                         S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	J
r
  S SKJr  S SKJr  S SKJr  SSKJr  S	S
KJr  S	SKJr  S	SKJr  S	SKJr   " S S5      r " S S\R.                  5      rg)    )futuresN)deque)datetime)partial)RLock   )base   )http)util)sock)wsgic                   ,    \ rS rSrS rS rS rS rSrg)TConn!   c                     Xl         X l        X0l        X@l        S U l        S U l        SU l        U R                  R                  S5        g )NF)cfgr   clientservertimeoutparserinitializedsetblocking)selfr   r   r   r   s        J/var/www/html/env/lib/python3.13/site-packages/gunicorn/workers/gthread.py__init__TConn.__init__#   s@    	  			e$    c                 p   SU l         U R                  R                  S5        U R                  c  U R                  R
                  (       a0  [        R                  " U R                  U R                  5      U l        [        R                  " U R                  U R                  U R                  5      U l        g g )NT)
r   r   r   r   r   is_sslssl_wrap_socketr   RequestParserr   r   s    r   init
TConn.init0   sv    		d#;;xx 00DHHE	 ,,TXXtyy$++NDK r   c                 f    [         R                   " 5       U R                  R                  -   U l        g N)timer   	keepaliver   r#   s    r   set_timeoutTConn.set_timeout<   s    yy{TXX%7%77r   c                 D    [         R                  " U R                  5        g r'   )r   closer   r#   s    r   r-   TConn.close@   s    

499r   )r   r   r   r   r   r   r   N)	__name__
__module____qualname____firstlineno__r   r$   r*   r-   __static_attributes__ r   r   r   r   !   s    %
O8r   r   c                      ^  \ rS rSrU 4S jr\S 5       rU 4S jrS rS r	S r
S rS	 rS
 rS rS rS rS rS rS rSrU =r$ )ThreadWorkerD   c                 4  > [         TU ]  " U0 UD6  U R                  R                  U l        U R                  R                  U R                  R                  -
  U l        S U l        S U l        S U l        [        5       U l
        [        5       U l        SU l        g )Nr   )superr   r   worker_connectionsthreadsmax_keepalivedtpoolpoller_lockr   r   _keepnr_conns)r   argskwargs	__class__s      r   r   ThreadWorker.__init__F   sv    $)&)"&(("="="hh99DHH<L<LL

wW
r   c                     UR                   UR                  -
  nUS::  a$  UR                  (       a  UR                  S5        g g g )Nr   z]No keepalived connections can be handled. Check the number of worker connections and threads.)r:   r;   r)   warning)clsr   logr<   s       r   check_configThreadWorker.check_configR   s?    //#++=Q3==KK N O $1r   c                    > U R                  5       U l        [        R                  " 5       U l        [        5       U l        [        TU ]!  5         g r'   )	get_thread_poolr=   	selectorsDefaultSelectorr>   r   r?   r9   init_process)r   rD   s    r   rP   ThreadWorker.init_processZ   s7    ))+
//1W
r   c                 R    [         R                  " U R                  R                  S9$ )z@Override this method to customize how the thread pool is created)max_workers)r   ThreadPoolExecutorr   r;   r#   s    r   rM   ThreadWorker.get_thread_pool`   s    ))dhh6F6FGGr   c                     SU l         U R                  R                  U 5        U R                  R	                  S5        [
        R                  " S5        [        R                  " S5        g )NFg?r   )	aliver   
worker_intr=   shutdownr(   sleepsysexit)r   sigframes      r   handle_quitThreadWorker.handle_quitd   sC    
D!

E"

3r   c                 |    X!l         U R                  R                  U5        UR                  U R                  5        g r'   )connr   appendadd_done_callbackfinish_request)r   fsrb   s      r   _wrap_futureThreadWorker._wrap_futurel   s-    B
T001r   c                     UR                  5         U R                  R                  U R                  U5      nU R	                  X!5        g r'   )r$   r=   submithandlerg   )r   rb   rf   s      r   enqueue_reqThreadWorker.enqueue_reqq   s3    		ZZt{{D1"#r   c           	      
    UR                  5       u  p4[        U R                  X4U5      nU =R                  S-  sl        U R                     U R
                  R                  UR                  [        R                  [        U R                  U5      5        S S S 5        g ! , (       d  f       g = f! [         aH  nUR                  [        R                  [        R                  [        R                   4;  a  e  S nAg S nAff = f)Nr   )acceptr   r   rA   r?   r>   registerr   rN   
EVENT_READr   on_client_socket_readableOSErrorerrnoEAGAINECONNABORTEDEWOULDBLOCK)r   r   listenerr   r   rb   es          r   ro   ThreadWorker.acceptw   s    	#??,LD48DMMQM$$TYY	0D0D%,T-K-KT%RT   	wwu||U-?-?$002 22	s7   A
B0 A
BB0 
B-)B0 -B0 0
D:>C==Dc                 2   U R                      U R                  R                  U5        UR                  (       a   U R                  R                  U5        S S S 5        U R                  U5        g ! [         a     S S S 5        g f = f! , (       d  f       N8= fr'   )r?   r>   
unregisterr   r@   remove
ValueErrorrl   )r   rb   r   s      r   rr   &ThreadWorker.on_client_socket_readable   ss    ZZKK""6*JJ%%d+  	 "  Z Zs(   -BA00
B:BBB
Bc                    [         R                   " 5       n U R                      U R                  R                  5       n S S S 5        WR
                  U-
  nUS:  a1  U R                     U R                  R                  U5        S S S 5        g U =R                  S-  sl        U R                      U R                  R                  UR                  5        S S S 5        UR!                  5         M  ! [         a     S S S 5        g f = f! , (       d  f       N= f! , (       d  f       g = f! [         a)  nUR                  [        R                  :w  a  e  S nANS nAf[         a     N[         a     Nf = f! , (       d  f       N= f)Nr   r   )r(   r?   r@   popleft
IndexErrorr   
appendleftrA   r>   r|   r   rs   rt   EBADFKeyErrorr~   r-   )r   nowrb   deltary   s        r   murder_keepalivedThreadWorker.murder_keepalived   s%   iik::--/D  LL3&EqyZZJJ))$/  "ZZ
..tyy9   

? 
 "  	   Z # "77ekk1! 2# %   Zs|   DC0)D/E61%D*0
D:DDD
D
D'*
E34EE6E3%E6'	E30E62E33E66
Fc                     U R                   [        R                  " 5       :w  a  U R                  R	                  SU 5        gg)Nz!Parent changed, shutting down: %sFT)ppidosgetppidrI   infor#   s    r   is_parent_aliveThreadWorker.is_parent_alive   s-    99

$HHMM=tDr   c                    U R                    Hg  nUR                  " S5        UR                  " 5       n[        U R                  U5      nU R
                  R                  U[        R                  U5        Mi     U R                  (       Ga3  U R                  5         U R                  U R                  :  as  U R
                  R                  S5      nU H#  u  pVUR                  nU" UR                  5        M%     [         R"                  " U R                   S[         R$                  S9nO.[         R"                  " U R                   S[         R$                  S9nUR&                   H  n	U R                   R)                  U	5        M      U R+                  5       (       d  O$U R-                  5         U R                  (       a  GM3  U R.                  R1                  S5        U R
                  R3                  5         U R                    H  n
U
R3                  5         M     [         R"                  " U R                   U R4                  R6                  S9  g )NFg      ?r   )r   return_when)r   )socketsr   getsocknamer   ro   r>   rp   rN   rq   rW   notifyrA   r:   selectdatafileobjr   waitFIRST_COMPLETEDdoner}   r   r   r=   rY   r-   r   graceful_timeout)r   r   r   acceptoreventskey_callbackresultfutss              r   runThreadWorker.run   s   LLDU# %%'Ft{{F3HKK  y';';XF ! jjjKKM }}t666++C0$FC"xxHS[[) %
 !dllA292I2IK !dllC292I2IK {{##C( # '')) ""$9 jjj< 	

E"AGGI  	T\\488+D+DEr   c           	         UR                  5       (       a0  U =R                  S-  sl        UR                  R                  5         g  UR	                  5       u  p#U(       a  U R
                  (       a  UR                  R                  S5        UR                  5         U R                     U R                  R                  U5        U R                  R                  UR                  [        R                  [!        U R"                  U5      5        S S S 5        g U =R                  S-  sl        UR                  5         g ! , (       d  f       g = f! [$         a2    U =R                  S-  sl        UR                  R                  5          g f = f)Nr   F)	cancelledrA   rb   r-   r   rW   r   r   r*   r?   r@   rc   r>   rp   rN   rq   r   rr   	Exception)r   rf   r)   rb   s       r   re   ThreadWorker.finish_request   s   <<>>MMQMGGMMO	 "		Y TZZ		%%e,   "ZZJJ%%d+ KK((I4H4H)01O1OQU)VX	  Z "

  Z  	 MMQMGGMMO		s8   A!E (A%D<E %E <
E
E 
E 9F	F	c                    SnS n [        UR                  5      nU(       d  SU4$ U R                  X15      nU(       a  X!4$  SU4$ ! [        R                  R
                   a)  nU R                  R                  SU5         S nASU4$ S nAf[         a)  nU R                  R                  SU5         S nASU4$ S nAf[        R                   a  nUR                  S   [        R                  :X  a=  U R                  R                  S5        UR                  R                  5          S nASU4$ U R                  R                  S5        U R                  X1R                  UR                   U5         S nASU4$ S nAf["         Ga
  nUR$                  [$        R&                  [$        R(                  [$        R*                  4;  a#  U R                  R-                  S5         S nASU4$ UR$                  [$        R(                  :X  a#  U R                  R                  S5         S nASU4$ UR$                  [$        R*                  :X  a#  U R                  R                  S	5         S nASU4$ U R                  R                  S
5         S nASU4$ S nAf[.         a4  nU R                  X1R                  UR                   U5         S nASU4$ S nAff = f)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
NoMoreDatarI   debugStopIterationsslSSLErrorrB   SSL_ERROR_EOFr   r-   handle_errorr   rs   rt   EPIPE
ECONNRESETENOTCONN	exceptionr   )r   rb   r)   reqry   s        r   rk   ThreadWorker.handle  s`   	!	>t{{#Ct}$ ++C6I!(( 8 t}5 {{%% 	LHHNNGKK2 t}/  	8HHNN3Q77, t}+ || 	BvvayC---67		!!$ t}! >?!!#yy$++qAA t}  		@wwu{{E,<,<ennMM""#EFF t} 77e...HHNN#>?? t} WW.HHNN#BCC t}	 HHNN#>?? t}  	>c99dkk1==t}	>sg   A A K$BKB99KAE8.AE88KAJ&9J'9J(JK'KKc                    0 nS n U R                   R                  X5        [        R                  " 5       n[        R
                  " XR                  UR                  UR                  U R                   5      u  pCSUS'   U =R                  S-  sl	        U R                  U R                  :  aC  U R                  (       a"  U R                  R                  S5        SU l        UR                  5         U R                  (       a  U R                   R                  (       d  UR                  5         O3[!        U R"                  5      U R$                  :  a  UR                  5         U R	                  X4R&                  5      n [)        XcS   5      (       a  UR+                  U5        OU H  nUR-                  U5        M     UR/                  5         [        R                  " 5       U-
  nU R                  R1                  XAX85        [3        US5      (       a  UR/                  5         UR5                  5       (       a:  U R                  R7                  S5          U R                   R9                  XX45        g  U R                   R9                  XX45        g! [        R                  " 5       U-
  nU R                  R1                  XAX85        [3        US5      (       a  UR/                  5         f f = f! [:         a    U R                  R=                  S	5         gf = f! [>         a)    [@        RB                  " [D        RF                  " 5       6    N[:         a    U(       a  URH                  (       a  U R                  R=                  S
5         UR                  RK                  [L        RN                  5        UR                  R/                  5         [Q        5       e! [>         a     [Q        5       ef = fe f = f! [:         a    U R                  R=                  S	5         gf = f!  U R                   R9                  XX45        f ! [:         a    U R                  R=                  S	5         f f = f= f)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   r   r   creater   r   r   nrmax_requestsrW   rI   r   force_closer)   lenr@   r<   start_response
isinstance
write_filewriter-   accesshasattrshould_closer   post_requestr   r   rs   r   reraiser[   exc_infoheaders_sentrY   socket	SHUT_RDWRr   )	r   r   rb   environresprequest_startrespiteritemrequest_times	            r   r   ThreadWorker.handle_request8  sL   7	EHH  +$LLNM KKYY(,TXX?MD*.G&'GGqLGww$+++::HHMM"PQ!&DJ  "::TXX%7%7  "TZZD$7$77  "yy*=*=>H%h0C(DEEOOH- (

4( !) 

'||~=7A8W--NN$  ""45"E%%d?) #&E%%d? ;  (||~=7A8W--NN$ .0  E""#CDE%  	*LL#,,.) 	)) ""#;<II&&v'7'78IIOO% $o%  #o% 	  E""#CDEE%%d? E""#CDEs   E5L <AJ BL K) /P 1O. AK&&L )%LL0O+P <O+AO
O+
O&O+%O&&O++P .%PPQ#P87Q#8%Q Q#Q  Q#)	r@   r?   rW   r   r<   rA   r>   r=   r:   )r/   r0   r1   r2   r   classmethodrJ   rP   rM   r_   rg   rl   ro   rr   r   r   r   re   rk   r   r3   __classcell__)rD   s   @r   r6   r6   D   si    
 O OH2
$  !F.F`>&P< <r   r6   )
concurrentr   rt   r   rN   r   r   r[   r(   collectionsr   r   	functoolsr   	threadingr    r	   r   r   r   r   r   Workerr6   r4   r   r   <module>r      sW      	   
 
             Fp4;; pr   