o
    4ήcT                     @   sp  U 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mZmZmZmZmZmZmZmZmZ d dlmZ d dlmZ ejdk r[d dlmZ nd dlmZ d dlZzd dlZW n	 eyt   Y nw 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* erd dl+m,Z, ed Z-ed Z.ed Z/ed Z0ed Z1ej2ej3ej4ej5ej6edZ7ee8e9f e:d< ddddZ;ee-e8f e:d< dddddZ<ee.ee8 f e:d< ddddZ=ee/e8f e:d< dd d!d"dZ>ee0ee8 f e:d#< g dZ?ee1 e:d$< ej@ZAe9e:d%< d&d'd(d)dd*d+d,d-d.d/d0d1d2d3d0d4d2d.d/gd5d'd6d7d5id3gd5d'd6d8d9ZBee8ef e:d:< eCd;ZDd<ee8ejEf d=eee8ejEf  d>ee8 d?e9d@e9dAeee8ejEf  dBee8 dCejFfdDdEZGdFe
dCeHfdGdHZIdIee8 dJee8 dCeee8 ee
 f fdKdLZJdMeee8 e8df dCee8 fdNdOZKG dPdQ dQZLdS )R    N)Path)
TYPE_CHECKINGAny	AwaitableCallableDictListOptionalTupleTypeUnion)!DEFAULT_MAX_INCOMPLETE_EVENT_SIZE)TRACE_LOG_LEVEL)      )Literal)ImportFromStringErrorimport_from_string)ASGI2Middleware)MessageLoggerMiddleware)ProxyHeadersMiddleware)WSGIMiddleware)ASGIApplication)autoh11	httptools)r   none
websocketswsproto)r   onoff)r   r   asynciouvloop)r   asgi3asgi2wsgi)criticalerrorwarninginfodebugtrace
LOG_LEVELSz,uvicorn.protocols.http.auto:AutoHTTPProtocolz+uvicorn.protocols.http.h11_impl:H11Protocolz7uvicorn.protocols.http.httptools_impl:HttpToolsProtocolHTTP_PROTOCOLSz8uvicorn.protocols.websockets.auto:AutoWebSocketsProtocolz>uvicorn.protocols.websockets.websockets_impl:WebSocketProtocolz4uvicorn.protocols.websockets.wsproto_impl:WSProtocolWS_PROTOCOLSzuvicorn.lifespan.on:LifespanOnz uvicorn.lifespan.off:LifespanOffLIFESPANz"uvicorn.loops.auto:auto_loop_setupz#uvicorn.loops.asyncio:asyncio_setupz!uvicorn.loops.uvloop:uvloop_setupLOOP_SETUPS
INTERFACES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)r4   r5   )defaultaccessr7   zlogging.StreamHandlerzext://sys.stderr)	formatterclassstreamr8   zext://sys.stdoutINFO)handlerslevel	propagater>   )uvicornuvicorn.erroruvicorn.access)versiondisable_existing_loggers
formattersr=   loggersLOGGING_CONFIGrA   certfilekeyfilepasswordssl_version	cert_reqsca_certsciphersreturnc           	         sX   t |} r fddnd }|| || t ||_|r#|| |r*|| |S )Nc                      s    S N rQ   rJ   rQ   5/tmp/pip-target-vg8gfxp4/lib/python/uvicorn/config.py<lambda>   s    z$create_ssl_context.<locals>.<lambda>)ssl
SSLContextload_cert_chain
VerifyModeverify_modeload_verify_locationsset_ciphers)	rH   rI   rJ   rK   rL   rM   rN   ctxget_passwordrQ   rR   rS   create_ssl_context   s   
	

r^   pathc                 C   s0   z|   s	|  } |  W S  ty   Y dS w )NF)is_absoluteresolveis_dirOSError)r_   rQ   rQ   rS   rb      s   
rb   patterns_listdirectories_listc           
      C   sV  t ttt| }|  }t }| D ]+}|dkrq|| tt|r/|t| q||D ]}t|r?|| q4qt t|}t tt|}t tdd |}t dd |D }g }t	t
|D ]/}t	|d t
|D ]#}	|| ||	 jv r|||	  qs||	 || jv r|||  qsqht t|t|}t t||fS )Nz.*c                 S   s   |   S rP   )ra   )xrQ   rQ   rS   rT      s    z)resolve_reload_patterns.<locals>.<lambda>c                 S   s   h | ]}t |r|qS rQ   )rb   ).0reload_pathrQ   rQ   rS   	<setcomp>   s    z*resolve_reload_patterns.<locals>.<setcomp>r3   )listsetmapr   copycwdappendrb   globrangelenparents
difference)
rd   re   directoriespatternscurrent_working_directorypatternmatchchildrenjkrQ   rQ   rS   resolve_reload_patterns   s>   

