
    %iU              
      "   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jZ                  ej\                  ej^                  ej`                  ejb                  e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	jr                  Z: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jx                  dC      Z=	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dJdDZ>dKdEZ?dLdFZ@dMdGZA G dH dI      ZBy)N    )annotationsN)	Awaitable)RawConfigParser)Path)IOAnyCallableLiteral)iscoroutinefunction)ASGIApplication)ImportFromStringErrorimport_from_string)TRACE_LOG_LEVEL)ASGI2Middleware)MessageLoggerMiddleware)ProxyHeadersMiddleware)WSGIMiddleware)autoh11	httptools)r   none
websocketszwebsockets-sansiowsproto)r   onoff)r   r   asyncio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)r0   r1   )defaultaccessr3   zlogging.StreamHandlerzext://sys.stderr)	formatterclassstreamr4   zext://sys.stdoutINFO)handlerslevel	propagater:   )uvicornuvicorn.erroruvicorn.access)versiondisable_existing_loggers
formattersr9   loggerszdict[str, Any]LOGGING_CONFIGr=   c                    t        j                  |      }rfdnd }|j                  | ||       t        j                  |      |_        |r|j                  |       |r|j                  |       |S )Nc                      S N )passwords   F/usr/local/footviz/venv/lib/python3.12/site-packages/uvicorn/config.py<lambda>z$create_ssl_context.<locals>.<lambda>s   s    H     )ssl
SSLContextload_cert_chain
VerifyModeverify_modeload_verify_locationsset_ciphers)	certfilekeyfilerH   ssl_version	cert_reqsca_certsciphersctxget_passwords	     `      rI   create_ssl_contextr[   i   sd     ..
%C)1$tL'<8nnY/CO!!(+ JrK   c                    	 | j                         s| j                         } | j                         S # t        $ r Y yw xY w)NF)is_absoluteresolveis_dirOSError)paths    rI   r_   r_   }   s<    !<<>D{{} s   /2 	>>c           	        t        t        t        t        |j	                                           }| j	                         }t        j
                         }| D ]{  }|dk(  r	|j                  |       t        t        |            r|j                  t        |             I|j                  |      D ]  }t        |      s|j                  |       ! } t        t        |            }t        t        t        |            }t        t        d |            }t        |D ch c]  }t        |      s| c}      }g }t        t        |            D ]q  }	t        |	dz   t        |            D ]T  }
||	   ||
   j                  v r|j                  ||
          ,||
   ||	   j                  v sA|j                  ||	          V s t        t        |      j                  t        |                  }t        t        |            |fS c c}w )Nz.*c                "    | j                         S rF   )r^   )xs    rI   rJ   z)resolve_reload_patterns.<locals>.<lambda>   s    QYY[ rK   r/   )listsetmapr   copycwdappendr_   globrangelenparents
difference)patterns_listdirectories_listdirectoriespatternscurrent_working_directorypatternmatchreload_pathchildrenjks              rI   resolve_reload_patternsr{      s   "3s41A1F1F1H'I#JKK',,.H $
  . d? $w- tG}-277@ .%=&&u-.. s;'(Ks4-.Ks0+>?K{Zf[FYZ[KH3{#$ 0q1uc+./ 	0A1~Q!7!77A/Q;q>#9#99A/		00 s;'223x=ABKH++ [s   !H	2H	c                X    | g S t        | t              r| gS t        t        |             S rF   )
isinstancestrre   rf   )dirss    rI   _normalize_dirsr      s+    |	$vD	?rK   c            0         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f0	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZedd       Z	edd       Z
edd       ZddZddZddZddZddZedd       Zy) Config	127.0.0.1i@  Nr   i       g      4@TFg      ? i         TLSv1c2                   || _         || _        || _        || _        || _        || _        || _        || _        |	| _        |
| _	        || _
        || _        || _        || _        || _        || _        || _        || _        || _        || _        || _        |xs d| _        || _        || _        || _        || _        | | _        |!| _        |"| _        |#| _        |$| _        |%| _        |&| _         |'| _!        |(| _"        |)| _#        |*| _$        |+| _%        |,| _&        |-| _'        |.| _(        |/xs g | _)        g | _*        |0| _+        |1| _,        d| _-        | j]                          g | _/        g | _0        g | _1        g | _2        |s|s|r!| jf                  sth        jk                  d       | jf                  rntm        |      }tm        |      }tm        |      }to        ||      \  | _1        | _/        to        |g       \  | _2        | _0        | j^                  jq                         }2| j`                  D ]9  }3|2D ]2  }4|3|4k(  s|3|4jr                  v s	 | j^                  ju                  |4       4 ; | jd                  D ],  }5|5| jb                  v s| jb                  ju                  |5       . | j^                  s2|rth        jk                  d|       ty        jz                         g| _/        th        j}                  dt        t        t        t        | j^                                           |%ddlCmD}6 th        j}                  d|        |6|	       |3d
