
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    'â7`V  ã                   @   s  d 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	m
Z
mZmZ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 zddlZejZW n ek
rÊ   dZeZY nX dZG dd„ dej ƒZ!G dd„ de!ƒZ"G dd„ de!ƒZ#dS )z%Async gunicorn worker for aiohttp.webé    N)Ú	FrameType)ÚAnyÚ	AwaitableÚCallableÚOptionalÚUnion)ÚAccessLogFormat)Úbase)Úwebé   )Ú
set_result)ÚApplication)ÚAccessLogger)ÚGunicornWebWorkerÚGunicornUVLoopWebWorkerÚGunicornTokioWebWorkerc                       sÚ   e Zd ZejZejZe	e	ddœ‡ fdd„Z
ddœ‡ fdd„Zddœdd	„Zddœd
d„Zddœdd„Zd ed ddœdd„Zddœdd„Zeeddœdd„Zeeddœdd„Zee	ddœdd„ƒZeedœdd„Z‡  ZS )!r   N)ÚargsÚkwÚreturnc                    s$   t ƒ j||Ž d | _d| _d | _d S ©Nr   )ÚsuperÚ__init__Ú_taskÚ	exit_codeÚ_notify_waiter)Úselfr   r   ©Ú	__class__© úA/opt/alt/python38/lib64/python3.8/site-packages/aiohttp/worker.pyr   %   s    zGunicornWebWorker.__init__©r   c                    s0   t  ¡  ¡  t  ¡ | _t  | j¡ tƒ  ¡  d S )N)ÚasyncioÚget_event_loopÚcloseZnew_event_loopÚloopZset_event_loopr   Úinit_process©r   r   r   r   r%   ,   s    
zGunicornWebWorker.init_processc                 C   s|   | j  |  ¡ ¡| _z| j  | j¡ W n  tk
rD   | j d¡ Y nX tj	dkrb| j  | j  
¡ ¡ | j  ¡  t | j¡ d S )NzException in gunicorn worker)é   é   )r$   Zcreate_taskÚ_runr   Zrun_until_completeÚ	ExceptionÚlogÚ	exceptionÚsysÚversion_infoZshutdown_asyncgensr#   Úexitr   r&   r   r   r   Úrun5   s    

zGunicornWebWorker.runc           
      Ã   s¸  t | jtƒr| j}n,t | j¡r0|  ¡ I d H }ntd | j¡ƒ‚| jjrP| j	j
nd }tj|| j	| jj||  | jj¡d�}| ¡ I d H  | jjrš|  | j¡nd }|}|d k	s®t‚|j}|d k	sÀt‚| jD ]0}tj|||| jjd d d�}| ¡ I d H  qÆt ¡ }zŽ| j�rŒ|  ¡  |j}	| jj�rF|	| jjk�rFd| _| j	 d| ¡ nB|t ¡ k�rz| j t !¡ k�rzd| _| j	 d| ¡ n|  "¡ I d H  �qW n t#k
�r¤   Y nX | $¡ I d H  d S )	NzUwsgi app should be either Application or async function returning Application, got {})ÚloggerZkeepalive_timeoutÚ
access_logÚaccess_log_formatéd   é_   )Zssl_contextZshutdown_timeoutFzMax requests, shutting down: %sz!Parent changed, shutting down: %s)%Ú
isinstanceZwsgir   r!   ÚiscoroutinefunctionÚRuntimeErrorÚformatÚcfgZ	accesslogr+   r2   r
   Z	AppRunnerZ	keepaliveÚ_get_valid_log_formatr3   ÚsetupZis_sslÚ_create_ssl_contextÚAssertionErrorÚserverZsocketsZSockSiteZgraceful_timeoutÚstartÚosÚgetpidÚaliveÚnotifyZrequests_countZmax_requestsÚinfoZppidÚgetppidÚ_wait_next_notifyÚBaseExceptionÚcleanup)
r   Zappr2   ZrunnerÚctxr?   ÚsockÚsiteÚpidZcntr   r   r   r)   B   s\    ÿÿû
üzGunicornWebWorker._runzasyncio.Future[bool]c                 C   s>   |   ¡  | j}|d k	st‚| ¡  | _}| j d| j |¡ |S )Ng      ð?)Ú_notify_waiter_doner$   r>   Zcreate_futurer   Z
call_later)r   r$   Úwaiterr   r   r   rG   z   s    z#GunicornWebWorker._wait_next_notify)rO   r   c                 C   s4   |d kr| j }|d k	r t|dƒ || j kr0d | _ d S )NT)r   r   )r   rO   r   r   r   rN   „   s    

