a
    3jU                  
   @  s  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 d dlmZmZmZmZ d dlZd dlm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j0ej1edZ2de3d< ddddZ4de3d< ddddddZ5d e3d!< d"d"d#dZ6de3d$< dd%d&d'dZ7d e3d(< g dZ8d)e3d*< e	j9Z:d+e3d,< d-d.d/d0dd1d2d3d4d5d6d7d8d9d:d7d;d9d5d6gd<d.d=d>d<id:gd<d.d=d?d@Z;dAe3dB< e<dCZ=dDdEdFd+d+dEdFdGdHdIdJZ>dKdLdMdNdOZ?dPdPdQdRdSdTZ@dUdPdVdWdXZAG dYdZ dZZBdS )[    )annotationsN)	Awaitable)RawConfigParser)Path)IOAnyCallableLiteral)iscoroutinefunction)ASGIApplication)ImportFromStringErrorimport_from_string)TRACE_LOG_LEVEL)ASGI2Middleware)MessageLoggerMiddleware)ProxyHeadersMiddleware)WSGIMiddleware)autoZh11Z	httptools)r   noneZ
websocketszwebsockets-sansioZ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[str, str]HTTP_PROTOCOLSz8uvicorn.protocols.websockets.auto:AutoWebSocketsProtocolz>uvicorn.protocols.websockets.websockets_impl:WebSocketProtocolzLuvicorn.protocols.websockets.websockets_sansio_impl:WebSocketsSansIOProtocolz4uvicorn.protocols.websockets.wsproto_impl:WSProtocolzdict[str, str | None]WS_PROTOCOLSzuvicorn.lifespan.on:LifespanOnz uvicorn.lifespan.off:LifespanOffLIFESPANz$uvicorn.loops.auto:auto_loop_factoryz*uvicorn.loops.asyncio:asyncio_loop_factoryz(uvicorn.loops.uvloop:uvloop_loop_factoryLOOP_FACTORIESz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	propagater4   )Zuvicornuvicorn.erroruvicorn.access)versiondisable_existing_loggers
formattersr3   loggerszdict[str, Any]LOGGING_CONFIGr6   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 rH   rA   rH   k/www/wwwroot/dpstar/app/297b3aabda72fedb274352021c2dd8b5_venv/lib/python3.9/site-packages/uvicorn/config.py<lambda>s       z$create_ssl_context.<locals>.<lambda>)ssl
SSLContextload_cert_chain
VerifyModeverify_modeload_verify_locationsset_ciphers)	r?   r@   rA   rB   rC   rD   rE   ctxget_passwordrH   rI   rJ   create_ssl_contexti   s    	


rV   r   bool)pathrF   c                 C  s4   z|   s|  } |  W S  ty.   Y dS 0 d S )NF)is_absoluteresolveis_dirOSError)rX   rH   rH   rJ   r[   }   s    
r[   z	list[str]ztuple[list[str], list[Path]])patterns_listdirectories_listrF   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v r|||	  q||	 || jv r|||  qqt t|t|}t t||fS )Nz.*c                 S  s   |   S rG   )rZ   )xrH   rH   rJ   rK      rL   z)resolve_reload_patterns.<locals>.<lambda>c                 S  s   h | ]}t |r|qS rH   )r[   ).0Zreload_pathrH   rH   rJ   	<setcomp>   rL   z*resolve_reload_patterns.<locals>.<setcomp>r)   )listsetmapr   copycwdappendr[   globrangelenparents
difference)
r]   r^   directoriespatternsZcurrent_working_directorypatternmatchchildrenjkrH   rH   rJ   resolve_reload_patterns   s2    
rt   list[str] | str | None)dirsrF   c                 C  s(   | d u rg S t | tr| gS tt| S rG   )
isinstancestrrb   rc   )rv   rH   rH   rJ   _normalize_dirs   s
    
ry   c                3   @  sl  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deejdddd	df0d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$1d%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d9d(d:d;Zedd(d<d=ZdS )>Config	127.0.0.1i@  Nr   i       g      4@TFg      ? i         TLSv1z*ASGIApplication | Callable[..., Any] | strrx   r'   r>   z
int | NonezLoopFactoryType | strz/type[asyncio.Protocol] | HTTPProtocolType | strz-type[asyncio.Protocol] | WSProtocolType | strzfloat | NonerW   LifespanTyper=   z7dict[str, Any] | str | RawConfigParser | IO[Any] | Nonezstr | int | Nonezbool | NoneInterfaceTyperu   floatz%Callable[..., Awaitable[None]] | Nonezlist[tuple[str, str]] | None)1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timeout_worker_healthcheckcallback_notifyssl_keyfilessl_certfilessl_keyfile_passwordrB   ssl_cert_reqsssl_ca_certsssl_ciphersheadersfactoryh11_max_incomplete_event_sizec2           7   
   C  s  || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|pd| _|| _|| _|| _|| _| | _|!| _|"| _|#| _|$| _|%| _|&| _ |'| _!|(| _"|)| _#|*| _$|+| _%|,| _&|-| _'|.| _(|/pg | _)g | _*|0| _+|1| _,d| _-| .  g | _/g | _0g | _1g | _2|sP|sP|rb| j3sbt45d | j3rnt6|}t6|}t6|}t7||\| _1| _/t7|g \| _2| _0| j/8 }2| j0D ]N}3|2D ]B}4|3|4ks|3|4j9v rz| j/:|4 W n t;y   Y n0 qq| j2D ]}5|5| j1v r| j1:|5 q| j/sR|rFt45d| t<= g| _/t4>dt?t@tAtB| j/ |d urddlCmD}6 t4>d| |6|d	 |d u rd
