
­­­­­­­­­­­­­­­­­­
<!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logZ	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	st|j}|d k	st| jD ]0}tj|||| jjd d d}| I d H  qt }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 {})ZloggerZkeepalive_timeout
access_logaccess_log_formatd   _   )Zssl_contextZshutdown_timeoutFzMax requests, shutting down: %sz!Parent changed, shutting down: %s)%
isinstanceZwsgir   r!   ZiscoroutinefunctionRuntimeErrorformatcfgZ	accesslogr+   r0   r
   Z	AppRunnerZ	keepalive_get_valid_log_formatr1   Z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BaseExceptionZcleanup)
r   Zappr0   Zrunnerctxr;   ZsockZ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   rC   z   s    z#GunicornWebWorker._wait_next_notify)rH   r   c                 C   s4   |d kr| j }|d k	r t|d || j kr0d | _ d S )NT)r   r   )r   rH   r   r   r   rG      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 rI   )r?   r7   Z
worker_intrG   r   rU   rV   r   r   r   rL      s    zGunicornWebWorker.handle_quitc                 C   s&   d| _ d| _| j|  td d S )NFr   )r?   r   r7   Zworker_abortr,   r.   rW   r   r   r   rR      s    zGunicornWebWorker.handle_abort
SSLContext)r7   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.)sslr5   rX   Zssl_versionZload_cert_chainZcertfileZkeyfileZ	cert_reqsZverify_modeZca_certsZload_verify_locationsZciphersZset_ciphers)r7   rE   r   r   r   r9      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%\([^\)]+\)zGunicorn'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   rZ   r   r   r   r8      s    
z'GunicornWebWorker._get_valid_log_format)N)__name__
__module____qualname__r   Z
LOG_FORMATr\   GunicornAccessLogFormatdefaultr[   r   r   r%   r/   r)   rC   r   rG   rT   intr   rL   rR   staticmethodr9   strr8   __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   ri   r   r   r   r%      s    z$GunicornUVLoopWebWorker.init_processr`   ra   rb   r%   rh   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#   rj   rk   r   r%   )r   rm   r   r   r   r%      s    z#GunicornTokioWebWorker.init_processrl   r   r   r   r   r      s   r   )$__doc__r!   r=   r]   rJ   r,   typesr   typingr   r   r   r   r   Zgunicorn.configr   rc   Zgunicorn.workersr	   Zaiohttpr
   Zhelpersr   Zweb_appr   Zweb_logr   rY   rX   ImportErrorobject__all__ZWorkerr   r   r   r   r   r   r   <module>   s0   

 @