U
    nËj†Q  ã                
   @  sx  U d dl m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Zd dl	Z	d dl
Z
d dlmZ d dlmZ d dlmZmZmZmZmZ d dlZd dlmZ d dl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$ ed Z%ed Z&ed Z'ed Z(ed Z)ej*ej+ej,ej-ej.edœZ/de0d< ddddœZ1de0d< dddddœZ2de0d< ddd dœZ3d!e0d"< dd#d$d%dœZ4d&e0d'< d(d)d*d+gZ5d,e0d-< e	j6Z7d.e0d/< d0d1d2d3dd4œd5d6d7œd8œd9d:d;d<œd=d:d>d<œd8œd9gd?d1d@œdAd?id=gd?d1d@œdBœdCœZ8dDe0dE< e 9dF¡Z:dGdHdId.d.dHdIdJdKœdLdM„Z;dNdOdPœdQdR„Z<dSdSdTdUœdVdW„Z=dXdSdYœdZd[„Z>G d\d]„ d]ƒZ?dS )^é    )ÚannotationsN)ÚRawConfigParser)ÚPath)ÚIOÚAnyÚ	AwaitableÚCallableÚLiteral)ÚASGIApplication)ÚImportFromStringErrorÚimport_from_string)ÚTRACE_LOG_LEVEL)ÚASGI2Middleware)ÚMessageLoggerMiddleware)ÚProxyHeadersMiddleware)ÚWSGIMiddleware)ÚautoZh11Z	httptools)r   ÚnoneZ
websocketsZwsproto)r   ÚonÚoff)r   r   ÚasyncioZuvloop)r   Úasgi3Úasgi2Úwsgi)ÚcriticalÚerrorÚwarningÚinfoÚdebugÚtracezdict[str, int]Ú
LOG_LEVELSz,uvicorn.protocols.http.auto:AutoHTTPProtocolz+uvicorn.protocols.http.h11_impl:H11Protocolz7uvicorn.protocols.http.httptools_impl:HttpToolsProtocolzdict[HTTPProtocolType, str]ÚHTTP_PROTOCOLSz8uvicorn.protocols.websockets.auto:AutoWebSocketsProtocolz>uvicorn.protocols.websockets.websockets_impl:WebSocketProtocolz4uvicorn.protocols.websockets.wsproto_impl:WSProtocolz dict[WSProtocolType, str | None]ÚWS_PROTOCOLSzuvicorn.lifespan.on:LifespanOnz uvicorn.lifespan.off:LifespanOffzdict[LifespanType, str]ÚLIFESPANz"uvicorn.loops.auto:auto_loop_setupz#uvicorn.loops.asyncio:asyncio_setupz!uvicorn.loops.uvloop:uvloop_setupzdict[LoopSetupType, str | None]ÚLOOP_SETUPSr   r   r   r   zlist[InterfaceType]Ú
INTERFACESÚintÚSSL_PROTOCOL_VERSIONé   Fz uvicorn.logging.DefaultFormatterz%(levelprefix)s %(message)s)ú()ÚfmtÚ
use_colorszuvicorn.logging.AccessFormatterzD%(levelprefix)s %(client_addr)s - "%(request_line)s" %(status_code)s)r)   r*   )ÚdefaultÚaccessr,   zlogging.StreamHandlerzext://sys.stderr)Ú	formatterÚclassÚstreamr-   zext://sys.stdoutÚINFO)ÚhandlersÚlevelÚ	propagater3   )Zuvicornúuvicorn.errorúuvicorn.access)ÚversionÚdisable_existing_loggersÚ
formattersr2   Úloggerszdict[str, Any]ÚLOGGING_CONFIGr5   zstr | os.PathLike[str]ústr | os.PathLike[str] | Noneú
str | Nonezssl.SSLContext)ÚcertfileÚkeyfileÚpasswordÚssl_versionÚ	cert_reqsÚca_certsÚciphersÚreturnc           	        sX   t  |¡}ˆ r‡ fdd„nd }| | ||¡ t  |¡|_|rF| |¡ |rT| |¡ |S )Nc                     s   ˆ S ©N© rG   ©r@   rG   ú2/tmp/pip-unpacked-wheel-8f32qnwz/uvicorn/config.pyÚ<lambda>p   ó    z$create_ssl_context.<locals>.<lambda>)ÚsslÚ
SSLContextÚload_cert_chainÚ
VerifyModeÚverify_modeÚload_verify_locationsÚset_ciphers)	r>   r?   r@   rA   rB   rC   rD   ÚctxÚget_passwordrG   rH   rI   Úcreate_ssl_contextf   s    	


