
    df~              
       4   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 d dlmZmZ d dlmZmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZmZ d dlm Z m!Z!m"Z"m#Z#m$Z$ d dl%m&Z&m'Z'  G d de(      Z) G d de
      Z*dejV                  de,fdZ-dej\                  de fdZ/dej\                  de fdZ0dej\                  de1fdZ2de1dejf                  e1ef   dejf                  e1e1f   dejh                  e1e5f   fdZ6 ejn                  d      Z8de1dejh                  ejr                  e1ejf                  e1ef   f   fdZ: G d  d!      Z; G d" d#e;      Z< G d$ d%e;      Z= G d& d'e;      Z> G d( d)e;      Z? ej                  d*      ZA G d+ d,ej                  eA         ZCd-ej\                  ejV                  gej                  f   dej\                  ejV                  gej                  f   fd.ZE G d/ d0      ZF G d1 d2      ZGy)3    N)asynccontextmanager)Enum)is_async_callable)run_in_threadpool)CONVERTOR_TYPES	Convertor)URLHeadersURLPath)HTTPException)
Middleware)Request)PlainTextResponseRedirectResponse)ASGIAppLifespanReceiveScopeSend)	WebSocketWebSocketClosec                   b     e Zd ZdZdedej                  eej                  f   ddf fdZ xZ	S )NoMatchFoundz}
    Raised by `.url_for(name, **path_params)` and `.url_path_for(name, **path_params)`
    if no matching route exists.
    namepath_paramsreturnNc                     dj                  t        |j                                     }t        |   d| d| d       y )N, zNo route exists for name "z" and params "z".)joinlistkeyssuper__init__)selfr   r   params	__class__s       J/home/api-vastappli/venv/lib/python3.12/site-packages/starlette/routing.pyr#   zNoMatchFound.__init__   s=    4 0 0 2345dV>&QSTU    )
__name__
__module____qualname____doc__strtypingDictAnyr#   __classcell__)r&   s   @r'   r   r      s>    
VS Vv{{3

?/K VPT V Vr(   r   c                       e Zd ZdZdZdZy)Matchr         N)r)   r*   r+   NONEPARTIALFULL r(   r'   r3   r3   #   s    DGDr(   r3   objr   c                     t        j                  dt               t        | t        j
                        r'| j                  } t        | t        j
                        r't        j                  |       S )z~
    Correctly determines if an object is a coroutine function,
    including those wrapped in functools.partial objects.
    zViscoroutinefunction_or_partial is deprecated, and will be removed in a future release.)	warningswarnDeprecationWarning
isinstance	functoolspartialfuncinspectiscoroutinefunction)r:   s    r'   iscoroutinefunction_or_partialrE   )   sV    
 MM	3
 S)++
,hh S)++
,&&s++r(   rB   c                 V     t               dt        dt        dt        ddf fd}|S )zi
    Takes a function or coroutine `func(request) -> response`,
    and returns an ASGI application.
    scopereceivesendr   Nc                    K   t        | ||      }r |       d {   }nt        |       d {   } || ||       d {    y 7 ,7 7 	wN)rH   rI   )r   r   )rG   rH   rI   requestresponserB   is_coroutines        r'   appzrequest_response.<locals>.app?   sR     %t<!']*H.tW==Hugt,,, +=,s1   AAAAAAAAA)r   r   r   r   )rB   rO   rN   s   ` @r'   request_responserP   8   s7    
 %T*L- - - - - Jr(   c                 <     dt         dt        dt        ddf fd}|S )zM
    Takes a coroutine `func(session)`, and returns an ASGI application.
    rG   rH   rI   r   Nc                 N   K   t        | ||      } |       d {    y 7 wrK   )r   )rG   rH   rI   sessionrB   s       r'   rO   zwebsocket_session.<locals>.appP   s"     E7>7ms   %#%)r   r   r   )rB   rO   s   ` r'   websocket_sessionrT   J   s+         Jr(   endpointc                     t        j                  |       st        j                  |       r| j                  S | j                  j                  S N)rC   	isroutineisclassr)   r&   )rU   s    r'   get_namerZ   W   s9    "gooh&?   &&&r(   pathparam_convertorsr   c                     t        |j                               D ]O  \  }}d|z   dz   | v s||   }|j                  |      }| j                  d|z   dz   |      } |j	                  |       Q | |fS )N{})r    items	to_stringreplacepop)r[   r\   r   keyvalue	convertors         r'   replace_paramsrg   ]   s    
 ;,,./ !
