
    O=de                        d dl Z d dlZd dlmZ d dlmZ d dlZ	 d dlZd dlmZ  eej	                   ed          k     r e
d          n# e$ r  e
d          w xY wd dlmZ d dlmZ d d	lmZmZmZmZ d dlZd d
lmZ d dlmZ dej	        dej	        Z G d de          Z G d de          Z G d dej                  Z G d dej                  Z  G d de          Z!dS )    N)datetime)partial)parse_versionz1.4z+gevent worker requires gevent 1.4 or higher)Pool)StreamServer)hubmonkeysocketpywsgi)base_environ)AsyncWorkerzgevent/z
 gunicorn/c                   j     e Zd ZdZdZd Z fdZd Zd Z fdZ	 fdZ
 fdZ fd	Z fd
Z xZS )GeventWorkerNc           	          t          j                     g }| j        D ]R}|                    t	          j        |j        t          j        |j                                                             S|| _        d S )N)fileno)	r	   	patch_allsocketsappendr
   FAMILYSOCK_STREAMsockr   )selfr   ss      BD:\Sites\api_v1\venv\Lib\site-packages\gunicorn/workers/ggevent.pypatchzGeventWorker.patch%   sx      	) 	)ANN6=63Ev}}( ( ( ) ) ) )    c                     t                                                       | j        t          j                    k    r1| j                            d|            t          j        d           d S d S )Nz!Parent changed, shutting down: %sr   )	supernotifyppidosgetppidloginfosysexitr   	__class__s    r   r   zGeventWorker.notify/   sZ    9
$$HMM=tDDDHQKKKKK %$r   c                 @    t          j        | j        j        d          S )NF)geventTimeoutcfg	keepalive)r   s    r   timeout_ctxzGeventWorker.timeout_ctx5   s    ~dh0%888r   c           
      V   g }i }| j         j        rt          dddi| j         j        }| j        D ]}|                    d           t          | j                  }| j        Ut          | j                   }|
                    dt          d            | j        |f| j        || j        | j        |d|}n<t          | j        |          }t#          |f||d|}| j         j        dk    rd|_        |                                 |                    |           | j        r/|                                  t1          j        d           | j        /	 |D ]J}t5          |d          r|                                 t5          |d	          r|                                 Kt;          j                    }t;          j                    |z
  | j         j        k    rd
}	|D ].}|j                                         |j        j!        k    r|	dz  }	/|	sd S |                                  t1          j        d           t;          j                    |z
  | j         j        k    | j        "                    d| j#        z             |D ]}|$                    d           d S # tJ          $ r Y d S w xY w)Nserver_sideT   )zwsgi.multithreadSERVER_SOFTWARE)applicationspawnr#   handler_classenviron)handler4   g      ?closekillr   z Worker graceful timeout (pid:%s))timeout )&r,   is_ssldictssl_optionsr   setblockingr   worker_connectionsserver_classr   updateVERSIONwsgir#   wsgi_handlerr   r7   r   workers
max_acceptstartr   aliver   r*   sleephasattrr8   r9   timegraceful_timeoutpool
free_countsizewarningpidstop	Exception)
r   serversssl_argsr   rN   r6   serverhfunts	acceptings
             r   runzGeventWorker.run8   s   8? 	FEEE0DEEH 	# 	#AMM!/00D ,&tx00(,'.       +* #'9Ddh"&"3W       
 t{A..%aMDMMHMM8#a''()F%LLNNNNN6""""j 	KKMMML j 		! " "67++ #LLNNN66** "KKMMM B)++"dh&???	% ' 'F{--//6;3CCC!Q	 ! FS!!! )++"dh&??? H?$(JKKK! ' 'A&&&&' ' 	 	 	DD	s   B9J B	J 
J('J(c                 x    |                     d           t                                          |||           d S )Nr1   )r?   r   r7   )r   listenerclientaddrr(   s       r   r7   zGeventWorker.handlew   s9     	1x.....r   c                     	 t                                          ||||           d S # t          j        $ r Y d S t          $ r Y d S w xY wN)r   handle_requestr*   GreenletExit
SystemExit)r   listener_namereqr   r_   r(   s        r   rb   zGeventWorker.handle_request}   sj    	GG""=#tTBBBBB" 	 	 	DD 	 	 	DD	s   $) A	AAc                 V    t          j        t                      j        ||           d S ra   )r*   r4   r   handle_quitr   sigframer(   s      r   rh   zGeventWorker.handle_quit   &     	UWW(#u55555r   c                 V    t          j        t                      j        ||           d S ra   )r*   r4   r   handle_usr1ri   s      r   rn   zGeventWorker.handle_usr1   rl   r   c                     |                                   t          j                     t                                                       d S ra   )r   r   reinitr   init_processr'   s    r   rq   zGeventWorker.init_process   s7    


r   )__name__
__module____qualname__rA   rE   r   r   r.   r[   r7   rb   rh   rn   rq   __classcell__r(   s   @r   r   r       s        LL      9 9 9= = =~/ / / / /    6 6 6 6 6
6 6 6 6 6
        r   r   c                        e Zd ZdZdZdZd ZdS )GeventResponseNc                 0    || _         || _        || _        d S ra   )statusheaderssent)r   rz   r{   clengths       r   __init__zGeventResponse.__init__   s    			r   )rr   rs   rt   rz   r{   r|   r~   r;   r   r   rx   rx      s2        FGD    r   rx   c                   $     e Zd Zd Z fdZ xZS )PyWSGIHandlerc                 r   t          j        | j                  }t          j        | j                  }||z
  }t	          | di           }t          | j        || j                  }t          | d          r| j	        
                                }ng }| j        j                            ||| j        |           d S )Nresponse_headersr{   )r   fromtimestamp
time_starttime_finishgetattrrx   rz   response_lengthrK   r{   itemsrW   r#   accessr6   )r   rH   finishresponse_timeresp_headersrespreq_headerss          r   log_requestzPyWSGIHandler.log_request   s    &t77'(899t%7<<dk<9MNN4## 	,,,..KKKt[$,NNNNNr   c                 p    t                                                      }| j        |d<   | j        |d<   |S )Nzgunicorn.sockRAW_URI)r   get_environr
   path)r   envr(   s     r   r   zPyWSGIHandler.get_environ   s4    gg!!###{OI
r   )rr   rs   rt   r   r   ru   rv   s   @r   r   r      sJ        
O 
O 
O        r   r   c                       e Zd ZdS )PyWSGIServerN)rr   rs   rt   r;   r   r   r   r      s        Dr   r   c                       e Zd ZdZeZeZdS )GeventPyWSGIWorkerz&The Gevent StreamServer based workers.N)rr   rs   rt   __doc__r   rA   r   rE   r;   r   r   r   r      s        ,,L LLLr   r   )"r!   r%   r   	functoolsr   rL   r*   pkg_resourcesr   __version__RuntimeErrorImportErrorgevent.poolr   gevent.serverr   r   r	   r
   r   gunicorngunicorn.http.wsgir   gunicorn.workers.base_asyncr   rC   r   objectrx   WSGIHandlerr   
WSGIServerr   r   r;   r   r   <module>r      sR   
			 



             JMMM ,+++++}V'((==+?+???lHIII @	  F F F
,D
E
EEF       & & & & & & . . . . . . . . . . . .  + + + + + + 3 3 3 3 3 3 3%+%7%7%79M9M
Nr r r r r; r r rj	 	 	 	 	V 	 	 	    F&   *	 	 	 	 	6$ 	 	 	! ! ! ! ! ! ! ! ! !s   A A