tEjFv rtGtEjFd
 | _|  |d u rtEjFHdd| _In|| _I| jr| jdkrt45d 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_IPSr{   z4"workers" flag is ignored when reloading is enabled.)Jr   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   rB   r   r   r   r   encoded_headersr   r   loadedconfigure_loggingr   Zreload_dirs_excludesr   r   should_reloadloggerr   ry   rt   re   rk   remove
ValueErrorr   rf   r   sortedrb   rd   rx   Zdotenvr   osenvironr'   getr   )7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   r   rB   r   r   r   r   r   r   Zreload_dirs_tmp	directoryZreload_directoryro   r   rH   rH   rJ   __init__   s    4






zConfig.__init__zLiteral['2.0', '3.0'])rF   c                 C  s   dddd}|| j  S )Nz2.0z3.0)r   r   r   )r   )r   mappingrH   rH   rJ   asgi_versionY  s
    zConfig.asgi_versionc                 C  s   t | jp| jS rG   )rW   r   r   r   rH   rH   rJ   is_sslb  s    zConfig.is_sslc                 C  s   t | jp| jdkS )Nr)   )rW   r   r   r   rH   rH   rJ   use_subprocessf  s    zConfig.use_subprocessNonec                 C  s  t td | jd ur:t| jtrf| jdv 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 d    n1 s0    Y  nzt| jt	r(| j
dr(d	d l}t| j&}||}t j| W d    n1 s0    Y  nt jj| jd
d | jd urt| jt	r`t| j }n| j}t d| t d| t d| | jd
u rg t d_d
t d_d S )NTRACE)TFr:   r-   r,   r.   z.json)z.yamlz.ymlr   F)r9   r6   r7   zuvicorn.asgi)loggingaddLevelNamer   r   rw   dictr,   config
dictConfigrx   endswithopenjsonloadyamlZ	safe_load
fileConfigr   r!   	getLoggersetLevelr   r3   r5   )r   fileZloaded_configr   r   rH   rH   rJ   r   j  s6    

,
.zConfig.configure_loggingc              
   C  s~  | j r
J | jrB| jsJ t| j| j| j| j| j| j| j	d| _
nd | _
dd | jD }dt|vrt| jrtdg| n|| _t| jtrtt| j| j}|| _n| j| _t| jtrtt| j| j}|| _n| j| _tt| j | _zt| j| _W n> ty8 } z$t d|  t!"d W Y d }~n
d }~0 0 z|  | _W nD t#y } z*| j$rxt d| t!"d W Y d }~nd }~0 0 | j$st%d	 | j&d
krt'(| jrt)| jd}n0t'*| jrt+| j}nt,| jdd }t+|}|rdnd| _&| j&dkr(t-| j| _d | _n| j&dkr@t.| j| _t/ t0krZt1| j| _| j2rtt3| j| j4d| _d| _ d S )N)r@   r?   rA   rB   rC   rD   rE   c                 S  s(   g | ] \}}|  d |d fqS )latin1)lowerencode)r`   keyvaluerH   rH   rJ   
<listcomp>  rL   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)5r   r   r   rV   r   r   rB   r   r   r   rM   r   r   r   r   rw   r   rx   r   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
   getattrr   r   getEffectiveLevelr   r   r   r   r   )r   r   r   r   excZ
use_asgi_3callrH   rH   rJ   r     s|    




  zConfig.loadc                 C  s   t dd S )Na  The `setup_event_loop` method was replaced by `get_loop_factory` in uvicorn 0.36.0.
None of those methods are supposed to be used directly. If you are doing it, please let me know here: https://github.com/Kludex/uvicorn/discussions/2706. Thank you, and sorry for the inconvenience.)AttributeErrorr   rH   rH   rJ   setup_event_loop  s    zConfig.setup_event_loopz.Callable[[], asyncio.AbstractEventLoop] | Nonec              
   C  s|   | j tv rtt| j  }nJzt| j W S  tyb } z$td|  td W Y d }~n
d }~0 0 |d u rpd S || jdS )Nz,Error loading custom loop setup function. %sr)   )r   )	r   r%   r   r   r   r   r   r   r   )r   Zloop_factoryr   rH   rH   rJ   get_loop_factory  s    
 zConfig.get_loop_factoryzsocket.socketc              
   C  s  | j r| j }ttjtj}z || d}t| j | W n8 tyt } z t	| t
d W Y d }~n
d }~0 0 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v rtj}
d}tj|
d}|tjtjd z|| j| jf W n: tyz } z t	| t
d W Y d }~n
d }~0 0 d| d}dtj|dd d }| jrdnd}|| j| d g}tj|g|R 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)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   rX   sockZ	uds_permsr   messageZsock_name_formatr   Zlogger_argsZfd_name_formatr   Zaddr_formatZprotocol_namerH   rH   rJ   bind_socket  sN    

 
 
zConfig.bind_socketc                 C  s   t | jto| jS rG   )rw   r   rx   r   r   rH   rH   rJ   r   #  s    zConfig.should_reload)__name__
__module____qualname__r<   r(   rM   	CERT_NONEr   propertyr   r   r   r   r   r   r   r  r   rH   rH   rH   rJ   rz      s~   p '&O0rz   )C
__future__r   r   r   r   r   logging.configr   r   rM   r   collections.abcr   configparserr   pathlibr   typingr   r   r   r	   r   Zuvicorn._compatr
   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   ZLoopFactoryTyper   CRITICALERRORWARNINGr2   DEBUGr!   __annotations__r"   r#   r$   r%   r&   PROTOCOL_TLS_SERVERr(   r<   r   r   rV   r[   rt   ry   rz   rH   rH   rH   rJ   <module>   s   	!
	$