rU   r   Úbool)ÚpathrE   c                 C  s6   z|   ¡ s|  ¡ } |  ¡ W S  tk
r0   Y dS X d S )NF)Úis_absoluteÚresolveÚis_dirÚOSError)rW   rG   rG   rI   rZ   z   s    
rZ   z	list[str]ztuple[list[str], list[Path]])Úpatterns_listÚdirectories_listrE   c           
      C  sX  t ttt| ¡ ƒƒƒ}|  ¡ }t ¡ }| D ]V}|dkr8q*| |¡ tt|ƒƒr^| t|ƒ¡ q*| |¡D ]}t|ƒrh| |¡ qhq*t t|ƒƒ}t tt|ƒƒ}t tdd„ |ƒƒ}t dd„ |D ƒƒ}g }t	t
|ƒƒD ]`}t	|d t
|ƒƒD ]H}	|| ||	 jk�r| ||	 ¡ qæ||	 || jkræ| || ¡ qæqÐt t|ƒ t|ƒ¡ƒ}t t|ƒƒ|fS )Nz.*c                 S  s   |   ¡ S rF   )rY   )ÚxrG   rG   rI   rJ   —   rK   z)resolve_reload_patterns.<locals>.<lambda>c                 S  s   h | ]}t |ƒr|’qS rG   )rZ   )Ú.0Zreload_pathrG   rG   rI   Ú	<setcomp>˜   s      z*resolve_reload_patterns.<locals>.<setcomp>r(   )ÚlistÚsetÚmapr   ÚcopyÚcwdÚappendrZ   ÚglobÚrangeÚlenÚparentsÚ
difference)
r\   r]   ÚdirectoriesÚpatternsZcurrent_working_directoryÚpatternÚmatchÚchildrenÚjÚkrG   rG   rI   Úresolve_reload_patternsƒ   s2    
rs   úlist[str] | str | None)ÚdirsrE   c                 C  s(   | d krg S t | tƒr| gS tt| ƒƒS rF   )Ú
isinstanceÚstrra   rb   )ru   rG   rG   rI   Ú_normalize_dirs§   s
    
rx   c                2   @  sZ  e Zd Zddddddddddddddeddddd	dd
ddddddddddddddddddeejdddd	df/dddddddddddddddddddddd d!d d ddddd dddddddd"dddddddd#ddd$œ0d%d&„Zed'd(œd)d*„ƒZ	edd(œd+d,„ƒZ
edd(œd-d.„ƒZd/d(œd0d1„Zd/d(œd2d3„Zd/d(œd4d5„Zd6d(œd7d8„Zedd(œd9d:„ƒZdS );ÚConfigú	127.0.0.1i@  Nr   i   é    g      4@TFg      Ð?Ú i   é   é   ÚTLSv1z*ASGIApplication | Callable[..., Any] | strrw   r&   r=   z
int | NoneÚLoopSetupTypez)type[asyncio.Protocol] | HTTPProtocolTypez'type[asyncio.Protocol] | WSProtocolTypezfloat | NonerV   ÚLifespanTyper<   z7dict[str, Any] | str | RawConfigParser | IO[Any] | Nonezstr | int | Nonezbool | NoneÚInterfaceTypert   Úfloatz%Callable[..., Awaitable[None]] | Nonezlist[tuple[str, str]] | None)0ÚappÚhostÚportÚudsÚfdÚloopÚhttpÚwsÚws_max_sizeÚws_max_queueÚws_ping_intervalÚws_ping_timeoutÚws_per_message_deflateÚlifespanÚenv_fileÚ
log_configÚ	log_levelÚ
access_logr+   Ú	interfaceÚreloadÚreload_dirsÚreload_delayÚreload_includesÚreload_excludesÚworkersÚproxy_headersÚserver_headerÚdate_headerÚforwarded_allow_ipsÚ	root_pathÚlimit_concurrencyÚlimit_max_requestsÚbacklogÚtimeout_keep_aliveÚtimeout_notifyÚtimeout_graceful_shutdownÚcallback_notifyÚssl_keyfileÚssl_certfileÚssl_keyfile_passwordrA   Ússl_cert_reqsÚssl_ca_certsÚssl_ciphersÚheadersÚfactoryÚh11_max_incomplete_event_sizec1           6   
   C  s  || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|p„d| _|| _|| _|| _|| _| | _|!| _|"| _|#| _|$| _|%| _|&| _ |'| _!|(| _"|)| _#|*| _$|+| _%|,| _&|-| _'|.púg | _(g | _)|/| _*|0| _+d| _,|  -¡  g | _.g | _/g | _0g | _1|�sH|�sH|�rZ| j2�sZt3 4d¡ | j2�rlt5|ƒ}t5|ƒ}t5|ƒ}t6||ƒ\| _0| _.t6|g ƒ\| _1| _/| j. 7¡ }1| j/D ]P}2|1D ]D}3|2|3k�sÐ|2|3j8k�r¶z| j. 9|3¡ W n t:k
�rö   Y nX �q¶�q®| j1D ]}4|4| j0k�r| j0 9|4¡ �q| j.�sP|�r@t3 4d|¡ t;t< =¡ ƒg| _.t3 >dt?t@tAtB| j.ƒƒƒ¡ |d k	�r˜ddlCmD}5 t3 >d|¡ |5|d	� |d k�r¾d
t<jEk�r¾tFt<jEd
 ƒ| _|  |d k�rÞt<jE Gdd¡| _Hn|| _H| j�r| jdk�rt3 4d¡ d S )Nr(   FzcCurrent configuration will not reload as not all conditions are met, please refer to documentation.zeProvided reload directories %s did not contain valid directories, watching current working directory.z/Will watch for changes in these directories: %sr   )Úload_dotenvzLoading environment from '%s')Zdotenv_pathZWEB_CONCURRENCYZFORWARDED_ALLOW_IPSrz   z4"workers" flag is ignored when reloading is enabled.)Ir„   r…   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   r“   r”   r•   r+   r–   r—   r™   rœ   r�   rž   rŸ   r¡   r¢   r£   r¤   r¥   r¦   r§   r¨   r©   rª   r«   rA   r¬   r­   r®   r¯   Úencoded_headersr°   r±   ÚloadedÚconfigure_loggingr˜   Zreload_dirs_excludesrš   r›   Úshould_reloadÚloggerr   rx   rs   rd   rj   ÚremoveÚ
ValueErrorr   ÚosÚgetcwdr   Úsortedra   rc   rw   Zdotenvr²   Úenvironr&   Úgetr    )6Úselfr„   r…   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   r’   r“   r”   r•   r+   r–   r—   r˜   r™   rš   r›   rœ   r�   rž   rŸ   r    r¡   r¢   r£   r¤   r¥   r¦   r§   r¨   r©   rª   r«   rA   r¬   r­   r®   r¯   r°   r±   Zreload_dirs_tmpÚ	directoryZreload_directoryrn   r²   rG   rG   rI   Ú__init__°   s¼    3

ÿ


ýþ


zConfig.__init__zLiteral[('2.0', '3.0')])rE   c                 C  s   ddddœ}|| j  S )Nz2.0z3.0)r   r   r   )r–   )r¿   ÚmappingrG   rG   rI   Úasgi_versionT  s
    ýzConfig.asgi_versionc                 C  s   t | jp| jƒS rF   )rV   r©   rª   ©r¿   rG   rG   rI   Úis_ssl]  s    zConfig.is_sslc                 C  s   t | jp| jdkƒS )Nr(   )rV   r—   rœ   rÄ   rG   rG   rI   Úuse_subprocessa  s    zConfig.use_subprocessÚNonec              	   C  s�  t  td¡ | jd k	�rt| jtƒrf| jdkrV| j| jd d d< | j| jd d d< t j | j¡ n¦t| jt	ƒr¬| j 
d¡r¬t| jƒ�}t |¡}t j |¡ W 5 Q R X n`t| jt	ƒrú| j 
d¡rúd	d l}t| jƒ�}| |¡}t j |¡ W 5 Q R X nt jj| jd
d� | jd k	�rht| jt	ƒ�r2t| j }n| j}t  d¡ |¡ t  d¡ |¡ t  d¡ |¡ | jd
k�rŒg t  d¡_d
t  d¡_d S )NÚTRACE)TFr9   r,   r+   r-   z.json)z.yamlz.ymlr   F)r8   r5   r6   zuvicorn.asgi)ÚloggingÚaddLevelNamer   r“   rv   Údictr+   ÚconfigÚ
dictConfigrw   ÚendswithÚopenÚjsonÚloadÚyamlZ	safe_loadÚ
fileConfigr”   r    Ú	getLoggerÚsetLevelr•   r2   r4   )r¿   ÚfileZloaded_configrÒ   r”   rG   rG   rI   rµ   e  s6    