U9s?d"(-I''.E<<c	C7DOOC ! r(   z4{([a-zA-Z_][a-zA-Z0-9_]*)(:[a-zA-Z_][a-zA-Z0-9_]*)?}c                 x   | j                  d       }d}d}t               }d}i }t        j                  |       D ]  }|j	                  d      \  }}	|	j                  d      }	|	t        v sJ d|	 d       t        |	   }
|t        j                  | ||j                                z  }|d	| d
|
j                   dz  }|| ||j                          z  }|d|z  z  }||v r|j                  |       |
||<   |j                         } |r@dj                  t        |            }t        |      dkD  rdnd}t!        d| d| d|        |r3| |d j#                  d      d   }|t        j                  |      dz   z  }n|t        j                  | |d       dz   z  }|| |d z  }t        j$                  |      ||fS )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<username>[^/]+)"
    format:     "/{username}"
    convertors: {"username": StringConvertor()}
    /^ r   r-   :zUnknown path convertor ''z(?P<>)z{%s}r   r4   szDuplicated param name z	 at path N$)
startswithsetPARAM_REGEXfinditergroupslstripr   reescapestartregexaddendr   sortedlen
ValueErrorsplitcompile)r[   is_host
path_regexpath_formatduplicated_paramsidxr\   match
param_nameconvertor_typerf   namesendinghostnames                 r'   compile_pathr   o   s    //#&&GJK
C%%d+ %*\\%%8"
N'..s3o-	8%n%5Q7	8 $N3	biiS5;;= 9::
ZL)//):!<<
tC%++-00v
**))!!*-'0$iik'* 		&!234-.20%	$PQQ:##C(+bii)C//
biiST
+c11
4:K::j!;0@@@r(   c                       e Zd Zdedej
                  eef   fdZdedej                  de
fdZdedededd	fd
Zdedededd	fdZy	)	BaseRouterG   r   c                     t               rW   NotImplementedError)r$   rG   s     r'   matcheszBaseRoute.matches       !##r(   _BaseRoute__namer   c                     t               rW   r   )r$   r   r   s      r'   url_path_forzBaseRoute.url_path_for   r   r(   rH   rI   Nc                    K   t               wrW   r   r$   rG   rH   rI   s       r'   handlezBaseRoute.handle   s     !##s   c                 X  K   | j                  |      \  }}|t        j                  k(  rM|d   dk(  r t        dd      } ||||       d{    y|d   dk(  rt	               } ||||       d{    y|j                  |       | j                  |||       d{    y7 W7 47 	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.
        typehttp	Not Found  status_codeN	websocket)r   r3   r6   r   r   updater   )r$   rG   rH   rI   r   child_scoperM   websocket_closes           r'   __call__zBaseRoute.__call__   s      "\\%0{EJJV}&,[cJugt444  v+-"0"2%eWd;;;[!kk%$/// 5 < 	0s6   A