t        j                  v r!t        t        j                  d
         | _        |  |&t        j                  j                  dd      | _I        n|| _I        | j&                  r&| j*                  dkD  rth        jk                  d       y y y # tv        $ r Y w xY w)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')dotenv_pathWEB_CONCURRENCYFORWARDED_ALLOW_IPSr   z4"workers" flag is ignored when reloading is enabled.)J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
log_config	log_level
access_logr2   	interfacereloadreload_delayworkersproxy_headersserver_headerdate_header	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_passwordrU   ssl_cert_reqsssl_ca_certsssl_ciphersheadersencoded_headersfactoryh11_max_incomplete_event_sizeloadedconfigure_loggingreload_dirsreload_dirs_excludesreload_includesreload_excludesshould_reloadloggerr#   r   r{   rh   rn   remove
ValueErrorr   ri   r$   sortedre   rg   r~   dotenvr   osenvironr-   getforwarded_allow_ips)7selfr   r   r   r   r   r   r   r   r   r   r   r   r   r   env_filer   r   r   r2   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rU   r   r   r   r   r   r   reload_dirs_tmp	directoryreload_directoryru   r   s7                                                          rI   __init__zConfig.__init__   s   h 				&( 0.&<# $"$$"(|!**&"!2"4"4,)B&*D'.&($8!&*(&.5m:<-J* ')02!*,*,?otGYGYNNu )+6K-o>O-o>O5L_^i5j2D $"2>UVegi>j;D $";"..335O!66 !	(7 !$ $44	EUE]E]8]! ,,334DE!!  // 9d222((//89 ##NNM#
 %)HHJ< KKAtCT%5%5678
 *KK7BH-?0BJJ>rzz*;<=DL&')zz~~6K['YD$':D$;;4<<!+NNQR ,;I  * ! !s   O	O&%O&c                ,    dddd}|| j                      S )Nz2.0z3.0)r   r   r    )r   )r   mappings     rI   asgi_versionzConfig.asgi_versionY  s%     5

 t~~&&rK   c                H    t        | j                  xs | j                        S rF   )boolr   r   r   s    rI   is_sslzConfig.is_sslb  s    D$$9(9(9::rK   c                N    t        | j                  xs | j                  dkD        S )Nr/   )r   r   r   r   s    rI   use_subprocesszConfig.use_subprocessf  s    DKK34<<!#344rK   c                   t        j                  t        d       | j                  t	        | j                  t
              rw| j                  dv r>| j                  | j                  d   d   d<   | j                  | j                  d   d   d<   t         j                  j                  | j                         n;t	        | j                  t              rn| j                  j                  d      rSt        | j                        5 }t        j                  |      }t         j                  j                  |       d d d        nt	        | j                  t              rn| j                  j                  d      rSd	d l}t        | j                        5 }|j                  |      }t         j                  j                  |       d d d        n+t         j                  j!                  | j                  d
       | j"                  t	        | j"                  t              rt$        | j"                     }n| j"                  }t        j&                  d      j)                  |       t        j&                  d      j)                  |       t        j&                  d      j)                  |       | j*                  d
