a
     ÑOc;"  ã                   @   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yÈ   dZeZY n0 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|i |¤Ž d | _d| _d | _d S ©Nr   )ÚsuperÚ__init__Ú_taskÚ	exit_codeÚ_notify_waiter)Úselfr   r   ©Ú	__class__© úE/var/www/html/gsl.tools/lib/python3.9/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   sp   | j  |  ¡ ¡| _z| j  | j¡ W n tyB   | j d¡ Y n0 | 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 u 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 usÖJ ‚|j}|d usèJ ‚| jD ]0}tj|||| j
jd d d�}| ¡ I d H  qît ¡ }	zŽ| j�r´|  ¡  |j}
| j
j�rn|
| j
jk�rnd| _| j d| ¡ nB|	t ¡ k�r¢| j t !¡ k�r¢d| _| j d| ¡ n|  "¡ I d H  �q*W n t#�yÊ   Y n0 | $¡ I d H  d S )	NzUwsgi app should be either Application or async function returning Application, got {})ÚloggerZkeepalive_timeoutÚ
access_logÚaccess_log_formatéd   é_   )Ú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Ú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 usJ ‚| ¡  | _}| j d| j |¡ |S )Ng      ð?)Ú_notify_waiter_doner$   Zcreate_futurer   Z
call_later)r   r$   Úwaiterr   r   r   rG   ƒ   s    z#GunicornWebWorker._wait_next_notify)rP   r   c                 C   s4   |d u r| j }|d ur t|dƒ || j u r0d | _ d S )NT)r   r   )r   rP   r   r   r   rO   �   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 rÆt 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˜   s,    ÿÿÿÿÿÿ
zGunicornWebWorker.init_signals)ÚsigÚframer   c                 C   s   d| _ | j | ¡ |  ¡  d S )NF)rC   r:   Z
worker_intrO   ©r   ra   rb   r   r   r   rU   À   s    zGunicornWebWorker.handle_quitc                 C   s&   d| _ d| _| j | ¡ t d¡ d S )NFr   )rC   r   r:   Zworker_abortr+   r,   rc   r   r   r   r[   É   s    zGunicornWebWorker.handle_abortÚ
SSLContext)r:   r   c                 C   s\   t du 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   rd   Ússl_versionÚload_cert_chainÚcertfileÚkeyfileÚ	cert_reqsÚverify_modeÚca_certsÚload_verify_locationsÚciphersÚset_ciphers)r:   rK   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%\([^\)]+\)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   rp   r   r   r   r<   á   s    
ÿz'GunicornWebWorker._get_valid_log_format)N)Ú__name__Ú
__module__Ú__qualname__r   Z
LOG_FORMATrr   ÚGunicornAccessLogFormatÚdefaultrq   r   r   r%   r-   r'   rG   r   rO   r`   Úintr   rU   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©rv   rw   rx   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!   rA   rs   rS   r+   Útypesr   Útypingr   r   r   r   r   Zgunicorn.configr   ry   Zgunicorn.workersr	   Zaiohttpr
   Zhelpersr   Zweb_appr   Zweb_logr   re   rd   ÚImportErrorÚobjectÚ__all__ZWorkerr   r   r   r   r   r   r   Ú<module>   s0   

 Q