B*B$$B*1B&2,B*B(B*&B*(B*)r)   r*   r+   r   r.   Tupler3   r   r-   r0   r   r   r   r   r   r   r9   r(   r'   r   r      s    $U $v||E5L'A $$3 $vzz $g $$% $' $ $$ $0E 0G 04 0D 0r(   r   c                   6   e Zd Zdddddedej
                  dej                  ej                  e      dej                  e   ded	dfd
Z	de
d	ej                  ee
f   fdZdedej                  d	efdZde
deded	dfdZdej                  d	efdZd	efdZy)RouteNTmethodsr   include_in_schemar[   rU   r   r   r   r   c                   |j                  d      sJ d       || _        || _        |t        |      n|| _        || _        |}t        |t        j                        r'|j                  }t        |t        j                        r't        j                  |      st        j                  |      rt        |      | _        |dg}n|| _        |d | _        nL|D ch c]  }|j!                          c}| _        d| j                  v r| j                  j#                  d       t%        |      \  | _        | _        | _        y c c}w )Nri    Routed paths must start with '/'GETHEAD)rs   r[   rU   rZ   r   r   r?   r@   rA   rB   rC   
isfunctionismethodrP   rO   r   upperr}   r   r   r   r\   )r$   r[   rU   r   r   r   endpoint_handlermethods           r'   r#   zRoute.__init__   s    s#G%GG	 *.,HX&D	!2#)9+<+<=/44 )9+<+<=./73C3CDT3U'1DH '  DH?DL9@AvFLLNADL$  (COPTCU@)4+@	 Bs   ErG   c                     |d   dk(  r| j                   j                  |d         }|r|j                         }|j                         D ]&  \  }}| j                  |   j                  |      ||<   ( t        |j                  di             }|j                  |       | j                  |d}| j                  r#|d   | j                  vrt        j                  |fS t        j                  |fS t        j                  i fS )Nr   r   r[   r   rU   r   r   )r   r   	groupdictr`   r\   convertdictgetr   rU   r   r3   r7   r8   r6   r$   rG   r   matched_paramsrd   re   r   r   s           r'   r   zRoute.matches   s    =F"OO))%-8E!&!2"0"6"6"8 TJC*.*?*?*D*L*LU*SN3'T"599]B#?@"">2+/==U<<E(O4<<$G ==+55 ::{22zz2~r(   _Route__namer   c                 $   t        |j                               }t        | j                  j                               }|| j                  k7  s||k7  rt	        ||      t        | j                  | j                  |      \  }}|rJ t        |d      S )Nr   r[   protocolrt   r!   r\   r   r   rg   r   r   )r$   r   r   seen_paramsexpected_paramsr[   remaining_paramss          r'   r   zRoute.url_path_for   s    +**,-d3388:;TYY+"@v{33!/d33["
 $#D622r(   rH   rI   c                 "  K   | j                   r`|d   | j                   vrOddj                  | j                         i}d|v rt        d|      t        dd|      } ||||       d {    y | j	                  |||       d {    y 7 !7 w)Nr   Allowr   rO   i  )r   headerszMethod Not Allowed)r   r   r   r   rO   )r$   rG   rH   rI   r   rM   s         r'   r   zRoute.handle	  s     <<E(O4<<?		$,, 78G~#WEE,(c7 5'4000((5'4000 10s$   A'B)B*BBBBotherc                     t        |t              xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rW   )r?   r   r[   rU   r   r$   r   s     r'   __eq__zRoute.__eq__  sR    ue$ .		UZZ'./. -		
r(   c                     | j                   j                  }t        | j                  xs g       }| j                  | j
                  }}| d|d|d|dS )N(path=, name=z
, methods=ro   )r&   r)   r   r   r[   r   )r$   
class_namer   r[   r   s        r'   __repr__zRoute.__repr__  sT    ^^,,
+,YY		dVD874(*WKqQQr(   )r)   r*   r+   r-   r.   CallableOptionalListboolr#   r   r   r3   r   r0   r   r   r   r   r   r   r   r9   r(   r'   r   r      s     6:%)"&"V"V //"V
 S!12"V ooc""V  "V 
"VHU v||E5L'A  33 3vzz 3g 31% 1' 1 1$ 1
FJJ 
4 
R# Rr(   r   c            	           e Zd Zdddedej
                  dej                  e   ddfdZdedej                  e
ef   fd	Zd
edej                  defdZdedededdfdZdej                  defdZdefdZy)WebSocketRouteNr   r[   rU   r   r   c                   |j                  d      sJ d       || _        || _        |t        |      n|| _        |}t        |t        j                        r'|j                  }t        |t        j                        r't        j                  |      st        j                  |      rt        |      | _        n|| _        t        |      \  | _        | _        | _        y )Nri   r   )rs   r[   rU   rZ   r   r?   r@   rA   rB   rC   r   r   rT   rO   r   r   r   r\   )r$   r[   rU   r   r   s        r'   r#   zWebSocketRoute.__init__&  s     s#G%GG	 *.,HX&D	#)9+<+<=/44 )9+<+<=./73C3CDT3U(2DH  DHCOPTCU@)4+@r(   rG   c                    |d   dk(  r| j                   j                  |d         }|r|j                         }|j                         D ]&  \  }}| j                  |   j                  |      ||<   ( t        |j                  di             }|j                  |       | j                  |d}t        j                  |fS t        j                  i fS )Nr   r   r[   r   r   )r   r   r   r`   r\   r   r   r   r   rU   r3   r8   r6   r   s           r'   r   zWebSocketRoute.matches:  s    =K'OO))%-8E!&!2"0"6"6"8 TJC*.*?*?*D*L*LU*SN3'T"599]B#?@"">2+/==Uzz;..zz2~r(   _WebSocketRoute__namer   c                 $   t        |j                               }t        | j                  j                               }|| j                  k7  s||k7  rt	        ||      t        | j                  | j                  |      \  }}|rJ t        |d      S )Nr   r   r   )r$   r   r   r   r   r[   r   s          r'   r   zWebSocketRoute.url_path_forG  s    +**,-d3388:;TYY+"@v{33!/d33["
 $#D;77r(   rH   rI   c                 F   K   | j                  |||       d {    y 7 wrW   rO   r   s       r'   r   zWebSocketRoute.handleT       hhugt,,,   !!r   c                     t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rW   )r?   r   r[   rU   r   s     r'   r   zWebSocketRoute.__eq__W  s;    un- 0		UZZ'0/	
r(   c                 h    | j                   j                   d| j                  d| j                  dS )Nr   r   ro   )r&   r)   r[   r   r$   s    r'   r   zWebSocketRoute.__repr__^  s/    ..))*&WTYYMQRSSr(   )r)   r*   r+   r-   r.   r   r   r#   r   r   r3   r   r0   r   r   r   r   r   r   r   r   r9   r(   r'   r   r   %  s    TXVV#)??V=C__S=QV	V(U v||E5L'A 83 8vzz 8g 8-% -' - -$ -
FJJ 
4 
T# Tr(   r   c                      e Zd Z	 	 	 ddddedej
                  e   dej
                  ej                  e      dej
                  e   dej
                  ej                  e	      ddfd	Z
edej                  e   fd
       Zdedej                  eef   fdZdedej$                  defdZdedededdfdZdej$                  defdZdefdZy)MountN)