r}   dirsc                 C   s(   | d u rg S t | tr| gS tt| S rP   )
isinstancestrrj   rk   )r~   rQ   rQ   rS   _normalize_dirs   s
   
r   c                ]   @   s  e Zd Z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eejddddef-dede	e
f de
dedee
 dee dedeeej ef deeej ef dedee dee dededeee
ejf  deeee
ef e
f  deee
ef  d ed!ee d"ed#ed$eeee
 e
f  d%ed&eeee
 e
f  d'eeee
 e
f  d(ee d)ed*ed+ed,eeee
 e
f  d-e
d.ee d/ee d0ed1ed2ed3ee	d4ed f  d5ee
 d6eee
ejf  d7ee
 d8ed9ed:ee
 d;e
d<eeee
e
f   d=ed>ef\d?d@ZedAe dB fdCdDZ!edAefdEdFZ"edAefdGdHZ#dSdIdJZ$dSdKdLZ%dSdMdNZ&dAe'j'fdOdPZ(edAefdQdRZ)dS )TConfig	127.0.0.1i@  Nr   i   g      4@TFg      ? i         TLSv1appr   hostportudsfdloophttpwsws_max_sizews_ping_intervalws_ping_timeoutws_per_message_deflatelifespanenv_file
log_config	log_level
access_logr6   	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callback_notify.ssl_keyfilessl_certfilessl_keyfile_passwordrK   ssl_cert_reqsssl_ca_certsssl_ciphersheadersfactoryh11_max_incomplete_event_sizec/           4   
   C   s  || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
|| _|| _|| _|| _|| _|| _|| _|| _|| _|p?d| _|| _|| _|| _|| _|| _| | _|!| _|"| _|#| _|$| _|%| _|&| _ |'| _!|(| _"|)| _#|*| _$|+| _%|,pwg | _&g | _'|-| _(|.| _)d| _*| +  g | _,g | _-g | _.g | _/|s|s|r| j0st12d | j0r%t3|}t3|}t3|}t4||\| _.| _,t4|g \| _/| _-| j,5 }/| j-D ]"}0|/D ]}1|0|1ks|0|1j6v rz| j,7|1 W q t8y   Y qw qq| j/D ]}2|2| j.v r| j.7|2 q| j,s|rt12d| t9t:; g| _,t1<dt=t>t?t@| j, |d ur;ddlAmB}3 t1<d| |3|d	 |d u rNd
t:jCv rNtDt:jCd
 | _|  |d u r^t:jCEdd| _Fn|| _F| jrr| jdkrtt12d d S d S d S )Nr3   FzbCurrent 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')dotenv_pathWEB_CONCURRENCYFORWARDED_ALLOW_IPSr   z4"workers" flag is ignored when reloading is enabled.)Gr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r6   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rK   r   r   r   r   encoded_headersr   r   loadedconfigure_loggingr   reload_dirs_excludesr   r   should_reloadloggerr(   r   r}   rm   rs   remove
ValueErrorr   osgetcwdr)   sortedrj   rl   r   dotenvr   environintgetr   )4selfr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r6   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rK   r   r   r   r   r   r   reload_dirs_tmp	directoryreload_directoryrx   r   rQ   rQ   rS   __init__   s   1








zConfig.__init__rO   )2.03.0c                 C   s   dddd}|| j  S )Nr   r   )r$   r#   r%   )r   )r   mappingrQ   rQ   rS   asgi_versionz  s
   
zConfig.asgi_versionc                 C   s   t | jp| jS rP   )boolr   r   r   rQ   rQ   rS   is_ssl  s   zConfig.is_sslc                 C   s   t | jp| jdkS )Nr3   )r   r   r   r   rQ   rQ   rS   use_subprocess  s   zConfig.use_subprocessc                 C   s  t td | jd urt| jtr2| jdv r*| j| jd d d< | j| jd d d< t j| j nW| j	drYt
| j}t|}t j| W d    n1 sSw   Y  n0| j	drt
| j}t|}t j| W d    n1 szw   Y  n	t jj| jd	d
 | jd urt| jtrt| j }n| j}t d| t d| t d| | jd	u rg t d_d	t d_d S d S )NTRACE)TFrE   r7   r6   r8   z.json)z.yamlz.ymlF)rD   rA   rB   zuvicorn.asgi)loggingaddLevelNamer   r   r   dictr6   config
