U
    RhQ                  
   @  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   ZonZoff)r   r   asyncioZuvloop)r   asgi3asgi2wsgi)ZcriticalerrorwarninginfodebugZ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	propagater/   )Zuvicornuvicorn.erroruvicorn.access)versiondisable_existing_loggers
formattersr.   Zloggerszdict[str, Any]LOGGING_CONFIGr1   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 rB   r;   rB   4./venv/lib/python3.8/site-packages/uvicorn/config.py<lambda>p       z$create_ssl_context.<locals>.<lambda>)sslZ
SSLContextZload_cert_chainZ
VerifyModeZverify_modeZload_verify_locationsZset_ciphers)	r9   r:   r;   r<   r=   r>   r?   ZctxZget_passwordrB   rC   rD   create_ssl_contextf   s    	


rH   r   bool)pathr@   c                 C  s6   z|   s|  } |  W S  tk
r0   Y dS X d S )NF)Zis_absoluteresolveis_dirOSError)rJ   rB   rB   rD   rL   z   s    
rL   z	list[str]ztuple[list[str], list[Path]])patterns_listdirectories_listr@   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|||  qqt t|t|}t t||fS )Nz.*c                 S  s   |   S rA   )rK   )xrB   rB   rD   rE      rF   z)resolve_reload_patterns.<locals>.<lambda>c                 S  s   h | ]}t |r|qS rB   )rL   ).0Zreload_pathrB   rB   rD   	<setcomp>   s      z*resolve_reload_patterns.<locals>.<setcomp>r$   )listsetmapr   copycwdappendrL   globrangelenparents
difference)
rN   rO   ZdirectoriespatternsZcurrent_working_directorypatternmatchZchildrenjkrB   rB   rD   resolve_reload_patterns   s2    
rc   list[str] | str | None)dirsr@   c                 C  s(   | d krg S t | tr| gS tt| S rA   )
isinstancestrrS   rT   )re   rB   rB   rD   _normalize_dirs   s
    
rh   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         ZTLSv1z*ASGIApplication | Callable[..., Any] | strrg   r"   r8   z
int | NoneLoopSetupTypez)type[asyncio.Protocol] | HTTPProtocolTypez'type[asyncio.Protocol] | WSProtocolTypezfloat | NonerI   LifespanTyper7   z7dict[str, Any] | str | RawConfigParser | IO[Any] | Nonezstr | int | Nonezbool | NoneInterfaceTyperd   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_passwordr<   ssl_cert_reqsssl_ca_certsssl_ciphersheadersfactoryh11_max_incomplete_event_sizec1           6   
   C  s  || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|pd| _|| _|| _|| _|| _| | _|!| _|"| _|#| _|$| _|%| _|&| _ |'| _!|(| _"|)| _#|*| _$|+| _%|,| _&|-| _'|.pg | _(g | _)|/| _*|0| _+d| _,| -  g | _.g | _/g | _0g | _1|sH|sH|rZ| j2sZt34d | j2rlt5|}t5|}t5|}t6||\| _0| _.t6|g \| _1| _/| j.7 }1| j/D ]P}2|1D ]D}3|2|3ks|2|3j8krz| j.9|3 W n t:k
r   Y nX qq| j1D ]}4|4| j0kr| j09|4 q| j.sP|r@t34d| t;t<= g| _.t3>dt?t@tAtB| j. |d k	rddlCmD}5 t3>d| |5|d	 |d krd
t<jEkrtFt<jEd
 | _|  |d krt<jEGdd| _Hn|| _H| jr| jdkrt34d 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_IPSrj   z4"workers" flag is ignored when reloading is enabled.)Irs   rt   ru   rv   rw   rx   ry   rz   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   encoded_headersr   r   loadedconfigure_loggingr   Zreload_dirs_excludesr   r   should_reloadloggerr   rh   rc   rV   r\   remove