middlewarer[   rO   routesr   r   r   c                   |dk(  s|j                  d      sJ d       |	|J d       |j                  d      | _        ||| _        nt	        |      | _        | j                  | _        |,t        |      D ]  \  }} |dd| j
                  i|| _          || _        t        | j                  dz         \  | _	        | _
        | _        y )	Nrk   ri   r   z0Either 'app=...', or 'routes=' must be specified)r   rO   z/{path:path}r9   )rs   rstripr[   	_base_appRouterrO   reversedr   r   r   r   r\   )r$   r[   rO   r   r   r   clsoptionss           r'   r#   zMount.__init__c  s     rzT__S1U3UUOv1	>=	> KK$	?&)DN#62DN>>! ( 4 8W74887w78	COII&D
@)4+@r(   c                 0    t        | j                  dg       S Nr   )getattrr   r   s    r'   r   zMount.routes~  s    t~~x44r(   rG   c                 <   |d   dv r|d   }| j                   j                  |      }|r|j                         }|j                         D ]&  \  }}| j                  |   j                  |      ||<   ( d|j                  d      z   }|d t        |        }t        |j                  di             }	|	j                  |       |j                  dd      }
|	|j                  d|
      |
|z   || j                  d	}t        j                  |fS t        j                  i fS )
Nr   r   r   r[   ri   r   	root_pathrk   app_root_path)r   r   r   r[   rU   )r   r   r   r`   r\   r   rc   r   r   r   r   rO   r3   r8   r6   )r$   rG   r[   r   r   rd   re   remaining_pathmatched_pathr   r   r   s               r'   r   zMount.matches  s   =11=DOO))$/E!&!2"0"6"6"8 TJC*.*?*?*D*L*LU*SN3'T!$~'9'9&'A!A#$:s>':&:;"599]B#?@"">2!IIk26	#.%*YY	%J!*\!9* $ zz;..zz2~r(   _Mount__namer   c                    | j                   \|| j                   k(  rMd|v rI|d   j                  d      |d<   t        | j                  | j                  |      \  }}|st        |      S | j                   |j                  | j                   dz         r| j                   |}n|t        | j                         dz   d  }|j                  d      }d|d<   t        | j                  | j                  |      \  }}|||d<   | j                  xs g D ]I  }	  |j                  |fi |}	t        |j                  d      t        |	      z   |	j                        c S  t        ||      # t        $ r Y cw xY w)Nr[   ri   )r[   rl   r4   rk   r   )r   rx   rg   r   r\   r   rs   r   r   r   r   r   r-   r   r   )
r$   r   r   r[   r   remaining_name
path_kwargpath_prefixrouteurls
             r'   r   zMount.url_path_for  s   99 Vtyy%8V{=R"-f"5"<"<S"AK%3  $"7"7&"D" $D))YY&"3"3DIIO"Dyy !' "(DII(:(<!=$0J"$K,:  $"7"7-)K) %+5 (* ,%,,^P?OPC"(//4s3x?#,,  6;// $ s   AE&&	E21E2rH   rI   c                 F   K   | j                  |||       d {    y 7 wrW   r   r   s       r'   r   zMount.handle  r   r   r   c                     t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rW   )r?   r   r[   rO   r   s     r'   r   zMount.__eq__  s;    ue$ &		UZZ'&EII%	
r(   c                     | j                   j                  }| j                  xs d}| d| j                  d|d| j                  dS )Nrk   r   r   , app=ro   )r&   r)   r   r[   rO   r$   r   r   s      r'   r   zMount.__repr__  F    ^^,,
yyBVDII=xvdhh\QRSSr(   )NNN)r)   r*   r+   r-   r.   r   r   Sequencer   r   r#   propertyr   r   r   r   r3   r   r0   r   r   r   r   r   r   r   r   r9   r(   r'   r   r   b  s7    )->B%)
 DH

 __W%
 	 :;	

 ooc"
 OOFOOJ$?@
 

6 5I. 5 5U v||E5L'A .03 0vzz 0g 0B-% -' - -$ -
FJJ 
4 
T# Tr(   r   c            	          e Zd Z	 ddededej                  e   ddfdZedej                  e
   fd       Zdedej                  eef   fd	Zd
edej                   defdZdedededdfdZdej                   defdZdefdZy)HostNhostrO   r   r   c                     |j                  d      rJ d       || _        || _        || _        t	        |      \  | _        | _        | _        y )Nri   zHost must not start with '/')rs   r  rO   r   r   
host_regexhost_formatr\   )r$   r  rO   r   s       r'   r#   zHost.__init__  sH     ??3'G)GG		COPTCU@)4+@r(   c                 0    t        | j                  dg       S r   )r   rO   r   s    r'   r   zHost.routes  s    txx2..r(   rG   c                    |d   dv rt        |      }|j                  dd      j                  d      d   }| j                  j	                  |      }|r|j                         }|j                         D ]&  \  }}| j                  |   j                  |      ||<   ( t        |j                  di             }|j                  |       || j                  d	}	t        j                  |	fS t        j                  i fS )
Nr   r   rG   r  rk   rl   r   r   )r   rU   )r
   r   r   r  r   r   r`   r\   r   r   r   rO   r3   r8   r6   )