zConfig.configure_loggingc              
   C  sr  | j r
t‚| jrB| jst‚t| j| j| j| j| j| j	| j
d�| _nd | _dd„ | jD ƒ}dt|ƒkrt| jrtdg| n|| _t| jtƒrœtt| j ƒ}|| _n| j| _t| jtƒrÆtt| j ƒ}|| _n| j| _tt| j ƒ| _zt| jƒ| _W n< tk
�r* } zt  d| ¡ t! "d¡ W 5 d }~X Y nX z|  ¡ | _W nB t#k
�r| } z"| j$�rlt  d|¡ t! "d¡ W 5 d }~X Y nX | j$�s�t %d	¡ | j&d
k�rüt' (| j¡�r¸t)| jdƒ}n4t' *| j¡�rÔt+ ,| j¡}nt-| jdd ƒ}t+ ,|¡}|�rödnd| _&| j&dk�rt.| jƒ| _d | _n| j&dk�r4t/| jƒ| _t 0¡ t1k�rNt2| jƒ| _| j3�rht4| j| j5d�| _d| _ d S )N)r?   r>   r@   rA   rB   rC   rD   c                 S  s(   g | ] \}}|  ¡  d ¡| d ¡f‘qS )Úlatin1)ÚlowerÚencode)r_   ÚkeyÚvaluerG   rG   rI   Ú
<listcomp>œ  s     zConfig.load.<locals>.<listcomp>ó   server)rÝ   s   uvicornzError loading ASGI app. %sr(   z"Error loading ASGI app factory: %sz_ASGI app factory detected. Using it, but please consider setting the --factory flag explicitly.r   Ú	__await__Ú__call__r   r   r   )Útrusted_hostsT)6r´   ÚAssertionErrorrÅ   rª   rU   r©   r«   rA   r¬   r­   r®   rL   r¯   rË   rž   r³   rv   rŠ   rw   r   r!   Úhttp_protocol_classr‹   r"   Úws_protocol_classr#   r‘   Zlifespan_classr„   Z
loaded_appr   r·   r   ÚsysÚexitÚ	TypeErrorr°   r   r–   ÚinspectÚisclassÚhasattrÚ
isfunctionr   ÚiscoroutinefunctionÚgetattrr   r   ÚgetEffectiveLevelr   r   r�   r   r    )r¿   r³   râ   rã   ÚexcZ
use_asgi_3ÚcallrG   rG   rI   rÑ   ‹  s|    

