
    +h#                         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mZmZmZmZmZmZmZmZmZ d dlmZmZ d dlmZ d d	lmZ  G d
 de      Z y)    N)datetime)randint)SSLError)util)
ForbiddenProxyRequestInvalidHeaderInvalidHeaderNameInvalidHTTPVersionInvalidProxyLineInvalidRequestLineInvalidRequestMethodInvalidSchemeHeadersLimitRequestHeadersLimitRequestLine)Responsedefault_environ)reloader_engines)	WorkerTmpc                       e Zd Zdj                         D  cg c]  }t	        t
        d|z         c}}}} Zg 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d Zyc c}}}} w )Workerz+ABRT HUP QUIT INT TERM USR1 USR2 WINCH CHLDzSIG%sc                 x   || _         d| _        || _        || _        || _        || _        || _        d| _        d| _        d| _	        d| _
        |j                  dkD  r+t        d|j                        }|j                  |z   | _        nt        j                  | _        d| _        || _        t%        |      | _        y)z        This is called pre-fork so it shouldn't do anything to the
        current process. If there's a need to make process wide
        changes you'll want to do that in ``self.init_process()``.
        z	[booting]FNr   T)agepidppidsocketsapptimeoutcfgbootedabortedreloadernrmax_requestsr   max_requests_jittersysmaxsizealivelogr   tmp)	selfr   r   r   r   r   r   r(   jitters	            H/var/www/html/venv/lib/python3.12/site-packages/gunicorn/workers/base.py__init__zWorker.__init__%   s     	aQ 7 78F # 0 06 9D #D
S>    c                      d| j                   z  S )Nz<Worker %s>)r   r*   s    r,   __str__zWorker.__str__B   s    txx''r.   c                 8    | j                   j                          y)z        Your worker subclass must arrange to have this method called
        once every ``self.timeout`` seconds. If you fail in accomplishing
        this task, the master process will murder your workers.
        N)r)   notifyr0   s    r,   r3   zWorker.notifyE   s     	r.   c                     t               )z        This is the mainloop of a worker process. You should override
        this method in a subclass to provide the intended behaviour
        for your particular evil schemes.
        )NotImplementedErrorr0   s    r,   runz
Worker.runM   s     "##r.   c                      j                   j                  r? j                   j                  j                         D ]  \  }}|t        j                  |<    t        j                   j                   j                   j                   j                   j                   j                         t        j                          t        j                          _         j                  D ],  }t        j                  |       t        j                  |       .  j                  D ]  }t        j                  |        t        j                   j                   j#                                 j                   j                  d   gz    _         j&                  j                           j)                           j                   j*                  rE fd}t,         j                   j.                     } | j                   j0                  |       _         j5                           j2                  r j2                  j7                           j                   j9                          d _         j=                          y)z        If you override this method in a subclass, the last statement
        in the function should be to call this method with
        super().init_process() so that the ``run()`` loop is initiated.
        )