r$   rG   r   r  r   r   rd   re   r   r   s
             r'   r   zHost.matches  s    =11E*G;;vr*005a8DOO))$/E!&!2"0"6"6"8 TJC*.*?*?*D*L*LU*SN3'T"599]B#?@"">2.9txxPzz;..zz2~r(   _Host__namer   c                    | j                   W|| j                   k(  rHd|v rD|j                  d      }t        | j                  | j                  |      \  }}|st        ||      S | j                   |j                  | j                   dz         r| j                   |}n|t        | j                         dz   d  }t        | j                  | j                  |      \  }}| j                  xs g D ]8  }	  |j                  |fi |}t        t        |      |j                  |      c S  t        ||      # t        $ r Y Rw xY w)Nr[   )r[   r  rl   r4   )r[   r   r  )r   rc   rg   r  r\   r   rs   r   r   r   r-   r   r   )	r$   r  r   r[   r  r   r   r   r   s	            r'   r   zHost.url_path_for  s?   99 Vtyy%8V{=R??6*D%3  $"7"7&"D" $Dt44YY&"3"3DIIO"Dyy !' "(DII(:(<!=%3  $"7"7&"D" * ,%,,^P?OPC"C3<<dSS 6;// $ s   03D33	D?>D?rH   rI   c                 F   K   | j                  |||       d {    y 7 wrW   r   r   s       r'   r   zHost.handle  r   r   r   c                     t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rW   )r?   r
  r  rO   r   s     r'   r   zHost.__eq__  s;    ud# &		UZZ'&EII%	
r(   c                     | j                   j                  }| j                  xs d}| d| j                  d|d| j                  dS )Nrk   z(host=r   r  ro   )r&   r)   r   r  rO   r  s      r'   r   zHost.__repr__  r  r(   rW   )r)   r*   r+   r-   r   r.   r   r#   r  r   r   r   r   r   r3   r   r0   r   r   r   r   r   r   r   r   r9   r(   r'   r
  r
    s    DHVV%V-3__S-AV	V /I. / /U v||E5L'A 03 0vzz 0g 06-% -' - -$ -
FJJ 
4 
T# Tr(   r
  _Tc            	           e Zd Zdej                  e   fdZdefdZdej                  ej                  e
      dej                  e
   dej                  ej                     dej                  e   fdZy	)
