o
    n~bK"                     @   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yd   dZeZY nw 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de	de	ddf fddZ
d" fddZd"d	d
Zd"ddZd#ddZ	d$ded ddfddZd"ddZdededdfddZdededdfddZede	ddfddZdedefd d!Z  ZS )%r   argskwreturnNc                    s(   t  j|i | d | _d| _d | _d S Nr   )super__init___task	exit_code_notify_waiter)selfr   r   	__class__ 9/usr/local/lib/python3.10/dist-packages/aiohttp/worker.pyr   %   s   
zGunicornWebWorker.__init__c                    s0   t    t  | _t | j t   d S N)asyncioget_event_loopclosenew_event_looploopset_event_loopr   init_processr   r   r   r   r'   ,   s   
zGunicornWebWorker.init_processc                 C   sp   | j |  | _z	| j | j W n ty!   | jd Y nw | j | j   | j 	  t
| j d S )NzException in gunicorn worker)r%   create_task_runr   run_until_complete	Exceptionlog	exceptionshutdown_asyncgensr#   sysexitr   r(   r   r   r   run5   s   
zGunicornWebWorker.runc                    s  d }t | jtr| j}n$t| jr)|  I d H }t |tjr&|}|j}n|}ntd	| j|d u rQ| j
jr=| jjnd }tj|| j| j
j|| | j
jd}| I d H  | j
jrb| | j
nd }|}|d uslJ |j}|d usuJ | jD ]}tj|||| j
jd d d}| I d H  qxt }	zC| jr|   |j}
| j
jr|
| j
jkrd| _| jd|  n|	t kr| j t! krd| _| jd|  n| " I d H  | jsW n	 t#y   Y nw |$ 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-   r4   	keepalive_get_valid_log_formatr5   setupZis_ssl_create_ssl_contextserversocketsZSockSiteZgraceful_timeoutstartosgetpidalivenotifyZrequests_countZmax_requestsinfoZppidgetppid_wait_next_notifyBaseExceptioncleanup)r   runnerr<   r:   r4   ctxrD   socksitepidZcntr   r   r   r*   A   sr   	
zGunicornWebWorker._runasyncio.Future[bool]c                 C   s>   |    | j}|d usJ |  | _}| jd| j | |S )Ng      ?)_notify_waiter_doner%   create_futurer   
call_later)r   r%   waiterr   r   r   rM      s   z#GunicornWebWorker._wait_next_notifyrY   c                 C   s8   |d u r| j }|d urt|d || j u rd | _ d S d S )NT)r   r   )r   rY   r   r   r   rV      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 rettjtj d S d S )NF)      )r%   add_signal_handlersignalSIGQUIThandle_quitSIGTERMZhandle_exitSIGINTSIGWINCHZhandle_winchSIGUSR1Zhandle_usr1SIGABRThandle_abortsiginterruptr0   version_infoSIGCHLDSIG_DFLr(   r   r   r   init_signals   s.   
zGunicornWebWorker.init_signalssigframec                 C   s   d| _ | j|  |   d S )NF)rI   r?   Z
worker_intrV   r   rk   rl   r   r   r   r_      s   zGunicornWebWorker.handle_quitc                 C   s&   d| _ d| _| j|  td d S )NFr   )rI   r   r?   Zworker_abortr0   r1   rm   r   r   r   re      s   zGunicornWebWorker.handle_abortr?   
SSLContextc                 C   s\   t du rtdt | j}|| j| j | j|_| j	r#|
| j	 | jr,|| j |S )z~Creates SSLContext instance for usage in asyncio.create_server.

        See ssl.SSLSocket.__init__ for more details.
        NzSSL is not supported.)sslr=   rn   ssl_versionload_cert_chaincertfilekeyfile	cert_reqsverify_modeca_certsload_verify_locationsciphersset_ciphers)r?   rQ   r   r   r   rC      s   z%GunicornWebWorker._create_ssl_contextsource_formatc                 C   s(   || j kr| jS td|rt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   rA      s   
z'GunicornWebWorker._get_valid_log_formatr   N)r   rU   r    )__name__
__module____qualname__r   Z
LOG_FORMATr|   GunicornAccessLogFormatdefaultr{   r   r   r'   r2   r*   rM   r   rV   rj   intr   r_   re   staticmethodrC   strrA   __classcell__r   r   r   r   r       s(    
	

B

(	r   c                          e Zd Zd fddZ  ZS )r   r   Nc                    0   dd l }t   t|  t   d S r   )uvloopr!   r"   r#   set_event_loop_policyEventLoopPolicyr   r'   )r   r   r   r   r   r'         z$GunicornUVLoopWebWorker.init_processr   r   r   r   r'   r   r   r   r   r   r          r   c                       r   )r   r   Nc                    r   r   )tokior!   r"   r#   r   r   r   r'   )r   r   r   r   r   r'     r   z#GunicornTokioWebWorker.init_processr   r   r   r   r   r   r      r   r   )$__doc__r!   rG   r}   r]   r0   typesr   typingr   r   r   r   r   Zgunicorn.configr   r   Zgunicorn.workersr	   Zaiohttpr
   helpersr   Zweb_appr   Zweb_logr   ro   rn   ImportErrorobject__all__ZWorkerr   r   r   r   r   r   r   <module>   s4    
 Q