o
    i&                     @   s   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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 dZ#dS )    N)datetime)randint)SSLError)util)ForbiddenProxyRequestInvalidHeaderInvalidHeaderNameInvalidHTTPVersionInvalidProxyLineInvalidRequestLineInvalidRequestMethodInvalidSchemeHeadersLimitRequestHeadersLimitRequestLineUnsupportedTransferCodingExpectationFailedConfigurationProblemObsoleteFolding)Responsedefault_environ)reloader_engines)	WorkerTmpc                   @   s   e Zd Zdd d D Zg Zdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )Workerc                 C   s   g | ]	}t td | qS )zSIG%s)getattrsignal).0x r   I/home/ubuntu/.local/lib/python3.10/site-packages/gunicorn/workers/base.py
<listcomp>    s    zWorker.<listcomp>z+ABRT HUP QUIT INT TERM USR1 USR2 WINCH CHLDc           	      C   s   || _ d| _|| _|| _|| _|| _|| _d| _d| _d| _	d| _
|jdkr3td|j}|j| | _ntj| _d| _|| _t|| _dS )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&   r0   jitterr   r   r   __init__&   s$   
zWorker.__init__c                 C   s
   d| j  S )Nz<Worker %s>)r!   r2   r   r   r   __str__C      
zWorker.__str__c                 C   s   | j   dS )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)r1   notifyr5   r   r   r   r8   F   s   zWorker.notifyc                 C   s   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.
        )NotImplementedErrorr5   r   r   r   runN   s   z
Worker.runc                    s6   j jr j j D ]	\}}|tj|< q
tj j j j j j j	d t
  t  _ jD ]}t| t| q. jD ]}t| q>t j   j jd g  _ j      j jr fdd} jd t j j }| j j|d _    jr j   j   d _   dS )	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                    sJ    j d|  d _t jd d  j  t	d t
d d S )NzWorker reloading: %s modifiedF      1皙?r   )r0   infor/   oswritePIPEr&   
worker_inttimesleepr-   exit)fnamer5   r   r   changed{   s   
z$Worker.init_process.<locals>.changedz(Reloader is on. Use in development only!)extra_filescallbackTN) r&   envitemsr@   environr   set_owner_processuidgidr;   seedpiperB   set_non_blockingclose_on_execr#   r1   filenowait_fdsr0   init_signalsreloadwarningr   reload_enginereload_extra_filesr)   	load_wsgistartpost_worker_initr'   r:   )r2   kvpsrH   reloader_clsr   r5   r   init_processV   s<   





zWorker.init_processc                 C   s   z	| j  | _W d S  tyb } zM| jjs | j| | jd ur-|jd ur-| j	|j t
 }tj||d t| | _W d    n1 sKw   Y  W Y d }~d S W Y d }~d S d }~ww )N)file)r$   wsgiSyntaxErrorr&   rX   r0   	exceptionr)   filenameadd_extra_fileioStringIO	tracebackprint_exceptionr   make_fail_appgetvalue)r2   e	tb_stringr   r   r   r\      s   
8zWorker.load_wsgic                 C   s   | j D ]	}t|tj qttj| j ttj| j ttj| j ttj| j	 ttj
| j ttj| j ttjd ttj
d ttdrZt| jd  d S d S )NFset_wakeup_fdr<   )SIGNALSr   SIG_DFLSIGQUIThandle_quitSIGTERMhandle_exitSIGINTSIGWINCHhandle_winchSIGUSR1handle_usr1SIGABRThandle_abortsiginterrupthasattrrs   rB   )r2   rb   r   r   r   rW      s   

zWorker.init_signalsc                 C   s   | j   d S )N)r0   reopen_filesr2   sigframer   r   r   r~      s   zWorker.handle_usr1c                 C   s
   d| _ d S )NF)r/   r   r   r   r   ry      r7   zWorker.handle_exitc                 C   s*   d| _ | j|  td td d S )NFr>   r   )r/   r&   rC   rD   rE   r-   rF   r   r   r   r   rw      s   
zWorker.handle_quitc                 C   s    d| _ | j|  td d S )NFr<   )r/   r&   worker_abortr-   rF   r   r   r   r   r      s   zWorker.handle_abortc                 C   s  t  }|pd}t|ttttttt	t
tttttttfrd}d}t|tr,dt| }nt|tr8dt| }nt|trDdt| }nt|trRdt| }d}nt|tr`dt| }d	}nt|trldt| }nut|ttfrdt| }|st|d
r|j}n]t|trdt| }nQt|trd}t|}d}nCt|t	rd}dt| }d}n3t|t
rdt| }n't|trd}d}d}nt|trdt| }nt|trd}dt| }d}d}	| j|	j|d t|d nt|dr| jd|j n| jd d	}d}d}|d urJt  | }
t||| j}|d |d< t|d |d< t||| j}d||f |_t||_| j ||||
 zt!"|||| W d S  t#yf   | j$d  Y d S w )!N) i  zBad RequestzInvalid Request Line '%s'zInvalid Method '%s'zInvalid HTTP Version '%s'z%si  i  reqzExpectation Failedi  z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 %sz$Error handling request (no URI read)zInternal Server Errorr   REMOTE_ADDRr<   REMOTE_PORTz%s %szFailed to send error message.)%r   now
isinstancer   r   r	   r   r   r   r   r
   r   r   r   r   r   r   r   strr   r   r0   rY   formatrh   r   r   r&   r   statuslenresponse_lengthaccessr   write_error	Exceptiondebug)r2   r   clientaddrexcrequest_start
status_intreasonmesgmsgrequest_timerM   respr   r   r   handle_error   s   













 

zWorker.handle_errorc                 C   s   | j d d S )Nzworker: SIGWINCH ignored.)r0   r   )r2   r   rG   r   r   r   r|     s   zWorker.handle_winchN)__name__
__module____qualname__splitrt   rB   r4   r6   r8   r:   rd   r\   rW   r~   ry   rw   r   r   r|   r   r   r   r   r      s$    <Sr   )$rk   r@   r   r-   rD   rm   r   randomr   sslr   gunicornr   gunicorn.http.errorsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   gunicorn.http.wsgir   r   gunicorn.reloaderr   gunicorn.workers.workertmpr   r   r   r   r   r   <module>   s   @	