_AsyncLiftContextManagercmc                     || _         y rW   )_cm)r$   r  s     r'   r#   z!_AsyncLiftContextManager.__init__  s	    r(   r   c                 >   K   | j                   j                         S wrW   )r  	__enter__r   s    r'   
__aenter__z#_AsyncLiftContextManager.__aenter__  s     xx!!##s   exc_type	exc_value	tracebackc                 D   K   | j                   j                  |||      S wrW   )r  __exit__)r$   r   r!  r"  s       r'   	__aexit__z"_AsyncLiftContextManager.__aexit__  s!      xx  9i@@s    N)r)   r*   r+   r.   ContextManagerr  r#   r  r   TypeBaseExceptiontypesTracebackTyper   r%  r9   r(   r'   r  r    s    6004 $" $A//&++m"<=A ??=1A ??5#6#67	A
 
	Ar(   r  lifespan_contextc                     t        j                  |       t        j                        dt        j
                  dt        ffd       }|S )NrO   r   c                 &    t         |             S rW   )r  )rO   cmgrs    r'   wrapperz+_wrap_gen_lifespan_context.<locals>.wrapper*  s    'S	22r(   )
contextlibcontextmanagerr@   wrapsr.   r0   r  )r+  r/  r.  s     @r'   _wrap_gen_lifespan_contextr3  %  sK     $$%56D__T3VZZ 3$< 3 3 Nr(   c                   @    e Zd Zd
dZddZdeddfdZdededefd	Zy)_DefaultLifespanc                     || _         y rW   )_router)r$   routers     r'   r#   z_DefaultLifespan.__init__2  s	    r(   r   Nc                 T   K   | j                   j                          d {    y 7 wrW   )r7  startupr   s    r'   r  z_DefaultLifespan.__aenter__5  s     ll""$$$   (&(exc_infoc                 T   K   | j                   j                          d {    y 7 wrW   )r7  shutdown)r$   r<  s     r'   r%  z_DefaultLifespan.__aexit__8  s     ll##%%%r;  r$   rO   c                     | S rW   r9   )r$   rO   s     r'   r   z_DefaultLifespan.__call__;  s    r(   )r8  r   r   N)	r)   r*   r+   r#   r  objectr%  r  r   r9   r(   r'   r5  r5  1  s9    %& &D &r  2 r(   r5  c                   L   e Zd Z	 	 	 	 	 	 d(dej                  ej
                  e      dedej                  e   dej                  ej
                  ej                        dej                  ej
                  ej                        dej                  e
ej                        ddfd	Zd
edededdfdZdedej                  defdZd)dZd)dZd
edededdfdZd
edededdfdZdej                  defdZ	 d*dededej                  e   ddfdZ	 d*dededej                  e   ddfdZ	 	 	 d+dedej                  dej                  ej6                  e      dej                  e   deddfd Z	 d*dedej                  dej                  e   ddfd!Z	 	 	 d+dedej                  ej6                  e      dej                  e   dedej                  f
d"Z	 d*dedej                  e   dej                  fd#Zd$ed%ej                  ddfd&Z d$edej                  fd'Z!y),r   Nr   redirect_slashesdefault
on_startupon_shutdownlifespanr   c                 $   |g n
t        |      | _        || _        || j                  n|| _        |g n
t        |      | _        |g n
t        |      | _        |s|rt        j                  dt               |t        |       | _        y t        j                  |      r+t        j                  dt               t        |      | _        y t        j                  |      r+t        j                  dt               t!        |      | _        y || _        y )NzThe on_startup and on_shutdown parameters are deprecated, and they will be removed on version 1.0. Use the lifespan parameter instead. See more about it on https://www.starlette.io/lifespan/.zjasync generator function lifespans are deprecated, use an @contextlib.asynccontextmanager function insteadzdgenerator function lifespans are deprecated, use an @contextlib.asynccontextmanager function instead)r    r   rC  	not_foundrD  rE  rF  r<   r=   r>   r5  r+  rC   isasyncgenfunctionr   isgeneratorfunctionr3  )r$   r   rC  rD  rE  rF  rG  s          r'   r#   zRouter.__init__@  s     #NbV 0)0t~~g * 2"Z8H!,!42${:KMMK #	 .>t.DD!''1MMJ"
 %8%D! ((2MMJ"
 %?%D! %-D!r(   rG   rH   rI   c                    K   |d   dk(  rt               } ||||       d {    y d|v rt        d      t        dd      } ||||       d {    y 7 57 w)Nr   r   rO   r   r   r   )r   r   r   )r$   rG   rH   rI   r   rM   s         r'   rI  zRouter.not_foundq  sl     =K',.O!%$777
 E>C00(#FHugt,,, 8 	-s!    AA/AAAA_Router__namer   c                     | j                   D ]  }	  |j                  |fi |c S  t        ||      # t        $ r Y 1w xY wrW   )r   r   r   )r$   rM  r   r   s       r'   r   zRouter.url_path_for  sU    [[ 	E)u))&@K@@	
 6;//   s   3	??c                 v   K   | j                   D ]$  }t        |      r |        d{     |        & y7 w)z7
        Run any `.on_startup` event handlers.
        N)rE  r   r$   handlers     r'   r:  zRouter.startup  s4       	G )i			   %979c                 v   K   | j                   D ]$  }t        |      r |        d{     |        & y7 w)z8
        Run any `.on_shutdown` event handlers.
        N)rF  r   rP  s     r'   r>  zRouter.shutdown  s6      '' 	G )i			rR  c                 6  K   d}|j                  d      } |        d{    	 | j                  |      4 d{   }|#d|vrt        d      |d   j                  |        |ddi       d{    d} |        d{    ddd      d{     |dd	i       d{    y7 7 q7 <7 -7 # 1 d{  7  sw Y   /xY w7 $# t        $ rA t        j                         }|r |d
