o
    4˜Žjº#  ã                   @   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ZddlmZ ddl	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 e
rXddlZejZnz	ddlZejZW n eyn   dZeZY nw dZG dd„ dejƒZ G dd„ de ƒZ!dS )z%Async gunicorn worker for aiohttp.webé    N)Ú	FrameType)ÚTYPE_CHECKINGÚAnyÚOptional)ÚAccessLogFormat)Úbase)Úwebé   )Ú
set_result)ÚApplication)ÚAccessLogger)ÚGunicornWebWorkerÚGunicornUVLoopWebWorkerc                       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B ddfdd„ZdededB 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__© úK/var/www/kodo/Anonymous/send/lib/python3.10/site-packages/aiohttp/worker.pyr   *   s   
zGunicornWebWorker.__init__c                    sH   zt  ¡  ¡  W n	 ty   Y nw t  ¡ | _t  | j¡ tƒ  ¡  d S ©N)	ÚasyncioÚget_event_loopÚcloseÚRuntimeErrorÚnew_event_loopÚloopÚset_event_loopr   Úinit_process©r   r   r   r   r%   1   s   þ
zGunicornWebWorker.init_processc              
   C   sv   d| _ | j |  ¡ ¡| _z| j | j¡ W | j | j ¡ ¡ | j ¡  n| j | j ¡ ¡ | j ¡  w t 	| j
¡ d S ©NF)Úbootedr#   Úcreate_taskÚ_runr   Úrun_until_completeÚshutdown_asyncgensr    ÚsysÚexitr   r&   r   r   r   Úrun>   s   ÿzGunicornWebWorker.runc                 Ã   sî  �d }t | jtƒr| j}n/t | j¡stjdk r4t | j¡r4|  ¡ I d H }t |tj	ƒr1|}|j
}n|}ntd| j› �ƒ‚|d u rc| jjrH| jjnd }tj	|| j| jj||  | jj¡| jjd d d�}| ¡ I d H  | jjrt|  | j¡nd }|}|d us~J ‚|j}|d us‡J ‚| jD ]}tj|||d�}| ¡ I d H  qŠd| _t ¡ }	zA| jrã|  ¡  |j }
| j!rÁ|
| j!krÁd| _| j "d	| ¡ n|	t ¡ krÙ| j#t $¡ krÙd| _| j "d
| ¡ n|  %¡ I d H  | js§W n	 t&yí   Y nw | '¡ I d H  d S )N)é   é   zSwsgi app should be either Application or async function returning Application, got éd   é_   )ÚloggerÚkeepalive_timeoutÚ
access_logÚaccess_log_formatÚshutdown_timeout)Ússl_contextTFzMax requests, shutting down: %sz!Parent changed, shutting down: %s)(Ú
isinstanceÚwsgir   ÚinspectÚiscoroutinefunctionr-   Úversion_infor   r   Ú	AppRunnerÚappr!   ÚcfgÚ	accesslogÚlogr6   Ú	keepaliveÚ_get_valid_log_formatr7   Úgraceful_timeoutÚsetupÚis_sslÚ_create_ssl_contextÚserverÚsocketsÚSockSiteÚstartr(   ÚosÚgetpidÚaliveÚnotifyÚrequests_countÚmax_requestsÚinfoÚppidÚgetppidÚ_wait_next_notifyÚ	ExceptionÚcleanup)r   Úrunnerr@   r;   r6   ÚctxrJ   ÚsockÚsiteÚpidÚcntr   r   r   r*   P   sx   €ÿÿÿø

ýô€ÿ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   rW   š   s   z#GunicornWebWorker._wait_next_notifyrd   c                 C   s8   |d u r| j }|d urt|dƒ || j u rd | _ d S d S )NT)r   r
   )r   rd   r   r   r   ra   ¤   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 tjtj¡ d S r'   )r#   Úadd_signal_handlerÚsignalÚSIGQUITÚhandle_quitÚSIGTERMÚhandle_exitÚSIGINTÚSIGWINCHÚhandle_winchÚSIGUSR1Úhandle_usr1ÚSIGABRTÚhandle_abortÚsiginterruptÚSIGCHLDÚSIG_DFLr&   r   r   r   Úinit_signals¯   s*   ÿÿÿÿÿÿzGunicornWebWorker.init_signalsÚsigÚframec                 C   s   d| _ | j | ¡ |  ¡  d S r'   )rP   rA   Ú
worker_intra   ©r   rv   rw   r   r   r   rh   Õ   s   zGunicornWebWorker.handle_quitc                 C   s&   d| _ d| _| j | ¡ t d¡ d S )NFr	   )rP   r   rA   Úworker_abortr-   r.   ry   r   r   r   rq   Þ   s   zGunicornWebWorker.handle_abortrA   Ú
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!   r{   Ússl_versionÚload_cert_chainÚcertfileÚkeyfileÚ	cert_reqsÚverify_modeÚca_certsÚload_verify_locationsÚciphersÚset_ciphers)rA   r[   r   r   r   rI   ä   s   z%GunicornWebWorker._create_ssl_contextÚsource_formatc                 C   s(   || j kr| jS t d|¡rt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   r‡   r   r   r   rE   ö   s   
ÿz'GunicornWebWorker._get_valid_log_format©r   N)r   r`   r   )Ú__name__Ú
__module__Ú__qualname__r   Ú
LOG_FORMATr‰   ÚGunicornAccessLogFormatÚdefaultrˆ   r   r   r%   r/   r*   rW   r   ra   ru   Úintr   rh   rq   ÚstaticmethodrI   ÚstrrE   Ú__classcell__r   r   r   r   r   &   s(    


Jÿÿ
þ
&	r   c                       s   e Zd Zd‡ fdd„Z‡  ZS )r   r   Nc                    sH   dd l }zt ¡  ¡  W n	 ty   Y nw t | ¡ ¡ tƒ  ¡  d S r   )	Úuvloopr   r   r    r!   Úset_event_loop_policyÚEventLoopPolicyr   r%   )r   r˜   r   r   r   r%     s   þz$GunicornUVLoopWebWorker.init_processr�   )rŽ   r�   r�   r%   r—   r   r   r   r   r     s    r   )"Ú__doc__r   r<   rN   rŠ   rf   r-   Útypesr   Útypingr   r   r   Úgunicorn.configr   r’   Úgunicorn.workersr   Úaiohttpr   Úhelpersr
   Úweb_appr   Úweb_logr   r|   r{   ÚImportErrorÚobjectÚ__all__ÚWorkerr   r   r   r   r   r   Ú<module>   s:    
þ `