ù


ÿÿýÿ
zConfig.loadc                 C  s&   t t| j ƒ}|d k	r"|| jd� d S )N)rÆ   )r   r$   r‰   rÆ   )r¿   Z
loop_setuprG   rG   rI   Úsetup_event_loopÚ  s    zConfig.setup_event_loopzsocket.socketc              
   C  sæ  | j rž| j }t tjtj¡}z | |¡ d}t | j |¡ W n6 tk
rr } zt 	|¡ t
 d¡ W 5 d }~X Y nX d}d}dtj|dd� d }| j g}�n | jrât | jtjtj¡}d	}d}	dtj|	dd� d }| ¡ g}nÜtj}
d
}| j�r
d| jk�r
tj}
d}tj|
d�}| tjtjd¡ z| | j| jf¡ W n8 tk
�rv } zt 	|¡ t
 d¡ W 5 d }~X Y nX d|› d�}dtj|dd� d }| j�r¦dnd}|| j| ¡ d g}tj|f|ždd|iiŽ | d¡ |S )Ni¶  r(   z8Uvicorn running on unix socket %s (Press CTRL+C to quit)z%szUvicorn running on T)Zboldz (Press CTRL+C to quit)z3Uvicorn running on socket %s (Press CTRL+C to quit)z
%s://%s:%dú:z%s://[%s]:%d)ÚfamilyÚhttpsrŠ   ÚextraÚcolor_message)r‡   ÚsocketÚAF_UNIXÚSOCK_STREAMÚbindrº   Úchmodr[   r·   r   rä   rå   ÚclickÚstylerˆ   ÚfromfdÚgetsocknameÚAF_INETr…   ÚAF_INET6Ú
setsockoptÚ
SOL_SOCKETÚSO_REUSEADDRr†   rÅ   r   Úset_inheritable)r¿   rW   ÚsockZ	uds_permsrî   ÚmessageZsock_name_formatrõ   Zlogger_argsZfd_name_formatrò   Zaddr_formatZprotocol_namerG   rG   rI   Úbind_socketß  sN    