|d       d{  7     |d|d       d{  7    w xY ww)z{
        Handle ASGI lifespan messages, which allows us to manage application
        startup and shutdown events.
        FrO   Nstatez:The server does not support "state" in the lifespan scope.r   zlifespan.startup.completeTzlifespan.shutdown.completezlifespan.shutdown.failed)r   messagezlifespan.startup.failed)r   r+  RuntimeErrorr   r(  r"  
format_exc)r$   rG   rH   rI   startedrO   maybe_stateexc_texts           r'   rG  zRouter.lifespan  s<    
 ))E*i	?,,S1 	  	 [*e+*X  'N))+6F$?@AAAi	  	 $  <=>>>) 		  B	  	  	  	 $ ?  	 ++-H$>8TUUU  $=(STTT	s   DB+DC B-C 3B52B/3B5B1B5C B3C D%C
&D-C /B51B53C 5C;B><CC 
D-D9C<:DDDDc                   K   |d   dv sJ d|vr| |d<   |d   dk(  r| j                  |||       d{    yd}| j                  D ]r  }|j                  |      \  }}|t        j                  k(  r.|j                  |       |j                  |||       d{     y|t        j                  k(  sl|o|}|}t |-|j                         |j                  |||       d{    y|d   dk(  r| j                  r|d   dk7  rt        |      }	|d   j                  d      r|	d   j                  d      |	d<   n|	d   dz   |	d<   | j                  D ]^  }|j                  |	      \  }}|t        j                  k7  s+t        |		      }
t        t        |
      
      } ||||       d{     y | j!                  |||       d{    y7 7 =7 7 +7 w)z;
        The main entry point to the Router class.
        r   )r   r   rG  r8  rG  Nr   r[   ri   r  )r   )rG  r   r   r3   r8   r   r   r7   rC  r   endswithr   r6   r	   r   r-   rD  )r$   rG   rH   rI   rA   r   r   r   partial_scoperedirect_scoperedirect_urlrM   s               r'   r   zRouter.__call__  s     V} AAA5 "E(O=J&--w555[[ 
	,E "'u!5E;

