U
    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 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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   K/var/www/SKSBV.IN/venv/lib/python3.8/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rft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bootedZabortedreloadernrZmax_requestsr   Zmax_requests_jittersysmaxsizealivelogr   tmp)	selfr   r!   r"   r#   r$   r%   r,   Zjitterr   r   r   __init__&   s$    
zWorker.__init__c                 C   s
   d| j  S )Nz<Worker %s>)r    r.   r   r   r   __str__C   s    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)r-   notifyr0   r   r   r   r2   F   s    zWorker.notifyc                 C   s
   t  dS )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.
        N)NotImplementedErrorr0   r   r   r   runN   s    z
Worker.runc                    s,   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}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   )r,   infor+   oswritePIPEr%   
worker_inttimesleepr)   exit)fnamer0   r   r   changed{   s    
z$Worker.init_process.<locals>.changed)Zextra_filescallbackTN)r%   envitemsr:   environr   Zset_owner_processuidgidr5   seedpiper<   Zset_non_blockingZclose_on_execr"   r-   filenoZwait_fdsr,   init_signalsreloadr   Zreload_engineZreload_extra_filesr'   	load_wsgistartZpost_worker_initr&   r4   )r.   kvpsrB   Zreloader_clsr   r0   r   init_processV   s:    





zWorker.init_processc              
   C   s   z| j  | _W n tk
r } zf| jjs, | j| zFt \}}}| j	
|j t }tj||d t| | _W 5 ~X W 5 d }~X Y nX d S )N)file)r#   ZwsgiSyntaxErrorr%   rM   r,   	exceptionr)   exc_infor'   Zadd_extra_filefilenameioStringIO	tracebackprint_tbr   Zmake_fail_appgetvalue)r.   eexc_tb_exc_valZ	tb_stringr   r   r   rN      s    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rt| jd  d S )NFset_wakeup_fdr6   )SIGNALSr   SIG_DFLSIGQUIThandle_quitSIGTERMhandle_exitSIGINTSIGWINCHhandle_winchSIGUSR1handle_usr1SIGABRThandle_abortsiginterrupthasattrrc   r<   )r.   rS   r   r   r   rL      s    

zWorker.init_signalsc                 C   s   | j   d S )N)r,   Zreopen_filesr.   sigframer   r   r   rn      s    zWorker.handle_usr1c                 C   s
   d| _ d S )NF)r+   rs   r   r   r   ri      s    zWorker.handle_exitc                 C   s*   d| _ | j|  td td d S )NFr8   r   )r+   r%   r=   r>   r?   r)   r@   rs   r   r   r   rg      s    
zWorker.handle_quitc                 C   s    d| _ | j|  td d S )NFr6   )r+   r%   Zworker_abortr)   r@   rs   r   r   r   rp      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frd}d}t|trZdt| }nft|trtdt| }nLt|trdt| }n2t|trdt| }d}nt|trdt| }d	}nt|trdt| }nt|ttfrdt| }|st|d
r|j}nt|tr0dt| }nt|t	rRd}dt| }d}nnt|t
rldt| }nTt|trd}d}d}n:t|trdt| }n t|trd}dt| }d}d}	| j|	j|d t|d n6t|dr| jd|j n| jd d	}d}d}|d k	rt  | }
t||| j}|d |d< t|d |d< t||| j}d||f |_t||_| j||||
 zt !|||| W n" t"k
r   | j#d Y nX d S )N) i  zBad RequestzInvalid Request Line '%s'zInvalid Method '%s'zInvalid HTTP Version '%s'z%si  i  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 %sz$Error handling request (no URI read)zInternal Server Errorrv   ZREMOTE_ADDRr6   Z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   strrr   rx   r,   warningformatrW   r|   r   r%   r   statuslenZresponse_lengthaccessr   Zwrite_error	Exceptiondebug)r.   rx   clientaddrexcZrequest_startZ
status_intreasonZmesgmsgZrequest_timerF   respr   r   r   handle_error   s           






 

zWorker.handle_errorc                 C   s   | j d d S )Nzworker: SIGWINCH ignored.)r,   r   )r.   rt   rA   r   r   r   rl     s    zWorker.handle_winchN)__name__
__module____qualname__splitrd   r<   r/   r1   r2   r4   rT   rN   rL   rn   ri   rg   rp   r   rl   r   r   r   r   r      s"   ;Or   )#rZ   r:   r   r)   r>   r\   r   randomr   sslr   Zgunicornr   Zgunicorn.http.errorsr   r   r   r	   r
   r   r   r   r   r   r   r   r   Zgunicorn.http.wsgir   r   Zgunicorn.reloaderr   Zgunicorn.workers.workertmpr   r   r   r   r   r   <module>   s   <	