o
    2³c¢/  ã                   @   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   úN/var/www/html/gps/gps/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   Úis_sslÚsslÚwrap_socketÚssl_optionsr	   Ú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   r5   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)r0   ÚThreadPoolExecutorr   r+   r   r   r   r   r;   ^   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_quitb   s
   
zThreadWorker.handle_quitc                 C   s"   ||_ | j |¡ | | j¡ d S r    )Úconnr0   ÚappendÚadd_done_callbackÚfinish_request)r   ÚfsrJ   r   r   r   Ú_wrap_futurej   s   zThreadWorker._wrap_futurec                 C   s(   |  ¡  | j | j|¡}|  ||¡ d S r    )r   r-   ÚsubmitÚhandlerO   )r   rJ   rN   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   r2   rR   ÚEnvironmentErrorÚerrnoÚEAGAINÚECONNABORTEDÚEWOULDBLOCK)r   r   Úlistenerr   r   rJ   Úer   r   r   rS   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.   Ú
unregisterr1   ÚremoveÚ
ValueErrorrR   )r   rJ   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 s•w   Y  | ¡  q)NTr   r   )r!   r/   r1   ÚpopleftÚ
IndexErrorr   Ú
appendleftr2   r.   r[   r   rT   rU   ÚEBADFÚKeyErrorr$   )r   ÚnowrJ   ÚdeltarZ   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)ÚppidÚosÚgetppidr9   Ú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   rS   r.   Úregisterr<   Ú
EVENT_READrA   Únotifyr2   r*   ÚselectÚdataÚfileobjr0   ÚwaitÚFIRST_COMPLETEDÚdoner\   rk   rf   r-   rC   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)Ú	cancelledr2   rJ   r$   r~   rA   r   r   r#   r/   r1   rK   r.   ro   r<   rp   r   r^   Ú	Exception)r   rN   r"   rJ   r   r   r   rM   ç   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Ú
NoMoreDatar9   ÚdebugÚStopIterationr   ÚSSLErrorr3   ÚSSL_ERROR_EOFr   r$   Úhandle_errorr   rT   rU   ÚEPIPEÚ
ECONNRESETÚENOTCONNÚ	exceptionrƒ   )r   rJ   r"   ÚreqrZ   r   r   r   rQ     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   Úpre_requestr   rd   r   Úcreater   r   r   ÚnrÚmax_requestsrA   r9   rj   Úforce_closer"   Úlenr1   r,   Ústart_responseÚ
isinstanceÚ
write_fileÚwriter$   ÚaccessÚhasattrÚshould_closerˆ   Úpost_requestrƒ   r   rT   r
   ÚreraiserE   Úexc_infoÚheaders_sentrC   ÚsocketÚ	SHUT_RDWRr‰   )	r   r‘   rJ   ÚenvironÚrespÚrequest_startÚrespiterÚitemÚrequest_timer   r   r   r…   .  sŽ   ÿ

€
ÿ
ÿÿëþþõ€ýýþÿzThreadWorker.handle_request)r%   r&   r'   r   Úclassmethodr:   r>   r;   rI   rO   rR   rS   r^   rf   rk   r   rM   rQ   r…   Ú__classcell__r   r   r5   r   r(   B   s"    
 0(r(   )Úconcurrent.futuresr0   rU   rh   r<   r£   r   rE   r!   Úcollectionsr   r   Ú	functoolsr   Ú	threadingr   Ú r   r	   r
   r   Úobjectr   ÚWorkerr(   r   r   r   r   Ú<module>   s$   !