initgroupsr   c                    j                   j                  d|        d_        t        j                  j
                  d   d       j                  j                         t        j                  d       t        j                  d       y )NzWorker reloading: %s modifiedF      1皙?r   )r(   infor'   oswritePIPEr   
worker_inttimesleepr%   exit)fnamer*   s    r,   changedz$Worker.init_process.<locals>.changedz   s[    =uE"
1t,##D)

3r.   )extra_filescallbackTN)r   envitemsr>   environr   set_owner_processuidgidr8   seedpiper@   set_non_blockingclose_on_execr   r)   filenowait_fdsr(   init_signalsreloadr   reload_enginereload_extra_filesr!   	load_wsgistartpost_worker_initr   r6   )r*   kvpsrF   reloader_clss   `      r,   init_processzWorker.init_processU   s    88<<**, "1 !

1" 	txx||TXX\\*.((*=*=	? 			 GGI	 	"A!!!$q!	"
  	"Aq!	"488??,-		!~5  88?? ,DHH,B,BCL(TXX5P5P29;DM 	==MM!!!$' 
r.   c                    	 | j                   j                         | _        y # t        $ r}| j                  j                  s | j
                  j                  |       	 t        j                         \  }}}| j                  j                  |j                         t        j                         }t        j                  ||       t!        j"                  |j%                               | _        ~n# ~w xY wY d }~y d }~ww xY w)N)file)r   wsgiSyntaxErrorr   rV   r(   	exceptionr%   exc_infor!   add_extra_filefilenameioStringIO	tracebackprint_tbr   make_fail_appgetvalue)r*   e_exc_valexc_tb	tb_strings         r,   rY   zWorker.load_wsgi   s    	DI 	88??HHq!%(\\^"7F,,W-=-=>KKM	""6	: ..y/A/A/CD	FF%	s-   " 	D 2C;BC0.C;0C33C;;D c                    | j                   D ]&  }t        j                  |t        j                         ( t        j                  t        j                  | j                         t        j                  t        j
                  | j                         t        j                  t        j                  | j                         t        j                  t        j                  | j                         t        j                  t        j                  | j                         t        j                  t        j                  | j                         t        j                  t        j
                  d       t        j                  t        j                  d       t        t        d      r#t        j                   | j"                  d          y y )NFset_wakeup_fdr:   )SIGNALSsignalSIG_DFLSIGQUIThandle_quitSIGTERMhandle_exitSIGINTSIGWINCHhandle_winchSIGUSR1handle_usr1SIGABRThandle_abortsiginterrupthasattrrv   r@   )r*   r_   s     r,   rU   zWorker.init_signals   s    	-AMM!V^^,	- 	fnnd&6&67fnnd&6&67fmmT%5%56foot'8'89fnnd&6&67fnnd&7&78 	FNNE2FNNE26?+  1. ,r.   c                 8    | j                   j                          y )N)r(   reopen_filesr*   sigframes      r,   r   zWorker.handle_usr1   s    r.   c                     d| _         y )NF)r'   r   s      r,   r}   zWorker.handle_exit   s	    
r.   c                     d| _         | j                  j                  |        t        j                  d       t        j                  d       y )NFr<   r   )r'   r   rA   rB   rC   r%   rD   r   s      r,   r{   zWorker.handle_quit   s1    
D!

3r.   c                 r    d| _         | j                  j                  |        t        j                  d       y )NFr:   )r'   r   worker_abortr%   rD   r   s      r,   r   zWorker.handle_abort   s&    
d#r.   c                    t        j                         }|xs d}t        |t        t        t
        t        t        t        t        t        t        t        t        f      rd}d}t        |t              rdt        |      z  }n7t        |t              rdt        |      z  }nt        |t
              rdt        |      z  }nt        |t        t        f      r)dt        |      z  }|st        |d      r|j                   }nt        |t              rdt        |      z  }nt        |t              rd	}d
t        |      z  }d}nwt        |t              rdt        |      z  }nXt        |t              rd}d}d}nAt        |t              rdt        |      z  }n"t        |t              rd}dt        |      z  }d}d}	| j"                  j%                  |	j'                  |d   t        |                   n8t        |d      r&| j"                  j)                  d|j*                         d}d}d}|t        j                         |z
  }
t-        ||| j.                        }|d   |d<   t        |d         |d<   t1        ||| j.                        }|d||_        t5              |_        | j"                  j9                  ||||
       	 t;        j<                  |||       y # t>        $ r | j"                  jA                  d       Y y w xY w)N) i  zBad RequestzInvalid Request Line '%s'zInvalid Method '%s'zInvalid HTTP Version '%s'z%sreqzRequest Header Fields Too LargezError parsing headers: '%s'i  z'%s'	ForbiddenzRequest forbiddeni  z%Invalid request from ip={ip}: {error}r   )iperrorurizError handling request %si  zInternal Server Errorr   REMOTE_ADDRr:   REMOTE_PORT zFailed to send error message.)!r   now
isinstancer   r   r
   r   r	   r   r   r   r   r   r   strr   r   r(   warningformatrf   r   r   r   r   statuslenresponse_lengthaccessr   write_error	Exceptiondebug)r*   r   clientaddrexcrequest_start
status_intreasonmesgmsgrequest_timerK   resps                r,   handle_errorzWorker.handle_error   s    xc 4/@13 
  J"F#122SX=C!56,s3x7C!342SX=C"3]!DEc#hwsE2''CC!12c#hC!45:4s3x? 
C!12C(C!67$* 
C!56c#hC*$C( 
9CHHSZZ47#c(ZCDsE"""#>HJ,FD?#<<>M9L%c6488<G%)!WGM"%(a\GM"C2D%/8DK#&t9D HHOOD#w=	<VZ> 	<HHNN:;	<s   K! !$LLc                 :    | j                   j                  d       y )Nzworker: SIGWINCH ignored.)r(   r   )r*   r   rE   s      r,   r   zWorker.handle_winch  s    23r.   N)__name__
__module____qualname__splitgetattrrx   rw   r@   r-   r1   r3   r6   ra   rY   rU   r   r}   r{   r   r   r   ).0xr   rx   s   0000r,   r   r      s     	6;;= wvw{+ G D":($9v./( 
B<H4es   A$
r   )!rj   r>   rx   r%   rB   rl   r   randomr   sslr   gunicornr   gunicorn.http.errorsr   r   r	   r
   r   r   r   r   r   r   gunicorn.http.wsgir   r   gunicorn.reloaderr   gunicorn.workers.workertmpr   objectr    r.   r,   <module>r      sM    
 	  
         9 . 0v4V v4r.   