zConfig.bind_socketc                 C  s   t | jtƒo| jS rF   )rv   r„   rw   r—   rÄ   rG   rG   rI   r¶     s    zConfig.should_reload)Ú__name__Ú
__module__Ú__qualname__r;   r'   rL   Ú	CERT_NONErÁ   ÚpropertyrÃ   rÅ   rÆ   rµ   rÑ   rð   r  r¶   rG   rG   rG   rI   ry   ¯   sz   Ïn %&O0ry   )@Ú
__future__r   r   rç   rÐ   rÉ   Úlogging.configrº   rö   rL   rä   Úconfigparserr   Úpathlibr   Útypingr   r   r   r   r	   rû   Zuvicorn._typesr
   Zuvicorn.importerr   r   Zuvicorn.loggingr   Zuvicorn.middleware.asgi2r   Z!uvicorn.middleware.message_loggerr   Z uvicorn.middleware.proxy_headersr   Zuvicorn.middleware.wsgir   ZHTTPProtocolTypeZWSProtocolTyper�   r€   r‚   ÚCRITICALÚERRORÚWARNINGr1   ÚDEBUGr    Ú__annotations__r!   r"   r#   r$   r%   ÚPROTOCOL_TLS_SERVERr'   r;   rÔ   r·   rU   rZ   rs   rx   ry   rG   rG   rG   rI   Ú<module>   s¦    ú	ýüýüýþúýýúýæ!
	$