
    O=d/                         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e          Z G d dej                  ZdS )    N)deque)datetime)partial)RLock   )base   )http)util)wsgic                   &    e Zd Zd Zd Zd Zd ZdS )TConnc                     || _         || _        || _        || _        d | _        d | _        | j                            d           d S )NF)cfgsockclientservertimeoutparsersetblocking)selfr   r   r   r   s        BD:\Sites\api_v1\venv\Lib\site-packages\gunicorn/workers/gthread.py__init__zTConn.__init__#   sJ    	 		e$$$$$    c                    | j                             d           | j        `| j        j        r(t          j        | j         fddi| j        j        | _         t          j	        | j        | j         | j
                  | _        d S d S )NTserver_side)r   r   r   r   is_sslsslwrap_socketssl_optionsr
   RequestParserr   r   s    r   initz
TConn.init/   s    	d###;x DODI D D4 D.2h.BD D	 ,TXty$+NNDKKK r   c                 P    t          j                     | j        j        z   | _        d S N)timer   	keepaliver   r"   s    r   set_timeoutzTConn.set_timeout:   s    y{{TX%77r   c                 8    t          j        | j                   d S r%   )r   closer   r"   s    r   r*   zTConn.close>   s    
49r   N)__name__
__module____qualname__r   r#   r(   r*    r   r   r   r   !   sS        
% 
% 
%	O 	O 	O8 8 8    r   r   c                        e Zd Z fdZed             Z fdZd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Z xZS )ThreadWorkerc                     t                      j        |i | | j        j        | _        | j        j        | j        j        z
  | _        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__s      r   r   zThreadWorker.__init__D   sy    $)&)))"&("="h9DH<LL

wwWW
r   c                 p    |j         |j        z
  }|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.)r3   r4   r'   warning)clsr   logr5   s       r   check_configzThreadWorker.check_configP   s\    /#+=Q3=KK N O O O O O r   c                     |                                  | _        t          j                    | _        t                      | _        t                                                       d S r%   )	get_thread_poolr6   	selectorsDefaultSelectorr7   r   r8   r2   init_process)r   r>   s    r   rH   zThreadWorker.init_processX   sM    ))++
/11WW
r   c                 @    t          j        | j        j                  S )z@Override this method to customize how the thread pool is created)max_workers)r9   ThreadPoolExecutorr   r4   r"   s    r   rE   zThreadWorker.get_thread_pool^   s    )dh6FGGGGr   c                     d| _         | j                            |            | j                            d           t          j        d           t          j        d           d S )NFg?r   )	aliver   
worker_intr6   shutdownr&   sleepsysexit)r   sigframes      r   handle_quitzThreadWorker.handle_quitb   sS    
D!!!
E"""
3r   c                 |    ||_         | j                            |           |                    | j                   d S r%   )connr9   appendadd_done_callbackfinish_request)r   fsrW   s      r   _wrap_futurezThreadWorker._wrap_futurej   s<    B
T011111r   c                     |                                  | j                            | j        |          }|                     ||           d S r%   )r#   r6   submithandler\   )r   rW   r[   s      r   enqueue_reqzThreadWorker.enqueue_reqo   sD    		Zt{D11"d#####r   c                 4   	 |                                 \  }}t          | j        |||          }| xj        dz  c_        |                     |           d S # t
          $ r6}|j        t          j        t          j        t          j	        fvr Y d }~d S d }~ww xY w)Nr   )
acceptr   r   r;   r`   EnvironmentErrorerrnoEAGAINECONNABORTEDEWOULDBLOCK)r   r   listenerr   r   rW   es          r   rb   zThreadWorker.acceptu   s    
	#??,,LD&488DMMQMMT""""" 	 	 	wu|U-?$02 2 22 2 2 2 2 2	s   AA 
B!+BBc                    | j         5  | j                            |           	 | j                            |           n# t
          $ r Y d d d            d S w xY w	 d d d            n# 1 swxY w Y   |                     |           d S r%   )r8   r7   
