o
    )Wg0                     @   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   W/var/www/html/audio_editor/env/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   is_sslssl_wrap_socketr
   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   r3   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   r9   `   s   zThreadWorker.get_thread_poolc                 C   s6   d| _ | j|  | jd td td d S )NFg?r   )	aliver   
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   fsrH   r   r   r   _wrap_futurel   s   zThreadWorker._wrap_futurec                 C   s(   |   | j| j|}| || d S r   )r   r,   submithandlerM   )r   rH   rL   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   r0   r.   r-   registerr   r:   
EVENT_READr   on_client_socket_readableOSErrorerrnoEAGAINECONNABORTEDEWOULDBLOCK)r   r   listenerr   r   rH   er   r   r   rQ   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
ValueErrorrP   )r   rH   r   r   r   r   rT      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   
appendleftr0   r-   r\   r   rU   rV   EBADFKeyErrorr^   r#   )r   nowrH   deltar[   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)ppidosgetppidr7   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   rQ   r-   rR   r:   rS   r?   notifyr0   r)   selectdatafileobjr   waitFIRST_COMPLETEDdoner]   rk   rf   r,   rA   r#   r   graceful_timeout)r   r   r   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)	cancelledr0   rH   r#   r|   r?   r   r   r"   r.   r/   rI   r-   rR   r:   rS   r   rT   	Exception)r   rL   r!   rH   r   r   r   rK      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
   errors
NoMoreDatar7   debugStopIterationsslSSLErrorr1   SSL_ERROR_EOFr   r#   handle_errorr   rU   rV   EPIPE
ECONNRESETENOTCONN	exceptionr   )r   rH   r!   reqr[   r   r   r   rO     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   pre_requestr   rd   r   creater   r   r   nrmax_requestsr?   r7   rj   force_closer!   lenr/   r+   start_response
isinstance
write_filewriter#   accesshasattrshould_closer   post_requestr   r   rU   r   reraiserC   exc_infoheaders_sentrA   socket	SHUT_RDWRr   )	r   r   rH   environresprequest_startrespiteritemrequest_timer   r   r   r   8  s   




zThreadWorker.handle_request)r$   r%   r&   r   classmethodr8   r<   r9   rG   rM   rP   rQ   rT   rf   rk   r   rK   rO   r   __classcell__r   r   r3   r   r'   D   s"    
#0(r'   )
concurrentr   rV   rh   r:   r   r   rC   r    collectionsr   r   	functoolsr   	threadingr    r   r
   r   r   r   r   Workerr'   r   r   r   r   <module>   s&   #