ValueErrorr   osgetcwdr   sortedrS   rU   rg   Zdotenvr   environr"   getr   )6selfrs   rt   ru   rv   rw   rx   ry   rz   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   Zreload_dirs_tmpZ	directoryZreload_directoryr_   r   rB   rB   rD   __init__   s    3







zConfig.__init__zLiteral[('2.0', '3.0')])r@   c                 C  s   dddd}|| j  S )Nz2.0z3.0)r   r   r   )r   )r   mappingrB   rB   rD   asgi_versionT  s
    zConfig.asgi_versionc                 C  s   t | jp| jS rA   )rI   r   r   r   rB   rB   rD   is_ssl]  s    zConfig.is_sslc                 C  s   t | jp| jdkS )Nr$   )rI   r   r   r   rB   rB   rD   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 nt| jt	r| j
drt| j}t|}t j| W 5 Q R X n`t| jt	r| j
drd	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rg t d_d
t d_d S )NZTRACE)TFr5   r(   r'   r)   z.json)z.yamlz.ymlr   F)r4   r1   r2   zuvicorn.asgi)loggingZaddLevelNamer   r   rf   dictr'   ZconfigZ
dictConfigrg   endswithopenjsonloadyamlZ	safe_loadZ
fileConfigr   r   	getLoggerZsetLevelr   r.   r0   )r   fileZloaded_configr   r   rB   rB   rD   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rtt| j }|| _n| j| _t| jtrt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$st%d	 | j&d
krt'(| jrt)| jd}n4t'*| jrt+,| j}nt-| jdd }t+,|}|rd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:   r9   r;   r<   r=   r>   r?   c                 S  s(   g | ] \}}|  d |d fqS )latin1)lowerencode)rQ   keyvaluerB   rB   rD   
<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   )Ztrusted_hostsT)6r   AssertionErrorr   r   rH   r   r   r<   r   r   r   rG   r   r   r   r   rf   ry   rg   r   r   http_protocol_classrz   r   ws_protocol_classr   r   Zlifespan_classrs   Z
loaded_appr   r   r   sysexit	TypeErrorr   r   r   inspectZisclasshasattrZ
isfunctionr   Ziscoroutinefunctiongetattrr   r   ZgetEffectiveLevelr   r   r   r   r   )r   r   r   r   excZ
use_asgi_3callrB   rB   rD   r     s|    





zConfig.loadc                 C  s&   t t| j }|d k	r"|| jd d S )N)r   )r   r    rx   r   )r   Z
loop_setuprB   rB   rD   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rt| jtjtj}d	}d}	dtj|	dd d }| g}nt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rd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)familyZhttpsry   Zextracolor_message)rv   socketZAF_UNIXZSOCK_STREAMZbindr   chmodrM   r   r   r   r   clickZstylerw   ZfromfdZgetsocknameZAF_INETrt   ZAF_INET6Z
setsockoptZ
SOL_SOCKETZSO_REUSEADDRru   r   r   set_inheritable)r   rJ   ZsockZ	uds_permsr   messageZsock_name_formatr   Zlogger_argsZfd_name_formatr   Zaddr_formatZprotocol_namerB   rB   rD   bind_socket  sN    



zConfig.bind_socketc                 C  s   t | jto| jS rA   )rf   rs   rg   r   r   rB   rB   rD   r     s    zConfig.should_reload)__name__
__module____qualname__r6   r#   rG   Z	CERT_NONEr   propertyr   r   r   r   r   r   r   r   rB   rB   rB   rD   ri      sz   n %&O0ri   )@Z
__future__r   r   r   r   r   Zlogging.configr   r   rG   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WSProtocolTyperp   ro   rq   ZCRITICALZERRORZWARNINGr-   DEBUGr   __annotations__r   r   r   r    r!   ZPROTOCOL_TLS_SERVERr#   r6   r   r   rH   rL   rc   rh   ri   rB   rB   rB   rD   <module>   s    	!
	$