o
    b/                     @   s   d dl mZ 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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 dd	lmZ dd
lmZ ddlmZ G dd deZG dd dejZdS )    N)deque)datetime)partial)RLock   )base   )http)util)wsgic                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TConnc                 C   s4   || _ || _|| _|| _d | _d | _| jd d S )NF)cfgsockclientservertimeoutparsersetblocking)selfr   r   r   r    r   W/var/www/secure340b-portal/env/lib/python3.10/site-packages/gunicorn/workers/gthread.py__init__#   s   zTConn.__init__c                 C   sZ   | j d | jd u r+| jjrtj| j fddi| jj| _ t	| j| j | j
| _d S d S )NTserver_side)r   r   r   r   Zis_sslsslwrap_socketZssl_optionsr	   ZRequestParserr   r   r   r   r   init/   s   
z
TConn.initc                 C   s   t   | jj | _d S N)timer   	keepaliver   r   r   r   r   set_timeout:   s   zTConn.set_timeoutc                 C   s   t | j d S r   )r
   closer   r   r   r   r   r!   >   s   zTConn.closeN)__name__
__module____qualname__r   r   r    r!   r   r   r   r   r   !   s
    r   c                       s   e Zd Z fddZedd Z f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  ZS )ThreadWorkerc                    sZ   t  j|i | | jj| _| jj| jj | _d | _d | _d | _t	 | _
t	 | _d| _d S )Nr   )superr   r   worker_connectionsthreadsmax_keepalivedtpoolpoller_lockr   futures_keepnr_conns)r   argskwargs	__class__r   r   r   D   s   

zThreadWorker.__init__c                 C   s0   |j |j }|dkr|jr|d d S d S d S )Nr   z]No keepalived connections can be handled. Check the number of worker connections and threads.)r'   r(   r   warning)clsr   logr)   r   r   r   check_configP   s   zThreadWorker.check_configc                    s*   |   | _t | _t | _t   d S r   )	get_thread_poolr*   	selectorsDefaultSelectorr+   r   r,   r&   init_processr   r2   r   r   r;   X   s   

zThreadWorker.init_processc                 C   s   t j| jjdS )z@Override this method to customize how the thread pool is created)max_workers)r-   ThreadPoolExecutorr   r(   r   r   r   r   r8   ^   s   zThreadWorker.get_thread_poolc                 C   s6   d| _ | j|  | jd td td d S )NFg?r   )	aliver   Z
worker_intr*   shutdownr   sleepsysexit)r   sigframer   r   r   handle_quitb   s
   
zThreadWorker.handle_quitc                 C   s"   ||_ | j| || j d S r   )connr-   appendadd_done_callbackfinish_request)r   fsrF   r   r   r   _wrap_futurej   s   zThreadWorker._wrap_futurec                 C   s(   |   | j| j|}| || d S r   )r   r*   submithandlerK   )r   rF   rJ   r   r   r   enqueue_reqo   s   zThreadWorker.enqueue_reqc              
   C   sz   z|  \}}t| j|||}|  jd7  _| | W d S  ty< } z|jtjtjtj	fvr1 W Y d }~d S d }~ww )Nr   )
acceptr   r   r/   rN   EnvironmentErrorerrnoEAGAINECONNABORTEDEWOULDBLOCK)r   r   Zlistenerr   r   rF   er   r   r   rO   u   s   zThreadWorker.acceptc              	   C   sr   | j ' | j| z| j| W n ty"   Y W d    d S w W d    n1 s-w   Y  | | d S r   )r,   r+   
unregisterr.   remove
ValueErrorrN   )r   rF   r   r   r   r   reuse_connection   s   zThreadWorker.reuse_connectionc                 C   s>  t   }	 | j  z| j }W n ty    Y W d    d S w W d    n1 s+w   Y  |j| }|dkrU| j | j| W d    d S 1 sNw   Y  d S |  jd8  _| j3 z	| j	|j
 W n! ty } z|jtjkrx W Y d }~nd }~w ty   Y nw W d    n1 sw   Y  |  q)NTr   r   )r   r,   r.   popleft
IndexErrorr   
appendleftr/   r+   rV   r   rP   rQ   EBADFKeyErrorr!   )r   nowrF   deltarU   r   r   r   murder_keepalived   sF   