u r5g t        j&                  d      _        d
t        j&                  d      _        y y # 1 sw Y   xY w# 1 sw Y   xY w)NTRACE)TFrA   r3   r2   r4   z.json)z.yamlz.ymlr   F)r@   r=   r>   zuvicorn.asgi)loggingaddLevelNamer   r   r}   dictr2   config
dictConfigr~   endswithopenjsonloadyaml	safe_load
fileConfigr   r'   	getLoggersetLevelr   r9   r;   )r   fileloaded_configr   r   s        rI   r   zConfig.configure_loggingj  s+   _g6??&$//40??m3MQ__DOOL1)<\JLPOODOOL1(;LI))$//:DOOS1doo6N6Nw6W$//* =d$(IIdOMNN--m<= = DOOS1doo6N6NO`6a $//* =d$(NN4$8MNN--m<= = ))$//TY)Z>>%$..#.&t~~6	 NN	o.77	B./88Cn-66yA??e#;=G./8<AG./9 $1= == =s   5K*1K6*K36L c           	        | j                   rJ | j                  rl| j                  sJ t        | j                  | j                  | j
                  | j                  | j                  | j                  | j                        | _
        nd | _
        | j                  D cg c]5  \  }}|j                         j                  d      |j                  d      f7 }}}dt        |      vr| j                  rdg|z   n|| _        t#        | j$                  t&              r;t)        t*        j-                  | j$                  | j$                              }|| _        n| j$                  | _        t#        | j0                  t&              r;t)        t2        j-                  | j0                  | j0                              }|| _        n| j0                  | _        t)        t6        | j8                           | _        	 t)        | j<                        | _        	 | j?                         | _        | jJ                  stB        jM                  d       	 | jP                  d	k(  rtS        jT                  | j>                        rtW        | j>                  d
      }nWtS        jX                  | j>                        rt[        | j>                        }n"t]        | j>                  dd       }t[        |      }|rdnd| _(        | jP                  dk(  r"t_        | j>                        | _        d | _        n)| jP                  dk(  rta        | j>                        | _        tB        jc                         td        k  rtg        | j>                        | _        | jh                  r&tk        | j>                  | jl                        | _        d| _         y c c}}w # t@        $ r8}tB        jE                  d|z         tG        jH                  d       Y d }~d }~ww xY w# tN        $ rB}| jJ                  r+tB        jE                  d|       tG        jH                  d       Y d }~ d }~ww xY w)N)rT   rS   rH   rU   rV   rW   rX   latin1   server)r   s   uvicornzError loading ASGI app. %sr/   z_ASGI app factory detected. Using it, but please consider setting the --factory flag explicitly.z"Error loading ASGI app factory: %sr   	__await____call__r   r   r    )trusted_hostsT)7r   r   r   r[   r   r   rU   r   r   r   rL   r   lowerencoder   r   r   r}   r   r~   r   r(   r   http_protocol_classr   r)   ws_protocol_classr*   r   lifespan_classr   
loaded_appr   r   r"   sysexitr   r#   	TypeErrorr   inspectisclasshasattr
isfunctionr   getattrr   r   getEffectiveLevelr   r   r   r   r   )	r   keyvaluer   r   r   exc
use_asgi_3calls	            rI   r   zConfig.load  s/   ;;;;$$$$.@((**22 ,,,,**((/DH DHdhdpdpqV`VY[`CIIK..x8%,,x:PQqq _ 55$:L:L %%7  	 dii%"4^5G5G		SWS\S\5]"^?RD$'+yyD$dggs# 2<3C3CDGGTWW3U VDUD"%)WWD"0$--1HI	0:DO

	"oo/DO <<u >>V#t/$T__kB
##DOO40A
t
DA06
(2WDN>>V#,T__=DO%)D"^^w&-doo>DO##%85dooFDO4T__TXTlTlmDOy r. % 	LL5;<HHQKK	  	||A3G	s6   :N0.N6 	O: 6	O7?-O22O7:	Q7Q  Qc                    t        d      )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   s    rI   setup_event_loopzConfig.setup_event_loop  s    n
 	
rK   c                >   | j                   t        v rt        t        | j                            }n	 t        | j                         S y  || j                        S # t        $ r7}t        j                  d|z         t        j                  d       Y d }~Qd }~ww xY w)Nz,Error loading custom loop setup function. %sr/   )r   )	r   r+   r   r   r   r"   r   r   r   )r   loop_factoryr  s      rI   get_loop_factoryzConfig.get_loop_factory  s    99&6HX\XaXaIb6cL)$))44 4+>+>?? ) KcQRs   A 	B%-BBc                   | j                   r| j                   }t        j                  t        j                  t        j                        }	 |j	                  |       d}t        j                  | j                   |       d}d}dt        j                  |d      z   dz   }| j                   g}nz| j                  rpt        j                  | j                  t        j                  t        j                        }d	}d}	dt        j                  |	d      z   dz   }|j!                         g}nt        j"                  }
d
}| j$                  r d| j$                  v rt        j&                  }
d}t        j                  |
      }|j)                  t        j*                  t        j,                  d       	 |j	                  | j$                  | j.                  f       d| d}dt        j                  |d      z   dz   }| j0                  rdnd}|| j$                  |j!                         d   g}t        j2                  |g|dd|ii |j5                  d       |S # t        $ r5}t        j                  |       t        j                  d       Y d }~d }~ww xY w# t        $ r4}t        j                  |       t        j                  d       Y d }~d }~ww xY w)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   ra   sock	uds_permsr  messagesock_name_formatr  logger_argsfd_name_formatr  addr_formatprotocol_names                rI   bind_socketzConfig.bind_socket  s9   8888D==1C1CDD		$!	9-
 QG#1EKK@PW[4\\_xxM88*KWW==&..&:L:LMDKG!N1EKKUY4ZZ]vvM++-.K^^F&KyySDII-,==/DOOF--v/B/BAF		499dii01
 ,K=8OPG1EKKRV4WWZssM'+{{GM($))T5E5E5G5JKKGRkR/=1QRT"K  S!6  S!s0   3I /'J 	J *JJ	K!*KKc                R    t        | j                  t              xr | j                  S rF   )r}   r   r~   r   r   s    rI   r   zConfig.should_reload#  s    $((C(8T[[8rK   )br   z*ASGIApplication | Callable[..., Any] | strr   r~   r   r-   r   
