B
    CeS              
   @   s4  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 ejdk rd dlmZ nd dlmZ d dl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& er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j0ej1ej2edZ3ee4e5f e6d< ddddZ7ee)e4f e6d< dddddZ8ee*ee4 f e6d< ddddZ9ee+e4f e6d< ddd d!dZ:ee,ee4 f e6d"< d#d$d%d&gZ;ee- e6d'< ej<Z=e5e6d(< d)d*d+d,dd-d.d/d0d1d2d3d4d5d6d3d7d5d1d2gd8d*d9d:d8id6gd8d*d9d;d<Z>ee4ef e6d=< e?d>Z@ee4ejAf eee4ejAf  ee4 e5e5eee4ejAf  ee4 ejBd?d@dAZCe
eDdBdCdDZEee4 ee4 eee4 ee
 f dEdFdGZFeee4 e4df ee4 dHdIdJZGG dKdL dLZHdS )M    N)Path)
TYPE_CHECKINGAny	AwaitableCallableDictListOptionalTupleTypeUnion)TRACE_LOG_LEVEL)      )Literal)ImportFromStringErrorimport_from_string)ASGI2Middleware)MessageLoggerMiddleware)ProxyHeadersMiddleware)WSGIMiddleware)ASGIApplication)autoZh11Z	httptools)r   noneZ
websocketsZwsproto)r   onoff)r   r   asyncioZ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_SETUPSr   r   r   r   
INTERFACESSSL_PROTOCOL_VERSION   Fz uvicorn.logging.DefaultFormatterz%(levelprefix)s %(message)s)z()fmt
use_colorszuvicorn.logging.AccessFormatterzD%(levelprefix)s %(client_addr)s - "%(request_line)s" %(status_code)s)z()r.   )defaultaccessr0   zlogging.StreamHandlerzext://sys.stderr)	formatterclassstreamr1   zext://sys.stdoutINFO)handlerslevel	propagater7   )Zuvicornzuvicorn.errorzuvicorn.access)versiondisable_existing_loggers
formattersr6   loggersLOGGING_CONFIGzuvicorn.error)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 rF   )r@   rF   b/var/www/downstreamdata.science/rtclock/rtclock-venv/lib/python3.7/site-packages/uvicorn/config.py<lambda>       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_passwordrF   )r@   rG   create_ssl_contextv   s    	


rS   )pathrE   c             C   s2   y|   s|  } |  S  tk
r,   dS X d S )NF)is_absoluteresolveis_dirOSError)rT   rF   rF   rG   rW      s    rW   )patterns_listdirectories_listrE   c       
      C   sh  t ttt| }|  }t }xb| D ]Z}|dkr:q,|| tt|r`|t| q,x$||D ]}t|rl|| qlW q,W t t|}t tt|}t tdd |}t dd |D }g }xtt	t
|D ]d}x^t	|d t
|D ]H}	|| ||	 jkr|||	  q||	 || jkr|||  qW qW t t|t|}t t||fS )Nz.*c             S   s   |   S )N)rV   )xrF   rF   rG   rH      rI   z)resolve_reload_patterns.<locals>.<lambda>c             S   s   h | ]}t |r|qS rF   )rW   ).0Zreload_pathrF   rF   rG   	<setcomp>   s    z*resolve_reload_patterns.<locals>.<setcomp>r-   )listsetmapr   copycwdappendrW   globrangelenparents
difference)
rY   rZ   directoriespatternsZcurrent_working_directorypatternmatchchildrenjkrF   rF   rG   resolve_reload_patterns   s4    

rp   )dirsrE   c             C   s(   | d krg S t | tr| gS tt| S )N)
isinstancestrr^   r_   )rq   rF   rF   rG   _normalize_dirs   s
    
rt   c            2   @   sR  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deejdddddf.edee	f e	e
ee	 ee
 eeeej ef eeej ef e
ee ee eeeee	ejf  eeee	ef e	f  eee	e
f  eee eeeeee	 e	f  eeeee	 e	f  eeee	 e	f  ee
 eeeeeee	 e	f  e	ee
 ee
 e
e
e
ee
 eeded f  ee	 eee	ejf  ee	 e
e
ee	 e	eeee	e	f   eee
 d/ddZeed dddZ eedddZ!eedddZ"ddddZ#ddddZ$ddd d!Z%e&j&dd"d#Z'eedd$d%Z(dS )&Configz	127.0.0.1i@  Nr   i   g      4@TFg      ? i         TLSv1r   .)/app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_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_sizec0       5   
   C   s  || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
|| _|| _|| _|| _|| _|| _|| _|| _|| _|p~d| _|| _|| _|| _|| _|| _| | _|!| _|"| _|#| _|$| _|%| _|&| _ |'| _!|(| _"|)| _#|*| _$|+| _%|,| _&|-pg | _'g | _(|.| _)|/| _*d| _+| ,  g | _-g | _.g | _/g | _0|sB|sB|rT| j1sTt23d | j1rrt4|}t4|}t4|}t5||\| _/| _-t5|g \| _0| _.| j-6 }0x^| j.D ]T}1xL|0D ]D}2|1|2ks|1|2j7kry| j-8|2 W n t9k
r   Y nX qW qW x(| j0D ]}3|3| j/kr
| j/8|3 q
W | j-sV|rFt23d| t:t;< g| _-t2=dt>t?t@tA| j- |d k	rddlBmC}4 t2=d| |4|d	 |d krd
t;jDkrtEt;jDd
 | _|  |d krt;jDFdd| _Gn|| _G| jr| jdkrt23d 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_IPSz	127.0.0.1z4"workers" flag is ignored when reloading is enabled.)Hrz   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"   rt   rp   ra   rg   remove
ValueErrorr   osgetcwdr#   sortedr^   r`   rs   Zdotenvr   environintgetr   )5selfrz   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_directoryrk   r   rF   rF   rG   __init__   s    2