dictConfigendswithopenjsonloadyaml	safe_load
fileConfigr   r   r,   	getLoggersetLevelr   r=   r?   )r   fileloaded_configr   rQ   rQ   rS   r     sN   





zConfig.configure_loggingc              
   C   sd  | j rJ | jr!| jsJ t| j| j| j| j| j| j| j	d| _
nd | _
dd | jD }dt|vr:| jr:dg| n|| _t| jtrNtt| j }|| _n| j| _t| jtrctt| j }|| _n| j| _tt| j | _zt| j| _W n ty } ztd|  t !d W Y d }~nd }~ww z|  | _W n  t"y } z| j#rtd| t !d W Y d }~nd }~ww | j#st$d	 | j%d
krt&'| jrt(| jd}nt&)| jrt*+| j}nt,| jdd }t*+|}|rdnd| _%| j%dkrt-| j| _d | _n| j%dkrt.| j| _tj/t0kr t1| j| _| j2r-t3| j| j4d| _d| _ d S )N)rI   rH   rJ   rK   rL   rM   rN   c                 S   s(   g | ]\}}|  d |d fqS )latin1)lowerencode)rg   keyvaluerQ   rQ   rS   
<listcomp>  s    zConfig.load.<locals>.<listcomp>   server)r   s   uvicornzError loading ASGI app. %sr3   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   r^   r   r   rK   r   r   r   rU   r   r   r   r   r   r   r   r   r-   http_protocol_classr   r.   ws_protocol_classr/   r   lifespan_classr   
loaded_appr   r   r'   sysexit	TypeErrorr   r(   r   inspectisclasshasattr
isfunctionr!   iscoroutinefunctiongetattrr   r   r>   r   r   r   r   r   )r   r   r   r   exc
use_asgi_3callrQ   rQ   rS   r     s   








zConfig.loadc                 C   s*   t t| j }|d ur|| jd d S d S )N)r   )r   r0   r   r   )r   
loop_setuprQ   rQ   rS   setup_event_loop  s   zConfig.setup_event_loopc              
   C   s  | j rO| j }ttjtj}z|| d}t| j | W n ty: } zt	| t
d W Y d }~nd }~ww d}d}dtj|dd d }| j g}n| jrqt| jtjtj}d	}d}	dtj|	dd d }| g}nhtj}
d
}| jrd| jv rtj}
d}tj|
d}|tjtjd z|| j| jf W n ty } zt	| t
d W Y d }~nd }~ww d| d}dtj|dd d }| jrdnd}|| j| jg}tj|g|R dd|ii |d |S )Ni  r3   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   chmodrc   r   r'   r   r   clickstyler   fromfdgetsocknameAF_INETr   AF_INET6
setsockopt
SOL_SOCKETSO_REUSEADDRr   r   r)   set_inheritable)r   r_   sock	uds_permsr   messagesock_name_formatr  logger_argsfd_name_formatr  addr_formatprotocol_namerQ   rQ   rS   bind_socket  st   




zConfig.bind_socketc                 C   s   t | jto| jS rP   )r   r   r   r   r   rQ   rQ   rS   r   I  s   zConfig.should_reload)rO   N)*__name__
__module____qualname__rG   r2   rU   	CERT_NONEr   r   r   r   r   r	   LoopSetupTyper   r!   ProtocolHTTPProtocolTypeWSProtocolTypefloatr   LifespanTyper   PathLiker   r   InterfaceTyper   r   r
   r   propertyr   r   r   r   r   r   r   r  r  r   rQ   rQ   rQ   rS   r      s0   	
 !"#$%&'()*+,-./
 -

(
U<r   )Mr!   r   r   r   logging.configr   r  rU   r   pathlibr   typingr   r   r   r   r   r   r	   r
   r   r   h11._connectionr   uvicorn.loggingr   version_infotyping_extensionsr   r  r   ImportErroruvicorn.importerr   r   uvicorn.middleware.asgi2r   !uvicorn.middleware.message_loggerr    uvicorn.middleware.proxy_headersr   uvicorn.middleware.wsgir   asgiref.typingr   r%  r&  r(  r#  r*  CRITICALERRORWARNINGr<   DEBUGr,   r   r   __annotations__r-   r.   r/   r0   r1   PROTOCOL_TLS_SERVERr2   rG   r   r   r)  rV   r^   r   rb   r}   r   r   rQ   rQ   rQ   rS   <module>   s   
 0
	
!
	
$(