B `V@sdZddlZddlZddlZddlZddlZddlmZddlm Z m Z m Z m Z m Z ddlmZddlmZddlmZdd lmZdd lmZdd lmZyddlZejZWnek rdZeZYnXd ZGd ddej Z!Gddde!Z"Gddde!Z#dS)z%Async gunicorn worker for aiohttp.webN) FrameType)Any AwaitableCallableOptionalUnion)AccessLogFormat)base)web) set_result) Application) AccessLogger)GunicornWebWorkerGunicornUVLoopWebWorkerGunicornTokioWebWorkercseZdZejZejZe e ddfdd Z ddfdd Z dddd Z ddd d Z d dd dZd ed ddddZddddZeeddddZeeddddZee ddddZeedddZZS)!rN)argskwreturncs$tj||d|_d|_d|_dS)Nr)super__init___task exit_code_notify_waiter)selfrr) __class__i/private/var/folders/7j/8686xlfs15q3tgljmghtvg0r0000gn/T/pip-target-isidps9b/lib/python/aiohttp/worker.pyr%szGunicornWebWorker.__init__)rcs0tt|_t|jtdS)N)asyncioget_event_loopcloseZnew_event_looploopZset_event_loopr init_process)r)rrrr",s   zGunicornWebWorker.init_processcCs||j||_y|j|jWn tk rD|jdYnXtj dkrb|j|j |j t |j dS)NzException in gunicorn worker))r!Z create_task_runrZrun_until_complete Exceptionlog exceptionsys version_infoZshutdown_asyncgensr exitr)rrrrrun5s  zGunicornWebWorker.runc st|jtr|j}n,t|jr0|IdH}ntd|j|jjrP|j j nd}t j ||j |jj |||jjd}|IdH|jjr||jnd}|}|dk st|j}|dk stx:|jD]0}t j||||jjddd}|IdHqWt}yx|jr||j} |jjrL| |jjkrLd|_|j d|nB|tkr|j t!krd|_|j d|n|"IdHqWWnt#k rYnX|$IdHdS) NzUwsgi app should be either Application or async function returning Application, got {})loggerZkeepalive_timeout access_logaccess_log_formatd_) ssl_contextZshutdown_timeoutFzMax requests, shutting down: %sz!Parent changed, shutting down: %s)% isinstanceZwsgir riscoroutinefunction RuntimeErrorformatcfgZ accesslogr'r.r Z AppRunner keepalive_get_valid_log_formatr/setupZis_ssl_create_ssl_contextAssertionErrorserverZsocketsZSockSiteZgraceful_timeoutstartosgetpidalivenotifyZrequests_countZ max_requestsinfoZppidgetppid_wait_next_notify BaseExceptioncleanup) rZappr.runnerctxr=socksitepidZcntrrrr%BsT       zGunicornWebWorker._runzasyncio.Future[bool]cCs>||j}|dk st||_}|jd|j||S)Ng?)_notify_waiter_doner!r<Z create_futurerZ call_later)rr!waiterrrrrEzs  z#GunicornWebWorker._wait_next_notify)rNrcCs4|dkr|j}|dk r t|d||jkr0d|_dS)NT)rr )rrNrrrrMs   z%GunicornWebWorker._notify_waiter_donecCs|jtj|jtjd|jtj|jtjd|jtj|jtjd|jtj|j tjd|jtj |j tj d|jtj |j tj dttjdttj ddS)NF)r!Zadd_signal_handlersignalSIGQUIT handle_quitSIGTERMZ handle_exitSIGINTSIGWINCHZ handle_winchSIGUSR1Z handle_usr1SIGABRT handle_abort siginterrupt)rrrr init_signalsszGunicornWebWorker.init_signals)sigframercCsd|_|j||dS)NF)rAr7Z worker_intrM)rrZr[rrrrQs zGunicornWebWorker.handle_quitcCs&d|_d|_|j|tddS)NFr )rArr7Z worker_abortr)r+)rrZr[rrrrWs zGunicornWebWorker.handle_abort SSLContext)r7rcCs\tdkrtdt|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. NzSSL is not supported.) sslr5r\ ssl_versionload_cert_chaincertfilekeyfile cert_reqs verify_modeca_certsload_verify_locationsciphers set_ciphers)r7rIrrrr;s   z%GunicornWebWorker._create_ssl_context) source_formatrcCs.||jkr|jStd|r&tdn|SdS)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_FORMATDEFAULT_AIOHTTP_LOG_FORMATresearch ValueError)rrhrrrr9s   z'GunicornWebWorker._get_valid_log_format)N)__name__ __module__ __qualname__rZ LOG_FORMATrjGunicornAccessLogFormatdefaultrirrr"r,r%rErrMrYintrrQrW staticmethodr;strr9 __classcell__rr)rrr s  8    rcs"eZdZddfdd ZZS)rN)rcs0ddl}tt|tdS)Nr)uvlooprrr set_event_loop_policyEventLoopPolicyrr")rrw)rrrr"s z$GunicornUVLoopWebWorker.init_process)rnrorpr"rvrr)rrrsrcs"eZdZddfdd ZZS)rN)rcs0ddl}tt|tdS)Nr)tokiorrr rxryrr")rrz)rrrr"s z#GunicornTokioWebWorker.init_process)rnrorpr"rvrr)rrrsr)$__doc__rr?rkrOr)typesrtypingrrrrrZgunicorn.configrrqZgunicorn.workersr Zaiohttpr Zhelpersr Zweb_appr Zweb_logrr]r\ ImportErrorobject__all__ZWorkerrrrrrrrs0         @