unregisterr:   remove
ValueErrorr`   )r   rW   r   s      r   reuse_connectionzThreadWorker.reuse_connection   s    Z 	 	K""6***
!!$''''   	 	 	 	 	 	 	 	 (	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s1   A(?A(
A	A(AA((A,/A,c                    t          j                     }	 | j        5  	 | j                                        }n# t          $ r Y d d d            d S w xY w	 d d d            n# 1 swxY w Y   |j        |z
  }|dk    r;| j        5  | j                            |           d d d            n# 1 swxY w Y   d S | xj        dz  c_        | j        5  	 | j        	                    |j
                   n8# t          $ r }|j        t          j        k    r Y d }~nd }~wt          $ r Y nw xY wd d d            n# 1 swxY w Y   |                                 @)NTr   r   )r&   r8   r:   popleft
IndexErrorr   
appendleftr;   r7   rk   r   rc   rd   EBADFKeyErrorr*   )r   nowrW   deltari   s        r   murder_keepalivedzThreadWorker.murder_keepalived   s]   ikk	  :--//DD!                          L3&EqyyZ 0 0J))$///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"Z  ..ty9999+ " " "7ek11! 21111#                  

9	s   A!8A!
AA!AA!!A%(A%B**B.1B.D4C0/D40
D%:DD4D%"D4$D%%D44D8;D8c                 x    | j         t          j                    k    r| j                            d|            dS dS )Nz!Parent changed, shutting down: %sFT)ppidosgetppidrB   infor"   s    r   is_parent_alivezThreadWorker.is_parent_alive   s6    9
$$HMM=tDDD5tr   c                    | j         D ]f}|                    d           |                                }t          | j        |          }| j                            |t          j        |           g| j	        r| 
                                 | j        | j        k     r`| j                            d          }|D ]\  }}|j        } ||j                   t!          j        | j        dt           j                  }n&t!          j        | j        dt           j                  }|j        D ]}	| j                            |	           |                                 sn|                                  | j	        | j                            d           | j                                         | j         D ]}
|
                                 t!          j        | j        | j        j                   d S )NFg      ?r   )r   return_when)r   )socketsr   getsocknamer   rb   r7   registerrF   
EVENT_READrM   notifyr;   r3   selectdatafileobjr9   waitFIRST_COMPLETEDdonerl   r}   rw   r6   rO   r*   r   graceful_timeout)r   r   r   acceptoreventskey_callbackresultfutss              r   runzThreadWorker.run   s   L 	G 	GDU### %%''Ft{F33HK  y';XFFFFj 	%KKMMM }t666++C00$ * *FC"xHHS[)))) !dlA292IK K K !dlC292IK K K { ) )##C((((''))  ""$$$9 j 	%< 	
E""" 	 	AGGIIIIT\48+DEEEEEEr   c           	         |                                 r+| xj        dz  c_        |j                                         d S 	 |                                \  }}|r| j        r|j                            d           |                                 | j	        5  | j
                            |           | j                            |j        t          j        t!          | j        |                     d d d            d S # 1 swxY w Y   d S | xj        dz  c_        |                                 d S # t$          $ r- | xj        dz  c_        |j                                         Y d S w xY w)Nr   F)	cancelledr;   rW   r*   r   rM   r   r   r(   r8   r:   rX   r7   r   rF   r   r   rn   	Exception)r   r[   r'   rW   s       r   rZ   zThreadWorker.finish_request   s   <<>> 	MMQMMGMMOOOF	 "		Y  TZ 	%%e,,,   """Z O OJ%%d+++ K((I4H)01F)M)MO O O	O O O O O O O O O O O O O O O O O O "

 	 	 	 MMQMMGMMOOOOOO		s>   AD/ AC</D/ <D  D/ D D/ 	$D/ /3E&%E&c                    d}d }	 t          |j                  }|sd|fS |                     ||          }|r||fS n# t          j        j        $ r&}| j                            d|           Y d }~nd }~wt          $ r&}| j                            d|           Y d }~nd }~wt          j
        $ r}|j        d         t          j        k    r4| j                            d           |j                                         n<| j                            d           |                     ||j        |j        |           Y d }~nd }~wt"          $ r}|j        t$          j        t$          j        t$          j        fvr| j                            d           nz|j        t$          j        k    r| j                            d           nJ|j        t$          j        k    r| j                            d	           n| j                            d
           Y d }~n<d }~wt.          $ r,}|                     ||j        |j        |           Y d }~nd }~ww xY w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
   errors
