a
    &ÚwhÔ0  ã                   @   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   úR/var/www/battlenet.uz/venv/lib/python3.9/site-packages/gunicorn/workers/gthread.pyÚ__init__#   s    zTConn.__init__c                 C   sP   d| _ | j d¡ | jd u rL| jjr6t | j| j¡| _t | j| j| j	¡| _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   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_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   Z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   ÚappendZadd_done_callbackÚfinish_request)r   ÚfsrD   r   r   r   Ú_wrap_futurel   s    zThreadWorker._wrap_futurec                 C   s(   |  ¡  | j | j|¡}|  ||¡ d S r   )r   r*   ZsubmitÚhandlerH   )r   rD   rG   r   r   r   Úenqueue_reqq   s    zThreadWorker.enqueue_reqc              
   C   s²   zp|  ¡ \}}t| j|||ƒ}|  jd7  _| j, | j |jtj	t
| j|ƒ¡ W d   ƒ n1 sd0    Y  W n< ty¬ } z$|jtjtjtjfvr˜‚ W Y d }~n
d }~0 0 d S )Nr   )Úacceptr   r   r.   r,   r+   Úregisterr   r8   Ú
EVENT_READr   Úon_client_socket_readableÚOSErrorÚerrnoÚEAGAINÚECONNABORTEDÚEWOULDBLOCK)r   r   Zlistenerr   r   rD   Úer   r   r   rK   w   s    
ÿ&ÿzThreadWorker.acceptc              	   C   sx   | j T | j |¡ |jrLz| j |¡ W n  tyJ   Y W d   ƒ d S 0 W d   ƒ n1 s`0    Y  |  |¡ d S r   )r,   r+   Ú
unregisterr   r-   ÚremoveÚ
ValueErrorrJ   )r   rD   r   r   r   r   rN   ‡   s    2z&ThreadWorker.on_client_socket_readablec                 C   s\  t   ¡ }| jD z| j ¡ }W n$ tyB   Y W d   ƒ qXY n0 W d   ƒ n1 sX0    Y  |j| }|dkr¬| j | j |¡ W d   ƒ n1 sœ0    Y  qXq|  jd8  _| j| z| j 	|j
¡ W nX ty } z|jtjkrô‚ W Y d }~n.d }~0  ty   Y n ty,   Y n0 W d   ƒ n1 sD0    Y  | ¡  qd S )Nr   r   )r   r,   r-   ÚpopleftÚ
IndexErrorr   Ú
appendleftr.   r+   rU   r   rO   rP   ÚEBADFÚKeyErrorrW   r!   )r   ÚnowrD   ÚdeltarT   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Úgetppidr5   Ú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   rK   r+   rL   r8   rM   r<   Únotifyr.   r'   ÚselectÚdataÚfileobjr   ÚwaitZFIRST_COMPLETEDÚdonerV   rc   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.   rD   r!   ro   r<   r   r   r    r,   r-   rE   r+   rL   r8   rM   r   rN   Ú	Exception)r   rG   r   rD   r   r   r   rF   ñ   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
NoMoreDatar5   ÚdebugÚStopIterationÚsslÚSSLErrorr/   ÚSSL_ERROR_EOFr   r!   Úhandle_errorr   rO   rP   ÚEPIPEÚ
ECONNRESETÚENOTCONNÚ	exceptionrr   )r   rD   r   ÚreqrT   r   r   r   rI     s<    

$$( *zThreadWorker.handlec           	      C   sÂ  i }d }zx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ä| ¡  W t ¡ | }| j ||||¡ t|dƒrf| ¡  n4t ¡ | }| j ||||¡ t|dƒrd| ¡  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yF   |r@|j$r@| j d
¡ z|j %t&j'¡ |j ¡  W n ty8   Y n0 t(ƒ ‚‚ Y n0 W z| j  | |||¡ W n  ty€   | 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<   r5   rb   Zforce_closer   Úlenr-   r)   Zstart_responseÚ
isinstanceÚ
write_fileÚwriter!   ÚaccessÚhasattrZshould_closerv   Zpost_requestrr   r   rO   r   Úreraiser?   Úexc_infoZheaders_sentr=   ÚsocketÚ	SHUT_RDWRrw   )	r   r€   rD   ÚenvironÚrespZrequest_startZrespiterÚitemZrequest_timer   r   r   rt   8  s~    ÿ


ý

ì
ýzThreadWorker.handle_request)r"   r#   r$   r   Úclassmethodr6   r:   r7   rC   rH   rJ   rK   rN   r_   rc   rq   rF   rI   rt   Ú__classcell__r   r   r1   r   r%   D   s    
#0(r%   )Z
concurrentr   rP   r`   r8   r‹   rx   r?   r   Úcollectionsr   r   Ú	functoolsr   Ú	threadingr   Ú r   r
   r   r   r   r   ZWorkerr%   r   r   r   r   Ú<module>   s$   #