str | Noner   
int | Noner   zLoopFactoryType | strr   z/type[asyncio.Protocol] | HTTPProtocolType | strr   z-type[asyncio.Protocol] | WSProtocolType | strr   r-   r   r-   r   float | Noner   r,  r   r   r   LifespanTyper   str | os.PathLike[str] | Noner   z7dict[str, Any] | str | RawConfigParser | IO[Any] | Noner   zstr | int | Noner   r   r2   zbool | Noner   InterfaceTyper   r   r   list[str] | str | Noner   floatr   r0  r   r0  r   r+  r   r   r   r   r   r   r   r0  r   r~   r   r+  r   r+  r   r-   r   r-   r   r-   r   r+  r   r-   r   z%Callable[..., Awaitable[None]] | Noner   r.  r   r.  r   r*  rU   r-   r   r-   r   r.  r   r~   r   zlist[tuple[str, str]] | Noner   r   r   r+  )returnzLiteral['2.0', '3.0'])r2  r   )r2  None)r2  z.Callable[[], asyncio.AbstractEventLoop] | None)r2  zsocket.socket)__name__
__module____qualname__rC   r.   rL   	CERT_NONEr   propertyr   r   r   r   r   r  r	  r(  r   rG   rK   rI   r   r      s     &,@F<B+)-(,'+!'26N\&*"&#).2"2626""" 6:(,)-"# 04*+AE596:+// ]]6:"0448edS7dS dS 	dS
 dS dS $dS >dS :dS dS dS 'dS &dS !%dS dS  0!dS" L#dS$ $%dS& 'dS(  )dS* !+dS, -dS. ,/dS0 1dS2 03dS4 05dS6 7dS8 9dS: ;dS< =dS> 4?dS@ AdSB &CdSD 'EdSF GdSH  IdSJ KdSL $.MdSN %(OdSP ?QdSR 3SdST 4UdSV )WdSX YdSZ [dS\ 4]dS^ _dS` .adSb cdSd (2edSL ' ' ; ; 5 5$BLM^
@.` 9 9rK   r   )rS   zstr | os.PathLike[str]rT   r.  rH   r*  rU   r-   rV   r-   rW   r.  rX   r*  r2  zssl.SSLContext)ra   r   r2  r   )rp   	list[str]rq   r9  r2  ztuple[list[str], list[Path]])r   r0  r2  r9  )C
__future__r   r   r   r   r   logging.configr   r  rL   r   collections.abcr   configparserr   pathlibr   typingr   r   r	   r
   r  uvicorn._compatr   uvicorn._typesr   uvicorn.importerr   r   uvicorn.loggingr   uvicorn.middleware.asgi2r   !uvicorn.middleware.message_loggerr    uvicorn.middleware.proxy_headersr   uvicorn.middleware.wsgir   HTTPProtocolTypeWSProtocolTyper-  LoopFactoryTyper/  CRITICALERRORWARNINGr8   DEBUGr'   __annotations__r(   r)   r*   r+   r,   PROTOCOL_TLS_SERVERr.   rC   r   r   r[   r_   r{   r   r   rG   rK   rI   <module>rQ     sS   "      	  
 
 % (  - -  / * F + 4 E C 256 UV*+=>89   ]]LL]]
N  ;8J"  GRgE'#  -
*-.  2;8	)%  #E
 D33 c 3  % 50
 4Y

 #,(
 ",(
 "+f5Q!6*(0zFQVW5" B 
		?	+$*  	
  ,  (!,Hs9 s9rK   