o
    sZh0                     @   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 d	dlmZ G dd dZG dd dejZdS )    )futuresN)deque)datetime)partial)RLock   )base   )http)util)sock)wsgic                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TConnc                 C   s:   || _ || _|| _|| _d | _d | _d| _| jd d S )NF)cfgr   clientservertimeoutparserinitializedsetblocking)selfr   r   r   r    r   G/var/www/auris/lib/python3.10/site-packages/gunicorn/workers/gthread.py__init__#   s   zTConn.__init__c                 C   sT   d| _ | jd | jd u r(| jjrt| j| j| _t| j| j| j	| _d S d S )NT)
r   r   r   r   r   Zis_sslssl_wrap_socketr
   ZRequestParserr   r   r   r   r   init0   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   r   _keepnr_conns)r   argskwargs	__class__r   r   r   F   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_configR   s   zThreadWorker.check_configc                    s*   |   | _t | _t | _t   d S r   )	get_thread_poolr*   	selectorsDefaultSelectorr+   r   r,   r&   init_processr   r1   r   r   r:   Z   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   r7   `   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_quitd   s
   
zThreadWorker.handle_quitc                 C   s"   ||_ | j| || j d S r   )connr   appendadd_done_callbackfinish_request)r   fsrE   r   r   r   _wrap_futurel   s   zThreadWorker._wrap_futurec                 C   s(   |   | j| j|}| || d S r   )r   r*   submithandlerJ   )r   rE   rI   r   r   r   enqueue_reqq   s   zThreadWorker.enqueue_reqc              
   C   s   z;|  \}}t| j|||}|  jd7  _| j | j|jtj	t
| j| W d    W d S 1 s4w   Y  W d S  tyZ } z|jtjtjtjfvrO W Y d }~d S d }~ww )Nr   )acceptr   r   r.   r,   r+   registerr   r8   
EVENT_READr   on_client_socket_readableOSErrorerrnoEAGAINECONNABORTEDEWOULDBLOCK)r   r   Zlistenerr   r   rE   er   r   r   rN   w   s"   
&zThreadWorker.acceptc              	   C   sx   | j * | j| |jr&z| j| W n ty%   Y W d    d S w W d    n1 s0w   Y  | | d S r   )r,   r+   
unregisterr   r-   remove
ValueErrorrM   )r   rE   r   r   r   r   rQ      s   z&ThreadWorker.on_client_socket_readablec                 C   sN  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; z	| j	|j
 W n) ty } z|jtjkrx W Y d }~nd }~w ty   Y n	 ty   Y nw W d    n1 sw   Y  |  q)NTr   r   )r   r,   r-   popleft
IndexErrorr   
appendleftr.   r+   rX   r   rR   rS   EBADFKeyErrorrZ   r!   )r   nowrE   deltarW   r   r   r   murder_keepalived   sJ   

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getppidr5   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   rN   r+   rO   r8   rP   r=   notifyr.   r'   selectdatafileobjr   waitFIRST_COMPLETEDdonerY   rf   rb   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.   rE   r!   ru   r=   r   r   r    r,   r-   rF   r+   rO   r8   rP   r   rQ   	Exception)r   rI   r   rE   r   r   r   rH      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
NoMoreDatar5   debugStopIterationsslSSLErrorr/   SSL_ERROR_EOFr   r!   handle_errorr   rR   rS   EPIPE
ECONNRESETENOTCONN	exceptionrz   )r   rE   r   reqrW   r   r   r   rL     sd   






zThreadWorker.handlec           	      C   s  i }d }z7z| 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|  W t | }| j|||| t|dr|  nt | }| j|||| 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yX   | 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=   r5   re   Zforce_closer   lenr-   r)   Zstart_response
isinstance
write_filewriter!   accesshasattrZshould_closer~   Zpost_requestrz   r   rR   r   reraiser@   exc_infoZheaders_sentr>   socket	SHUT_RDWRr   )	r   r   rE   environrespZrequest_startZrespiteritemZrequest_timer   r   r   r|   8  s   




zThreadWorker.handle_request)r"   r#   r$   r   classmethodr6   r:   r7   rD   rJ   rM   rN   rQ   rb   rf   rx   rH   rL   r|   __classcell__r   r   r1   r   r%   D   s"    
#0(r%   )
concurrentr   rS   rc   r8   r   r   r@   r   collectionsr   r   	functoolsr   	threadingr    r   r
   r   r   r   r   ZWorkerr%   r   r   r   r   <module>   s&   #