a
    �ÏOc¢/  ã                   @   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   úO/var/www/html/gsl.tools/lib/python3.9/site-packages/gunicorn/workers/gthread.pyÚ__init__#   s    zTConn.__init__c                 C   sV   | j  d¡ | jd u rR| jjr<tj| j fddi| jj¤Ž| _ t 	| j| j | j
¡| _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   s(   |j |j }|dkr$|jr$| d¡ 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-   Z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-   ÚappendZadd_done_callbackÚfinish_request)r   ÚfsrE   r   r   r   Ú_wrap_futurej   s    zThreadWorker._wrap_futurec                 C   s(   |  ¡  | j | j|¡}|  ||¡ d S r   )r   r*   ZsubmitÚhandlerI   )r   rE   rH   r   r   r   Úenqueue_reqo   s    zThreadWorker.enqueue_reqc              
   C   sz   z8|  ¡ \}}t| j|||ƒ}|  jd7  _|  |¡ W n< tyt } z$|jtjtjtj	fvr`‚ W Y d }~n
d }~0 0 d S )Nr   )
Úacceptr   r   r/   rK   ÚEnvironmentErrorÚerrnoÚEAGAINÚECONNABORTEDÚEWOULDBLOCK)r   r   Zlistenerr   r   rE   Úer   r   r   rL   u   s    ÿzThreadWorker.acceptc              	   C   sr   | j �N | j |¡ z| j |¡ W n  tyD   Y W d   ƒ d S 0 W d   ƒ n1 sZ0    Y  |  |¡ d S r   )r,   r+   Ú
unregisterr.   ÚremoveÚ
ValueErrorrK   )r   rE   r   r   r   r   Úreuse_connection‚   s    2zThreadWorker.reuse_connectionc                 C   sJ  t   ¡ }| j�D z| j ¡ }W n$ tyB   Y W d   ƒ �qFY n0 W d   ƒ n1 sX0    Y  |j| }|dkr¬| j� | j |¡ W d   ƒ n1 sœ0    Y  �qFq|  jd8  _| j�j z| j 	|j
¡ W nF t�y } z|jtjkrô‚ W Y d }~nd }~0  t�y   Y n0 W d   ƒ n1 �s20    Y  | ¡  qd S )Nr   r   )r   r,   r.   ÚpopleftÚ
IndexErrorr   Ú
appendleftr/   r+   rS   r   rM   rN   ÚEBADFÚKeyErrorr!   )r   ÚnowrE   ÚdeltarR   r   r   r   Úmurder_keepalived�   s*    6
*&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 ]4}| d¡ | ¡ }t| j|ƒ}| j |tj|¡ q| j	rÖ|  
¡  | j| jk r–| j d¡}|D ]\}}|j}||jƒ qftj| jdtjd�}ntj| jdtjd�}|jD ]}	| j |	¡ q°|  ¡ sÌqÖ|  ¡  q<| j d¡ | j ¡  | j D ]}
|
 ¡  qòtj| j| jjd� d S )NFg      ð?r   )r   Zreturn_when)r   )Zsocketsr   Úgetsocknamer   rL   r+   Úregisterr9   Ú
EVENT_READr=   Únotifyr/   r'   ÚselectÚdataÚfileobjr-   ÚwaitZFIRST_COMPLETEDÚdonerT   rb   r^   r*   r>   r!   r   Zgraceful_timeout)r   r   r   ZacceptorÚeventsÚkeyÚ_ÚcallbackÚresultZfutÚsr   r   r   Úrun·   s8    


ÿ
ÿ




zThreadWorker.runc                 C   sè   |  ¡ r$|  jd8  _|j ¡  d S z”| ¡ \}}|r | jr |j d¡ | ¡  | j	�8 | j
 |¡ | j |jtjt| j|ƒ¡ W d   ƒ q¶1 s”0    Y  n|  jd8  _| ¡  W n* tyâ   |  jd8  _|j ¡  Y n0 d S )Nr   F)Z	cancelledr/   rE   r!   rp   r=   r   r   r    r,   r.   rF   r+   rd   r9   re   r   rV   Ú	Exception)r   rH   r   rE   r   r   r   rG   ç   s&    


ÿ$zThreadWorker.finish_requestc              
   C   sè  d}d }z8t |jƒ}|s"d|fW S |  ||¡}|r<||fW S W �nž tjjyx } z| j d|¡ W Y d }~�npd }~0  tyª } z| j d|¡ W Y d }~�n>d }~0  t	j
�y } zT|jd t	jkrä| j d¡ |j ¡  n | j d¡ |  ||j|j|¡ W Y d }~nÐd }~0  t�y¦ } zv|jtjtjtjfv�rN| j d¡ nD|jtjk�rj| j d¡ n(|jtjk�r†| j d	¡ n| j d
¡ W Y d }~nBd }~0  t�yÞ } z |  ||j|j|¡ W Y d }~n
d }~0 0 d|fS )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   rM   rN   ÚEPIPEÚ
ECONNRESETÚENOTCONNÚ	exceptionrs   )r   rE   r   ÚreqrR   r   r   r   rJ     s<    

$$( *zThreadWorker.handlec           	      C   s¤  i }d }�zZ�z’| j  | |¡ t ¡ }t ||j|j|j| j ¡\}}d|d< |  j	d7  _	| j	| j
kr†| jr~| j d¡ d| _| ¡  | jr”| j jsž| ¡  nt| jƒ| jkr¶| ¡  |  ||j¡}zlt||d ƒrà| |¡ n|D ]}| |¡ qä| ¡  t ¡ | }| j ||||¡ W t|dƒ�rH| ¡  nt|dƒ�rF| ¡  0 | ¡ �rž| j d¡ W W z| j  | |||¡ W n  t�y˜   | j d	¡ Y n0 dS W nˆ t�yÂ   t j!t" #¡ Ž  Y nh t�y(   |�r"|j$�r"| j d
¡ z|j %t&j'¡ |j ¡  W n t�y   Y n0 t(ƒ ‚‚ Y n0 W z| j  | |||¡ W n  t�yb   | j d	¡ Y n0 n:z| j  | |||¡ W n  t�yœ   | j d	¡ Y n0 0 dS )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   ra   Zforce_closer   Úlenr.   r)   Zstart_responseÚ
isinstanceÚ
write_fileÚwriter!   ÚaccessÚhasattrZshould_closerw   Zpost_requestrs   r   rM   r
   Úreraiser@   Úexc_infoZheaders_sentr>   ÚsocketÚ	SHUT_RDWRrx   )	r   r€   rE   ÚenvironÚrespZrequest_startZrespiterÚitemZrequest_timer   r   r   ru   .  sz    ÿ

ÿ

ì
ýzThreadWorker.handle_request)r"   r#   r$   r   Úclassmethodr7   r;   r8   rD   rI   rK   rL   rV   r^   rb   rr   rG   rJ   ru   Ú__classcell__r   r   r2   r   r%   B   s    
 0(r%   )Úconcurrent.futuresr-   rN   r_   r9   r‹   r   r@   r   Úcollectionsr   r   Ú	functoolsr   Ú	threadingr   Ú r   r	   r
   r   Úobjectr   ZWorkerr%   r   r   r   r   Ú<module>   s"   !