z%GunicornWebWorker._notify_waiter_donec                 C   s°   | j  tj| jtjd ¡ | j  tj| jtjd ¡ | j  tj| jtjd ¡ | j  tj| j	tjd ¡ | j  tj
| jtj
d ¡ | j  tj| jtjd ¡ t tjd¡ t tj
d¡ d S ©NF)r$   Zadd_signal_handlerÚsignalÚSIGQUITÚhandle_quitÚSIGTERMZhandle_exitÚSIGINTÚSIGWINCHZhandle_winchÚSIGUSR1Zhandle_usr1ÚSIGABRTÚhandle_abortÚsiginterruptr&   r   r   r   Úinit_signals�   sL       ÿ   ÿ   ÿ   ÿ   ÿ   ÿzGunicornWebWorker.init_signals)ÚsigÚframer   c                 C   s   d| _ | j | ¡ |  ¡  d S rP   )rC   r:   Z
worker_intrN   ©r   r\   r]   r   r   r   rS   ¯   s    zGunicornWebWorker.handle_quitc                 C   s&   d| _ d| _| j | ¡ t d¡ d S )NFr   )rC   r   r:   Zworker_abortr-   r/   r^   r   r   r   rY   ¸   s    zGunicornWebWorker.handle_abortÚ
SSLContext)r:   r   c                 C   s\   t dkrtdƒ‚t  | j¡}| | j| j¡ | j|_| j	rF| 
| j	¡ | jrX| | j¡ |S )z~Creates SSLContext instance for usage in asyncio.create_server.

        See ssl.SSLSocket.__init__ for more details.
        NzSSL is not supported.)Ússlr8   r_   Zssl_versionZload_cert_chainZcertfileZkeyfileZ	cert_reqsZverify_modeZca_certsZload_verify_locationsZciphersZset_ciphers)r:   rJ   r   r   r   r=   ¾   s    z%GunicornWebWorker._create_ssl_context)Úsource_formatr   c                 C   s.   || j kr| jS t d|¡r&tdƒ‚n|S d S )Nz%\([^\)]+\)zêGunicorn's style options in form of `%(name)s` are not supported for the log formatting. Please use aiohttp's format specification to configure access log formatting: http://docs.aiohttp.org/en/stable/logging.html#format-specification)ÚDEFAULT_GUNICORN_LOG_FORMATÚDEFAULT_AIOHTTP_LOG_FORMATÚreÚsearchÚ
ValueError)r   ra   r   r   r   r;   Ð   s    
ÿz'GunicornWebWorker._get_valid_log_format)N)Ú__name__Ú
__module__Ú__qualname__r   Z
LOG_FORMATrc   ÚGunicornAccessLogFormatÚdefaultrb   r   r   r%   r0   r)   rG   r   rN   r[   Úintr   rS   rY   Ústaticmethodr=   Ústrr;   Ú__classcell__r   r   r   r   r       s$   	8 ÿþ 	r   c                       s"   e Zd Zddœ‡ fdd„Z‡  ZS )r   Nr    c                    s0   dd l }t ¡  ¡  t | ¡ ¡ tƒ  ¡  d S r   )Úuvloopr!   r"   r#   Úset_event_loop_policyÚEventLoopPolicyr   r%   )r   rp   r   r   r   r%   à   s    z$GunicornUVLoopWebWorker.init_process©rg   rh   ri   r%   ro   r   r   r   r   r   ß   s   r   c                       s"   e Zd Zddœ‡ fdd„Z‡  ZS )r   Nr    c                    s0   dd l }t ¡  ¡  t | ¡ ¡ tƒ  ¡  d S r   )Útokior!   r"   r#   rq   rr   r   r%   )r   rt   r   r   r   r%   ð   s    z#GunicornTokioWebWorker.init_processrs   r   r   r   r   r   ï   s   r   )$Ú__doc__r!   rA   rd   rQ   r-   Útypesr   Útypingr   r   r   r   r   Zgunicorn.configr   rj   Zgunicorn.workersr	   Úaiohttpr
   Zhelpersr   Zweb_appr   Zweb_logr   r`   r_   ÚImportErrorÚobjectÚ__all__ZWorkerr   r   r   r   r   r   r   Ú<module>   s0   

 @