zThreadWorker.murder_keepalivedc                 C   s$   | j t kr| jd|  dS dS )Nz!Parent changed, shutting down: %sFT)Zppidosgetppidr6   infor   r   r   r   is_parent_alive   s   zThreadWorker.is_parent_alivec                 C   s  | j D ]}|d | }t| j|}| j|tj| q| j	rm| 
  | j| jk rK| jd}|D ]\}}|j}||j q3tj| jdtjd}n
tj| jdtjd}|jD ]}	| j|	 qX|  sfn|   | j	s!| jd | j  | j D ]}
|
  q{tj| j| jjd d S )NFg      ?r   )r   return_when)r   )socketsr   getsocknamer   rO   r+   registerr9   
EVENT_READr>   notifyr/   r'   selectdatafileobjr-   waitFIRST_COMPLETEDdonerW   re   ra   r*   r?   r!   r   Zgraceful_timeout)r   r   r   Zacceptoreventskey_callbackresultfutsr   r   r   run   s:   







zThreadWorker.runc                 C   s   |  r|  jd8  _|j  d S zO| \}}|rT| jrT|jd |  | j	 | j
| | j|jtjt| j| W d    W d S 1 sLw   Y  W d S |  jd8  _|  W d S  tyw   |  jd8  _|j  Y d S w )Nr   F)	cancelledr/   rF   r!   rv   r>   r   r   r    r,   r.   rG   r+   ri   r9   rj   r   rY   	Exception)r   rJ   r   rF   r   r   r   rI      s*   


&zThreadWorker.finish_requestc              
   C   s<  d}d }zt |j}|sd|fW S | ||}|r||fW S W d|fS  tjjy@ } z| jd| W Y d }~d|fS d }~w ty[ } z| jd| W Y d }~d|fS d }~w t	j
y } z6|jd t	jkrw| jd |j  n| jd | ||j|j| W Y d }~d|fS W Y d }~d|fS d }~w ty } zV|jtjtjtjfvr| jd n)|jtjkr| jd n%|jtjkr| jd	 n!| jd
 W Y d }~d|fS W Y d }~d|fS W Y d }~d|fS W Y d }~d|fS d }~w ty } z| ||j|j| W Y d }~d|fS d }~ww )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	   errorsZ
NoMoreDatar6   debugStopIterationr   SSLErrorr0   SSL_ERROR_EOFr   r!   handle_errorr   rP   rQ   EPIPE
ECONNRESETENOTCONN	exceptionr{   )r   rF   r   reqrU   r   r   r   rM     sd   






zThreadWorker.handlec           	      C   s  i }d }z(z| j | | t }t||j|j|j| j \}}d|d< |  j	d7  _	| j	| j
krB| jr>| jd d| _|  | jrI| j jsN|  nt| j| jkrZ|  | ||j}z5t||d ro|| n
|D ]}|| qq|  t | }| j|||| W t|dr|  nt|dr|  w w | r| jd W W z| j | ||| W dS  ty   | jd	 Y dS w W nB ty   t j!t"#   Y n3 ty   |r|j$r| jd
 z|j%t&j' |j  W t(  ty   Y t( w  w W z| j | ||| W dS  ty-   | jd	 Y dS w z| j | ||| W w  tyI   | jd	 Y w w )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   Zpre_requestr   r_   r   creater   r   r   nrZmax_requestsr>   r6   rd   Zforce_closer   lenr.   r)   Zstart_response
isinstance
write_filewriter!   accesshasattrZshould_closer   Zpost_requestr{   r   rP   r
   reraiserA   exc_infoZheaders_sentr?   socket	SHUT_RDWRr   )	r   r   rF   environrespZrequest_startZrespiteritemZrequest_timer   r   r   r}   .  s   



zThreadWorker.handle_request)r"   r#   r$   r   classmethodr7   r;   r8   rE   rK   rN   rO   rY   ra   re   ry   rI   rM   r}   __classcell__r   r   r2   r   r%   B   s"    
 0(r%   )concurrent.futuresr-   rQ   rb   r9   r   r   rA   r   collectionsr   r   	functoolsr   	threadingr    r   r	   r
   r   objectr   ZWorkerr%   r   r   r   r   <module>   s$   !