U
    u?d;"                     @   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__ 2/tmp/pip-unpacked-wheel-_pk67_um/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   sr   | j |  | _z| j | j W n  tk
rD   | jd Y nX | j | j   | j 	  t
| j d S )NzException in gunicorn worker)r$   Zcreate_task_runr   Zrun_until_complete	Exceptionlog	exceptionZshutdown_asyncgensr#   sysexitr   r&   r   r   r   run5   s    
zGunicornWebWorker.runc                    s  d }t | jtr| j}nHt| jrP|  I d H }t |tjrJ|}|j}q`|}ntd	| j|d kr| j
jrx| 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rn|
| j
jkrnd| _| j d|  nB|	t kr| j!t" krd| _| 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_formatd   _   )ssl_contextZshutdown_timeoutFzMax requests, shutting down: %sz!Parent changed, shutting down: %s)&
isinstancewsgir   r!   iscoroutinefunctionr
   Z	AppRunnerappRuntimeErrorformatcfgZ	accesslogr)   r/   	keepalive_get_valid_log_formatr0   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   runnerr7   r5   r/   ctxr@   socksitepidZcntr   r   r   r'   A   sl    	
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   rH      s    z#GunicornWebWorker._wait_next_notify)rQ   r   c                 C   s4   |d kr| j }|d k	r t|d || j kr0d | _ d S )NT)r   r   )r   rQ   r   r   r   rP      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 tjdk rttjtj 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+   version_infoSIGCHLDSIG_DFLr&   r   r   r   init_signals   sP                      
zGunicornWebWorker.init_signals)sigframer   c                 C   s   d| _ | j|  |   d S )NF)rD   r:   Z
worker_intrP   r   rb   rc   r   r   r   rV      s    zGunicornWebWorker.handle_quitc                 C   s&   d| _ d| _| j|  td d S )NFr   )rD   r   r:   Zworker_abortr+   r,   rd   r   r   r   r\      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   re   ssl_versionload_cert_chaincertfilekeyfile	cert_reqsverify_modeca_certsload_verify_locationsciphersset_ciphers)r:   rL   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%\([^\)]+\)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   rq   r   r   r   r<      s    
z'GunicornWebWorker._get_valid_log_format)N)__name__
__module____qualname__r   Z
LOG_FORMATrs   GunicornAccessLogFormatdefaultrr   r   r   r%   r-   r'   rH   r   rP   ra   intr   rV   r\   staticmethodr>   strr<   __classcell__r   r   r   r   r       s$   	B (	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   r   r   r   r   r%      s    z$GunicornUVLoopWebWorker.init_processrw   rx   ry   r%   r   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#   r   r   r   r%   )r   r   r   r   r   r%     s    z#GunicornTokioWebWorker.init_processr   r   r   r   r   r      s   r   )$__doc__r!   rB   rt   rT   r+   typesr   typingr   r   r   r   r   Zgunicorn.configr   rz   Zgunicorn.workersr	   Zaiohttpr
   Zhelpersr   Zweb_appr   Zweb_logr   rf   re   ImportErrorobject__all__ZWorkerr   r   r   r   r   r   r   <module>   s0   

 Q