o
    7?e#                     @   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 d dlmZmZ d dlmZ d d	lmZ G d
d deZ dS )    N)datetime)randint)SSLError)util)
ForbiddenProxyRequestInvalidHeaderInvalidHeaderNameInvalidHTTPVersionInvalidProxyLineInvalidRequestLineInvalidRequestMethodInvalidSchemeHeadersLimitRequestHeadersLimitRequestLine)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   V/home/www/facesmatcher.com/pyenv/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bootedZabortedreloadernrZmax_requestsr   Zmax_requests_jittersysmaxsizealivelogr   tmp)	selfr   r   r   r    r!   r"   r)   jitterr   r   r   __init__%   s$   
zWorker.__init__c                 C   s
   d| j  S )Nz<Worker %s>)r   r+   r   r   r   __str__B      
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*   notifyr.   r   r   r   r1   E   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.
        )NotImplementedErrorr.   r   r   r   runM   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rz 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)fnamer.   r   r   changedz   s   
z$Worker.init_process.<locals>.changed)Zextra_filescallbackTN)r"   envitemsr9   environr   Zset_owner_processuidgidr4   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#   r3   )r+   kvpsrA   Zreloader_clsr   r.   r   init_processU   s:   





zWorker.init_processc              
   C   s   z	| j  | _W d S  tyN } z9| jjs | j| z$t \}}}| j	
|j t }tj||d t| | _W ~n~w W Y d }~d S d }~ww )N)file)r    ZwsgiSyntaxErrorr"   rL   r)   	exceptionr&   exc_infor$   Zadd_extra_filefilenameioStringIO	tracebackprint_tbr   Zmake_fail_appgetvalue)r+   e_exc_valexc_tbZ	tb_stringr   r   r   rM      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rZt| jd  d S d S )NFset_wakeup_fdr5   )SIGNALSr   SIG_DFLSIGQUIThandle_quitSIGTERMhandle_exitSIGINTSIGWINCHhandle_winchSIGUSR1handle_usr1SIGABRThandle_abortsiginterrupthasattrrb   r;   )r+   rR   r   r   r   rK      s   

zWorker.init_signalsc                 C   s   | j   d S )N)r)   Zreopen_filesr+   sigframer   r   r   rm      s   zWorker.handle_usr1c                 C   s
   d| _ d S )NF)r(   rr   r   r   r   rh      r0   zWorker.handle_exitc                 C   s*   d| _ | j|  td td d S )NFr7   r   )r(   r"   r<   r=   r>   r&   r?   rr   r   r   r   rf      s   
zWorker.handle_quitc                 C   s    d| _ | j|  td d S )NFr5   )r(   r"   Zworker_abortr&   r?   rr   r   r   r   ro      s   zWorker.handle_abortc                 C   sJ  t  }|pd}t|ttttttt	t
tttfrd}d}t|tr(dt| }nt|tr4dt| }nst|tr@dt| }ngt|ttfrXdt| }|sWt|drW|j}nOt|trddt| }nCt|t	rtd	}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 d}d}d}|d urt  | }
t||| j}|d |d< t|d |d< t||| j}d||f |_t||_| j||||
 zt|||| W d S  ty$   | 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%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 Errorru   ZREMOTE_ADDRr5   ZREMOTE_PORTz%s %szFailed to send error message.)!r   now
isinstancer   r   r	   r   r   r   r   r
   r   r   r   strrq   rw   r)   warningformatrV   r{   r   r"   r   statuslenZresponse_lengthaccessr   Zwrite_error	Exceptiondebug)r+   rw   clientaddrexcZrequest_startZ
status_intreasonZmesgmsgZrequest_timerE   respr   r   r   handle_error   s|   	








 


zWorker.handle_errorc                 C   s   | j d d S )Nzworker: SIGWINCH ignored.)r)   r   )r+   rs   r@   r   r   r   rk     s   zWorker.handle_winchN)__name__
__module____qualname__splitrc   r;   r-   r/   r1   r3   rS   rM   rK   rm   rh   rf   ro   r   rk   r   r   r   r   r      s$    ;Dr   )!rY   r9   r   r&   r=   r[   r   randomr   sslr   Zgunicornr   Zgunicorn.http.errorsr   r   r   r	   r
   r   r   r   r   r   Zgunicorn.http.wsgir   r   Zgunicorn.reloaderr   Zgunicorn.workers.workertmpr   objectr   r   r   r   r   <module>   s   0