"[)ll5'4888%--'GO +
	,  LL'..666=F"t'<'<vRUAU!%[NV}%%c*)7)?)F)Fs)Kv&)7)?#)Ev& %*]]>%B"{EJJ&#&^#<L/C4EFH"5'4888 ll5'4000Q 6 9 7 9 	1sk   1GGA$GGG3G6/G%G&BG .G.G/GGGGGGGr   c                 X    t        |t              xr | j                  |j                  k(  S rW   )r?   r   r   r   s     r'   r   zRouter.__eq__  s!    %(HT[[ELL-HHr(   r[   rO   r   c                 V    t        |||      }| j                  j                  |       y N)rO   r   )r   r   append)r$   r[   rO   r   r   s        r'   mountzRouter.mount  s$     d$/5!r(   r  c                 V    t        |||      }| j                  j                  |       y rc  )r
  r   rd  )r$   r  rO   r   r   s        r'   r  zRouter.host  s$     Ts.5!r(   rU   r   r   c                 Z    t        |||||      }| j                  j                  |       y )N)rU   r   r   r   )r   r   rd  )r$   r[   rU   r   r   r   r   s          r'   	add_routezRouter.add_route  s1     /
 	5!r(   c                 V    t        |||      }| j                  j                  |       y )N)rU   r   )r   r   rd  )r$   r[   rU   r   r   s        r'   add_websocket_routezRouter.add_websocket_route  s$     thTB5!r(   c                      t        j                  dt               dt        j                  dt        j                  f fd}|S )z
        We no longer document this decorator style API, and its usage is discouraged.
        Instead you should use the following approach:

        >>> routes = [Route(path, endpoint=...), ...]
        >>> app = Starlette(routes=routes)
        zThe `route` decorator is deprecated, and will be removed in version 1.0.0.Refer to https://www.starlette.io/routing/#http-routing for the recommended approach.rB   r   c                 4    j                  |        | S )Nr   )rh  )rB   r   r   r   r[   r$   s    r'   	decoratorzRouter.route.<locals>.decorator'  s*    NN"3   Kr(   r<   r=   r>   r.   r   )r$   r[   r   r   r   rm  s   ````` r'   r   zRouter.route  sB     	d	
	FOO 	 	 	 r(   c                      t        j                  dt               dt        j                  dt        j                  f fd}|S )a  
        We no longer document this decorator style API, and its usage is discouraged.
        Instead you should use the following approach:

        >>> routes = [WebSocketRoute(path, endpoint=...), ...]
        >>> app = Starlette(routes=routes)
        zThe `websocket_route` decorator is deprecated, and will be removed in version 1.0.0. Refer to https://www.starlette.io/routing/#websocket-routing for the recommended approach.rB   r   c                 0    j                  |        | S )Nr   )rj  )rB   r   r[   r$   s    r'   rm  z)Router.websocket_route.<locals>.decoratorC  s    $$T4d$;Kr(   rn  )r$   r[   r   rm  s   ``` r'   websocket_routezRouter.websocket_route3  s=     	`	
	FOO 	 	 r(   
event_typerB   c                     |dv sJ |dk(  r| j                   j                  |       y | j                  j                  |       y )N)r:  r>  r:  )rE  rd  rF  )r$   rr  rB   s      r'   add_event_handlerzRouter.add_event_handlerI  s>     444"OO""4(##D)r(   c                      t        j                  dt               dt        j                  dt        j                  f fd}|S )NzThe `on_event` decorator is deprecated, and will be removed in version 1.0.0. Refer to https://www.starlette.io/lifespan/ for recommended approach.rB   r   c                 ,    j                  |        | S rW   )rt  )rB   rr  r$   s    r'   rm  z"Router.on_event.<locals>.decoratorZ  s    "":t4Kr(   rn  )r$   rr  rm  s   `` r'   on_eventzRouter.on_eventS  s;    T	
	FOO 	 	 r(   )NTNNNNr@  rW   )NNT)"r)   r*   r+   r.   r   r  r   r   r   r   r   r0   r#   r   r   r   rI  r-   r   r   r:  r>  rG  r   r   re  r  r   rh  rj  r   rq  rt  rw  r9   r(   r'   r   r   ?  s5    ?C!%,0HLIM ;?/-	 :;/- /- )	/-
 OOFOOFOO$DE/- __V__V__%EF/- //(6::"67/- 
/-b-U -W -D -T -03 0vzz 0g 0?E ?G ?4 ?D ?:21E 21G 214 21D 21hIFJJ I4 I EI""%"-3__S-A"	" EI""%"-3__S-A"	" 6:%)"&"" //" S!12	"
 ooc""  " 
"$ RV""#)??":@//#:N"	" 6:%)"& S!12 ooc"	
   
B 7;%s3	,**%+__*	*3 6?? r(   r   )Hr0  r@   rC   ry   r"  r)  r.   r<   r   enumr   starlette._utilsr   starlette.concurrencyr   starlette.convertorsr   r   starlette.datastructuresr	   r
   r   starlette.exceptionsr   starlette.middlewarer   starlette.requestsr   starlette.responsesr   r   starlette.typesr   r   r   r   r   starlette.websocketsr   r   	Exceptionr   r3   r0   r   rE   r   rP   rT   r-   rZ   r/   r   r   rg   r   ru   Patternr   r   r   r   r   r
  TypeVarr  AsyncContextManagerr  	Generatorr3  r5  r   r9   r(   r'   <module>r     s0      	     *  . 3 ; : : . + & C C C :V9 VD ,

 ,t ,6?? w $
FOO 
 
'v '3 '
kk#y.1 S#X& \\#t)	 bjjOP7A
7A\\&..#v{{3	>'BBC7At0 0<[RI [R|:TY :TzeTI eTPET9 ETP V^^DAv99"= A 	oovzzlF4D4D&DE	__fjj\6#=#==>	 _ _r(   