zConfig.__init__)z2.0z3.0)rE   c             C   s   dddd}|| j  S )Nz2.0z3.0)r   r   r   )r   )r   mappingrF   rF   rG   asgi_versionr  s    zConfig.asgi_versionc             C   s   t | jp| jS )N)boolr   r   )r   rF   rF   rG   is_ssl{  s    zConfig.is_sslc             C   s   t | jp| jdkS )Nr-   )r   r   r   )r   rF   rF   rG   use_subprocess  s    zConfig.use_subprocessc          	   C   sv  t td | jd k	rt| jtrd| jdkrT| j| jd d d< | j| jd d d< t j| j n| j	drt
| j}t|}t j| W d Q R X nT| j	drd	d l}t
| j}||}t j| W d Q R X nt jj| jd
d | jd k	rNt| jtrt| j }n| j}t d| t d| t d| | jd
krrg t d_d
t d_d S )NTRACE)TFr;   r0   r/   r1   z.json)z.yamlz.ymlr   F)r:   zuvicorn.errorzuvicorn.accesszuvicorn.asgi)loggingaddLevelNamer   r   rr   dictr/   config
dictConfigendswithopenjsonloadyamlZ	safe_load
fileConfigr   rs   r&   	getLoggersetLevelr   r6   r8   )r   fileZloaded_configr   r   rF   rF   rG   r     s8    



zConfig.configure_loggingc          
   C   sp  | 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 | _yt| j| _W n< tk
r* } zt d|  t!"d W d d }~X Y nX y|  | _W nB t#k
r| } z"| j$rlt d| t!"d W d 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j0t1krLt2| j| _| j3rft4| 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valuerF   rF   rG   
<listcomp>  s   zConfig.load.<locals>.<listcomp>s   server)s   servers   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   rS   r   r   rA   r   r   r   rJ   r   r   r   r   rr   r   rs   r   r'   http_protocol_classr   r(   ws_protocol_classr)   r   Zlifespan_classrz   Z
loaded_appr   r   r!   sysexit	TypeErrorr   r"   r   inspectisclasshasattr
isfunctionr   iscoroutinefunctiongetattrr   r   r7   r   r   r   r   r   )r   r   r   r   excZ
use_asgi_3callrF   rF   rG   r     st    



zConfig.loadc             C   s&   t t| j }|d k	r"|| jd d S )N)r   )r   r*   r   r   )r   Z
loop_setuprF   rF   rG   setup_event_loop  s    zConfig.setup_event_loopc          
   C   s  | j r| j }ttjtj}y || d}t| j | W n6 tk
rr } zt	| t
d W d 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 y|| j| jf W n8 tk
rv } zt	| t
d W d 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)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   chmodrX   r   r!   r   r   clickstyler~   fromfdgetsocknameAF_INETr{   AF_INET6
setsockopt
SOL_SOCKETSO_REUSEADDRr|   r   r#   set_inheritable)r   rT   sockZ	uds_permsr   messageZsock_name_formatr   Zlogger_argsZfd_name_formatr   Zaddr_formatZprotocol_namerF   rF   rG   bind_socket	  sN    



zConfig.bind_socketc             C   s   t | jto| jS )N)rr   rz   rs   r   )r   rF   rF   rG   r   E  s    zConfig.should_reload))__name__
__module____qualname__r=   r,   rJ   	CERT_NONEr   r   rs   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   rF   rF   rF   rG   ru      sv    e~,U<ru   )Ir   r   r   r   logging.configr   r   rJ   r   pathlibr   typingr   r   r   r   r   r   r	   r
   r   r   Zuvicorn.loggingr   version_infotyping_extensionsr   r   Zuvicorn.importerr   r   Zuvicorn.middleware.asgi2r   Z!uvicorn.middleware.message_loggerr   Z uvicorn.middleware.proxy_headersr   Zuvicorn.middleware.wsgir   Zasgiref.typingr   r  r  r  r   r  CRITICALERRORWARNINGr5   DEBUGr&   rs   r   __annotations__r'   r(   r)   r*   r+   PROTOCOL_TLS_SERVERr,   r=   r   r   r  rK   rS   r   rW   rp   rt   ru   rF   rF   rF   rG   <module>   s    0


&

&"