NoMoreDatarB   debugStopIterationr   SSLErrorr<   SSL_ERROR_EOFr   r*   handle_errorr   rc   rd   EPIPE
ECONNRESETENOTCONN	exceptionr   )r   rW   r'   reqri   s        r   r_   zThreadWorker.handle  s   	!	>t{##C %t}$ ++C66I )!4((){% 	L 	L 	LHNNGKKKKKKKK 	8 	8 	8HNN3Q77777777| 	B 	B 	BvayC---6777	!!!!>???!!#ty$+qAAA 		@ 		@ 		@wu{E,<enMMM""#EFFFF7e...HNN#>????W..HNN#BCCCCHNN#>??? 	> 	> 	>c49dk1========	> t}sK   > > IA33I B!!I3BEIB?HI""I		Ic                    i }d }	 | j                             | |           t          j                    }t	          j        ||j        |j        |j        | j                   \  }}d|d<   | xj	        dz  c_	        | j	        | j
        k    r<| j        r!| j                            d           d| _        |                                 | j        r| j         j        s|                                 n1t!          | j                  | j        k    r|                                 |                     ||j                  }	 t)          ||d                   r|                    |           n|D ]}|                    |           |                                 t          j                    |z
  }| j                            ||||           t3          |d          r|                                 n*# t3          |d          r|                                 w w xY w|                                rf| j                            d           	 	 | j                             | |||           dS # t:          $ r | j                            d	           Y dS w xY wn# t>          $ r" tA          j!        tE          j#                      Y nt:          $ r |r~|j$        rw| j                            d
           	 |j        %                    tL          j'                   |j                                         n# t>          $ r Y nw xY wtQ                       w xY w	 | j                             | |||           nw# t:          $ r | j                            d	           Y nQw xY w# 	 | j                             | |||           w # t:          $ r | j                            d	           Y w w xY wxY w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   pre_requestr   ru   r   creater   r   r   nrmax_requestsrM   rB   r|   force_closer'   lenr:   r5   start_response
isinstance
write_filewriter*   accesshasattrshould_closer   post_requestr   r   rc   r   reraiserQ   exc_infoheaders_sentrO   socket	SHUT_RDWRr   )	r   r   rW   environresprequest_startrespiteritemrequest_times	            r   r   zThreadWorker.handle_request.  sB   7	EH  s+++$LNNM KTY(,TX? ?MD'*.G&'GGqLGGw$+++: 'HMM"PQQQ!&DJ  """: #TX%7 #  """"TZD$777  """yy$*=>>H%h0C(DEE )OOH---- ( ) )

4((((

'|~~=c7LAAA8W-- %NN$$$ 8W-- %NN$$$$%   "" 4555"E%%dC$????? E E E""#CDDDDDDE+   	* 	* 	*L#,..)))) 	 	 	 	&) 	& ""#;<<<I&&v'7888IOO%%%%'   D#oo%	E%%dC$???? E E E""#CDDDDDEE%%dC$???? E E E""#CDDDDDE ts   D2J 9BG+ %J +'H1J I$ $$JJN )M9N ;,M(=L&%M&
L30M2L33MN 
M( ($NNON21O2$OOOO)r+   r,   r-   r   classmethodrC   rH   rE   rU   r\   r`   rb   rn   rw   r}   r   rZ   r_   r   __classcell__)r>   s   @r   r0   r0   B   s,       
 
 
 
 
 O O [O    H H H  2 2 2
$ $ $      @  .F .F .F`  >& & &P< < < < < < <r   r0   )concurrent.futuresr9   rd   rz   rF   r   r   rQ   r&   collectionsr   r   	functoolsr   	threadingr    r   r
   r   r   objectr   Workerr0   r.   r   r   <module>r      sV   % $ $ $ $ $  				      



 



                                                     F   Bh h h h h4; h h h h hr   