xjuddlmZddlZddlZddlZddlZddlZddlZddlZddl m Z m Z m Z m Z mZddlmZmZmZddlmZddlmZddlmZmZddlmZdd lmZmZdd lmZdd lm Z m!Z!dd l"m#Z#m$Z$m%Z%dd l&m'Z'm(Z(ddl)m*Z*ddl+m,Z,ddl-m.Z.ddl/m0Z0m1Z1m2Z2ddl3m4Z4m5Z5m6Z6m7Z7m8Z8ddl9m:Z:m;Z;Gdde<Z=GddeZ> d0dZ? d1dZ@d2dZA d3dZBejdZD d4dZEGddZFGd d!eFZGGd"d#eFZHGd$d%eFZIGd&d'eFZJed(ZKGd)d*eeKZL d5d+ZMGd,d-ZNGd.d/ZOy)6) annotationsN) AwaitableCallable Collection GeneratorSequence)AbstractAsyncContextManagerAbstractContextManagerasynccontextmanager)Enum)Pattern)AnyTypeVar)wrap_app_handling_exceptions)get_route_pathis_async_callable)run_in_threadpool)CONVERTOR_TYPES Convertor)URLHeadersURLPath) HTTPExceptionStarletteDeprecationWarning) Middleware)RequestBodyLimitMiddleware)Request)PlainTextResponseRedirectResponseResponse)ASGIAppLifespanReceiveScopeSend) WebSocketWebSocketClosec$eZdZdZdfd ZxZS) NoMatchFoundz} Raised by `.url_for(name, **path_params)` and `.url_path_for(name, **path_params)` if no matching route exists. cdjt|j}t|d|d|dy)N, zNo route exists for name "z" and params "z".)joinlistkeyssuper__init__)selfname path_paramsparams __class__s e/mnt/ssd/data/Dropbox/adrian/sandbox/mcp-query/venv/lib/python3.12/site-packages/starlette/routing.pyr0zNoMatchFound.__init__$s=4 0 0 234 5dV>&QSTU)r2strr3zdict[str, Any]returnNone)__name__ __module__ __qualname____doc__r0 __classcell__)r5s@r6r)r)s VVr7r)ceZdZdZdZdZy)MatchrN)r;r<r=NONEPARTIALFULLr7r6rArA)s DG Dr7rAcbt|r|ntjt|dfd }|S)zi Takes a function or coroutine `func(request) -> response`, and returns an ASGI application. ctKt|||dfd }t||||d{y7w)NcZKd{}||||d{y77wNrG)scopereceivesendresponsefrequests r6appz*request_response..app..app=s.wZ'H5'40 0 0( 0s +'+)++rLr$rMr#rNr%r9r:)rr)rLrMrNrRrQrPs @r6rRzrequest_response..app:s8%$/ 19*38NNNs ,868rS)r functoolspartialr)funcrRrPs @r6request_responserW/s2"$'Y->->?PRV-WO Jr7cdfd }|S)zM Takes a coroutine `func(session)`, and returns an ASGI application. cvKt|||dfd }t||||d{y7w)N)rMrNc2Kd{y7wrKrG)rLrMrNrVsessions r6rRz+websocket_session..app..appQsw-  s rS)r&r)rLrMrNrRr[rVs @r6rRzwebsocket_session..appNs8E7> 9*38NNNs -979rSrG)rVrRs` r6websocket_sessionr\FsO Jr7cDt|d|jjS)Nr;)getattrr5r;)endpoints r6get_namer`Ys 8Z););)D)D EEr7ct|jD]O\}}d|zdz|vs||}|j|}|jd|zdz|}|j |Q||fS)N{})r-items to_stringreplacepop)pathparam_convertorsr3keyvalue convertors r6replace_paramsrm]s ;,,./! U 9s?d "(-I''.E<<c C7D OOC !  r7z4{([a-zA-Z_][a-zA-Z0-9_]*)(:[a-zA-Z_][a-zA-Z0-9_]*)?}cx|jd }d}d}t}d}i}tj|D]}|j d\}} | j d} | t vs Jd| dt | } |tj|||jz }|d |d | jd z }||||jz }|d |zz }||vr|j|| ||<|j}|r@d jt|} t|dkDrdnd} t!d| d| d||r3||dj#dd} |tj| dzz }n|tj||ddzz }|||dz }tj$|||fS)a* Given a path string, like: "/{username:str}", or a host string, like: "{subdomain}.mydomain.org", return a three-tuple of (regex, format, {param_name:convertor}). regex: "/(?P[^/]+)" format: "/{username}" convertors: {"username": StringConvertor()} /^rr8:zUnknown path convertor ''z(?P<>)z{%s}r+rBszDuplicated param name z at path N$) startswithset PARAM_REGEXfinditergroupslstriprreescapestartregexaddendr,sortedlen ValueErrorsplitcompile)rhis_host path_regex path_formatduplicated_paramsidxrimatch param_nameconvertor_typerlnamesendinghostnames r6 compile_pathros//#&&GJK"%% C%%d+%*\\%%8" N'..s30^4L^L\\]2^^0#N3 biiS5;;= 9:: ZL)//):!<< tC%++-00 v ** ) )  ! !* -'0$iik#& &!234-.20% $PQQ:##C(+bii)C// biiST +c11 4:K ::j !;0@ @@r7c,eZdZddZddZddZddZy) BaseRoutectrKNotImplementedError)r1rLs r6matcheszBaseRoute.matches !##r7c trKr)r1r2r3s r6 url_path_forzBaseRoute.url_path_forrr7cKtwrKrr1rLrMrNs r6handlezBaseRoute.handles!##s cXK|j|\}}|tjk(rM|ddk(r tdd}||||d{y|ddk(rt }||||d{y|j ||j |||d{y7W747 w)z A route may be used in isolation as a stand-alone ASGI app. This is a somewhat contrived case, as they'll almost always be used within a Router, but could be useful for some tooling and minimal apps. typehttp Not Found status_codeN websocket)rrArDrr'updater)r1rLrMrNr child_scoperOwebsocket_closes r6__call__zBaseRoute.__call__s "\\%0{ EJJ V}&,[cJugt444 v+-"0"2%eWd;;;  [!kk%$///5< 0s6A B* B$ $B*1B&2,B*B(B*&B*(B*NrLr$r9ztuple[Match, Scope]r2r8r3rr9rrS)r;r<r=rrrrrGr7r6rrs$$$0r7rcheZdZdddddd d dZd dZd dZd dZddZdd Zy)RouteNT)methodsr2include_in_schema middleware max_body_sizec*|jdsJd||_||_| t|n||_||_|}t |tjr'|j}t |tjr'tj|stj|rt||_| dg}n||_|/t|D]!\} } } | |jg| i| |_#|t!|j||_|d|_nL|D chc]} | j%c} |_d|j"vr|j"j'dt)|\|_|_|_ycc} w)Nro Routed paths must start with '/'GETrHEAD)ryrhr_r`r2r isinstancerTrUrVinspect isfunctionismethodrWrRreversedrrupperrrrrri) r1rhr_rr2rrrendpoint_handlerclsargskwargsmethods r6r0zRoute.__init__sms#G%GG#   *.,HX&D !2#)9+<+<=/44 )9+<+<=   . /73C3CDT3U'1DH ' DH  !%-j%9 :!T6txx9$9&9 :  $1$((-XDH ?DL9@AvFLLNADL $   (COPTCU@)4+@ Bs)Fc|ddk(rt|}|jj|}|r|j}|j D]&\}}|j |j |||<(t|jdi}|j||j|d}|jr#|d|jvrtj|fStj|fStjifS)Nrrr3r_r3r)rrr groupdictrdriconvertdictgetrr_rrArErFrD r1rL route_pathrmatched_paramsrjrkr3rs r6rz Route.matchess =F "'.JOO))*5E!&!2"0"6"6"8TJC*.*?*?*D*L*LU*SN3'T"599]B#?@ "">2+/==U <t[1 1!/0@0@$BWBWYd!e###D622r7c"K|jr`|d|jvrOddj|ji}d|vr td|tdd|}||||d{y|j |||d{y7!7w)NrAllowr+rRi)rheaderszMethod Not Allowed)rr,rrrR)r1rLrMrNrrOs r6rz Route.handles <2+/==U zz;..zz2~r7c $t|j}t|jj}||jk7s||k7r t ||t |j |j|\}}|rJt|dS)Nrrrrs r6rzWebSocketRoute.url_path_forVs+**,- d3388:; 499   >t[1 1!/0@0@$BWBWYd!e###D;77r7cFK|j|||d{y7wrKrRrs r6rzWebSocketRoute.handleahhugt,,, !!ct|txr4|j|jk(xr|j|jk(SrK)rrrhr_rs r6rzWebSocketRoute.__eq__ds9%0pTYY%**5LpQUQ^Q^bgbpbpQppr7ch|jjd|jd|jdS)Nrrru)r5r;rhr2r1s r6rzWebSocketRoute.__repr__gs/..))*& WTYYMQRSSr7) rhr8r_rr2rrrr9r:rrrSrrrrGr7r6rr)s`  26 VV%V  V 0 V V:  8-qTr7rcxeZdZ d ddd d dZed dZd dZddZddZddZ dd Z y)MountNrrc|dk(s|jdsJd| |Jd|jd|_|||_nt ||_|j|_|/t |D]!\}}} ||j g|i| |_#|t|j ||_||_t|jdz\|_ |_ |_ y)Nrqrorz0Either 'app=...', or 'routes=' must be specified)routesrz /{path:path}) ryrstriprh _base_appRouterrRrrr2rrrri) r1rhrRrr2rrrrrs r6r0zMount.__init__lsrzT__S1U3UU1&"4h6hh4KK$ ?&)DN#62DN>>  !%-j%9 :!T6txx9$9&9 :  $1$((-XDH COPTPYPY\jPjCk@)4+@r7c0t|jdgSNr)r^rrs r6rz Mount.routesst~~x44r7cF|ddvr|jdd}t|}|jj|}|r|j }|j D]&\}}|j |j|||<(d|jdz}|dt| } t|jdi} | j|| |jd||| z|jd } tj| fStjifS) Nrrr root_pathrqrorhr3 app_root_path)r3rrr_)rrrrrrdrirrgrrrrRrArFrD) r1rLrrrrrjrkremaining_path matched_pathr3rs r6rz Mount.matchess =1 1 +r2I'.JOO))*5E!&!2"0"6"6"8TJC*.*?*?*D*L*LU*SN3'T!$~'9'9&'A!A)*@S-@,@A "599]B#?@ "">2#.&+YY %J!*\!9 $ zz;..zz2~r7c |j\||jk(rMd|vrI|djd|d<t|j|j|\}}|st |S|j|j |jdzr|j|}n|t|jdzd}|jd}d|d<t|j|j|\}}|||d<|jxsgD]I} |j|fi|} t |jdt| z| jcSt||#t$rYcwxYw)Nrhro)rhrrrBrqr)r2r~rmrrirryrrrrrr8rr)) r1r2r3rhrremaining_name path_kwarg path_prefixrouteurls r6rzMount.url_path_forsy 99 TTYY%66[;P"-f"5"<"2.9txxP zz;..zz2~r7c |jW||jk(rHd|vrD|jd}t|j|j|\}}|st ||S|j|j |jdzr|j|}n|t|jdzd}t|j|j|\}}|jxsgD]8} |j|fi|}t t||j|cSt||#t$rYRwxYw)Nrh)rhrrrrB)rhrr) r2rgrmrrirryrrrr8rr)) r1r2r3rhrrr r r s r6rzHost.url_path_fors5 99 TTYY%66[;P??6*D%3D4D4DdF[F[]h%i "D"#Dt44 YY $//$))c/"Byy !%"&c$))nq&8&:!;%3D4D4DdF[F[]h%i "D"* ,%,,^P?OPC"C3<D?cFK|j|||d{y7wrKrrs r6rz Host.handlerrct|txr4|j|jk(xr|j|jk(SrK)rrrrRrs r6rz Host.__eq__s6%&\499 +B\txxSXS\S\G\\r7c|jj}|jxsd}|d|jd|d|jdS)Nrqz(host=rrru)r5r;r2rrRrs r6rz Host.__repr__ rr7rKrr8rRr!r2rr9r:rrrrSrrrrGr7r6rrs7V// ..-]Tr7r_Tc4eZdZddZddZ ddZy)_AsyncLiftContextManagerc||_yrK)_cm)r1cms r6r0z!_AsyncLiftContextManager.__init__s r7c>K|jjSwrK)r+ __enter__rs r6 __aenter__z#_AsyncLiftContextManager.__aenter__sxx!!##scDK|jj|||SwrK)r+__exit__)r1exc_type exc_value tracebacks r6 __aexit__z"_AsyncLiftContextManager.__aexit__s! xx  9i@@s N)r,zAbstractContextManager[_T])r9r')r2ztype[BaseException] | Noner3zBaseException | Noner4ztypes.TracebackType | Noner9z bool | None)r;r<r=r0r/r5rGr7r6r)r)s<$A,A(A. A  Ar7r)cntj|tjdfd }|S)Nc&t|SrK)r))rRcmgrs r6wrapperz+_wrap_gen_lifespan_context..wrapper(s'S 22r7)rRrr9z_AsyncLiftContextManager[Any]) contextlibcontextmanagerrTwraps)lifespan_contextr9r8s @r6_wrap_gen_lifespan_contextr>#s8  $ $%5 6D__T33 Nr7c,eZdZddZddZddZd dZy) _DefaultLifespanc||_yrK)_router)r1routers r6r0z_DefaultLifespan.__init__0s  r7c KywrKrGrs r6r/z_DefaultLifespan.__aenter__3  c KywrKrG)r1exc_infos r6r5z_DefaultLifespan.__aexit__6rErFc|SrKrG)r1rRs r6rz_DefaultLifespan.__call__9s r7N)rCr)r9r:)rHobjectr9r:)r1r'rRrJr9r')r;r<r=r0r/r5rrGr7r6r@r@/s  r7r@ceZdZ dddd ddZddZddZddZddZddZdd Z ddd Z ddd Z d dd Z d dd Z y)rNrcZ|gn t||_||_| |jn||_|t ||_ntj|r+tjdtt||_nGtj|r+tjdtt||_n||_|j|_|r/t#|D]!\}}} ||j g|i| |_#|t%|j ||_yy)Nzjasync generator function lifespans are deprecated, use an @contextlib.asynccontextmanager function insteadzdgenerator function lifespans are deprecated, use an @contextlib.asynccontextmanager function insteadr)r-rredirect_slashes not_founddefaultr@r=risasyncgenfunctionwarningswarnrr isgeneratorfunctionr>rRmiddleware_stackrr) r1rrMrOlifespanrrrrrs r6r0zRouter.__init__>s#NbV  0)0t~~g  3CD3ID !  ' ' 1 MMJ+  %8$AD !  ( ( 2 MMv+ %?x$HD !$,D ! $ %-j%9 T!T6(+D,A,A(SD(SF(S% T  $$>t?T?Tdq$rD ! %r7cK|ddk(rt}||||d{yd|vr tdtdd}||||d{y757w)NrrrRrrr)r'rr)r1rLrMrNrrOs r6rNzRouter.not_foundhsl =K ',.O!%$7 7 7  E>C0 0(#FHugt,,, 8 -s! AA/AAAAc |jD]} |j|fi|cSt||#t$rY1wxYwrK)rrr))r1r2r3r s r6rzRouter.url_path_forwsU[[ E )u))$>+>>  4--   s 3 ??c6Kd}|jd}|d{ |j|4d{}|#d|vr td|dj||ddid{d}|d{dddd{|dd id{y77q7<7-7#1d{7swY/xYw7$#t$rAt j }|r|d |d d{7|d |d d{7wxYww) z{ Handle ASGI lifespan messages, which allows us to manage application startup and shutdown events. FrRNstatez:The server does not support "state" in the lifespan scope.rzlifespan.startup.completeTzlifespan.shutdown.completezlifespan.shutdown.failed)rmessagezlifespan.startup.failed)rr= RuntimeErrorr BaseExceptionr4 format_exc)r1rLrMrNstartedrR maybe_stateexc_texts r6rUzRouter.lifespans6 99U#i ?,,S1  [*e+*+ghh'N))+6F$?@AAAi   <=> > >%  B    ?  ++-H$>8TUUU $=(STTT   sDB+DC B-C 3B52B/3B5B1B5 C B3C  D%C &D-C /B51B53C 5C;B> <CC D -D9C<:DDDDcFK|j|||d{y7w)z; The main entry point to the Router class. N)rTrs r6rzRouter.__call__s ##E7D999rcK|ddvsJd|vr||d<|ddk(r|j|||d{yd}|jD]r}|j|\}}|tjk(r.|j ||j |||d{y|tjk(sl|o|}|}t|-|j |j |||d{yt|} |ddk(r|jr| dk7rt|} | jdr| djd| d<n | ddz| d<|jD]^}|j| \}}|tjk7s+t| } tt!|  } | |||d{y|j#|||d{y77B77+7w) Nr)rrrUrCrUrrorhr!)r )rUrrrArFrrrErrMrendswithrrDrrr8rO) r1rLrMrNrUr rr partial_scoperredirect_scope redirect_urlrOs r6rRz Router.appsV} AAAA 5 "E(O =J &--w5 5 5 [[ ,E"'u!5 E; " [)ll5'4888%--'GO +  ,   LL '..6 6 6 #E* =F "t'<'<sAR!%[N""3')7)?)F)Fs)Kv&)7)?#)Ev& %*]]>%B"{EJJ&#&^#r@rrGr7r6rs"  PP__E>3;::K+F&MMCC:V9V D  = . 0 &F   /    bjjOP 5A 5A85Ap00 A ? 6   x"x"r7