U
    e҉                     @  s@  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m
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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#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 de.Z/G dd deZ0dddddZ1dddddZ2ddddd Z3d!d"d#d$d%Z4d"d&d'd(d)d*d+Z5e6d,Z7d"d-d.d/d0Z8G d1d2 d2Z9G d3d4 d4e9Z:G d5d6 d6e9Z;G d7d8 d8e9Z<G d9d: d:e9Z=e>d;Z?G d<d= d=ej@e? ZAd>d?d@dAdBZBG dCdD dDZCG dEdF dFZDdS )G    )annotationsN)asynccontextmanager)Enum)wrap_app_handling_exceptions)get_route_pathis_async_callable)run_in_threadpool)CONVERTOR_TYPES	Convertor)URLHeadersURLPath)HTTPException)
Middleware)Request)PlainTextResponseRedirectResponseResponse)ASGIAppLifespanReceiveScopeSend)	WebSocketWebSocketClosec                      s*   e Zd ZdZdddd fddZ  ZS )NoMatchFoundz}
    Raised by `.url_for(name, **path_params)` and `.url_path_for(name, **path_params)`
    if no matching route exists.
    strzdict[str, typing.Any]Nonenamepath_paramsreturnc                   s0   d t| }t d| d| d d S )N, zNo route exists for name "z" and params "z".)joinlistkeyssuper__init__)selfr   r    params	__class__ 5/tmp/pip-unpacked-wheel-2mv5qoba/starlette/routing.pyr'   !   s    zNoMatchFound.__init__)__name__
__module____qualname____doc__r'   __classcell__r,   r,   r*   r-   r      s   r   c                   @  s   e Zd ZdZdZdZdS )Matchr         N)r.   r/   r0   NONEPARTIALFULLr,   r,   r,   r-   r3   &   s   r3   
typing.Anybool)objr!   c                 C  s*   t dt t| tjr | j} qt| 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;   r,   r,   r-   iscoroutinefunction_or_partial,   s    rE   zNtyping.Callable[[Request], typing.Union[typing.Awaitable[Response], Response]]r   rB   r!   c                   s   ddddd fdd}|S )zi
    Takes a function or coroutine `func(request) -> response`,
    and returns an ASGI application.
    r   r   r   r   scopereceivesendr!   c                   sB   t | || ddddd fdd}t| | ||I d H  d S )Nr   r   r   r   rG   c                   s>   t  r I d H }nt I d H }|| ||I d H  d S N)r   r   )rH   rI   rJ   response)rB   requestr,   r-   appH   s    z*request_response.<locals>.app.<locals>.app)r   r   rH   rI   rJ   rN   rB   )rM   r-   rN   E   s    zrequest_response.<locals>.appr,   rB   rN   r,   rP   r-   request_response;   s    
rR   4typing.Callable[[WebSocket], typing.Awaitable[None]]c                   s   ddddd fdd}|S )zM
    Takes a coroutine `func(session)`, and returns an ASGI application.
    r   r   r   r   rG   c                   sD   t | ||d ddddd fdd}t| | ||I d H  d S )	N)rI   rJ   r   r   r   r   rG   c                   s    I d H  d S rK   r,   )rH   rI   rJ   )rB   sessionr,   r-   rN   _   s    z+websocket_session.<locals>.app.<locals>.app)r   r   rO   rP   )rT   r-   rN   \   s    zwebsocket_session.<locals>.appr,   rQ   r,   rP   r-   websocket_sessionT   s    rU    typing.Callable[..., typing.Any]r   )endpointr!   c                 C  s"   t | st | r| jS | jjS rK   )rC   	isroutineisclassr.   r+   )rW   r,   r,   r-   get_nameg   s    rZ   z dict[str, Convertor[typing.Any]]zdict[str, str]ztuple[str, dict[str, str]])pathparam_convertorsr    r!   c                 C  s^   t | D ]H\}}d| d | kr|| }||}| d| d |} || q| |fS )N{})r$   itemsZ	to_stringreplacepop)r[   r\   r    keyvalue	convertorr,   r,   r-   replace_paramsm   s    
re   z4{([a-zA-Z_][a-zA-Z0-9_]*)(:[a-zA-Z_][a-zA-Z0-9_]*)?}zAtuple[typing.Pattern[str], str, dict[str, Convertor[typing.Any]]])r[   r!   c                 C  s  |  d }d}d}t }d}i }t| D ]}|d\}}	|	d}	|	tks`td|	 dt|	 }
|t	| ||
  7 }|d	| d
|
j d7 }|| ||
  7 }|d| 7 }||kr|| |
||< | }q,|r"dt|}t|dkrdnd}td| d| d|  |rR| |d dd }|t	|d 7 }n|t	| |d d 7 }|| |d 7 }t|||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	   AssertionErrorreescapestartregexaddendr#   sortedlen
ValueErrorsplitcompile)r[   Zis_host
path_regexpath_formatZduplicated_paramsidxr\   match
param_nameZconvertor_typerd   namesZendinghostnamer,   r,   r-   compile_path   s@    



r   c                   @  sV   e Zd ZdddddZdddd	d
dZdddddddZdddddddZdS )	BaseRouter   tuple[Match, Scope]rH   r!   c                 C  s
   t  d S rK   NotImplementedError)r(   rH   r,   r,   r-   matches   s    zBaseRoute.matchesr   r9   r   r   c                K  s
   t  d S rK   r   )r(   r   r    r,   r,   r-   url_path_for   s    zBaseRoute.url_path_forr   r   r   rG   c                   s
   t  d S rK   r   r(   rH   rI   rJ   r,   r,   r-   handle   s    zBaseRoute.handlec                   s   |  |\}}|tjkrl|d dkrDtddd}||||I dH  n$|d dkrht }||||I dH  dS || | |||I dH  dS )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(   rH   rI   rJ   r   child_scoperL   websocket_closer,   r,   r-   __call__   s    

zBaseRoute.__call__N)r.   r/   r0   r   r   r   r   r,   r,   r,   r-   r      s   r   c                	   @  s   e Zd Zddddddddddd	d
dddZdddddZddddddZdddd
dddZdddddZdd d!d"ZdS )#RouteNT)methodsr   include_in_schema
middlewarer   rV   list[str] | None
str | Noner:   "typing.Sequence[Middleware] | Noner   )r[   rW   r   r   r   r   r!   c                C  s  | dstd|| _|| _|d kr.t|n|| _|| _|}t|tj	rR|j
}q>t|sft|rt|| _|d krdg}n|| _|d k	rt|D ] \}}	}
||	d| ji|
| _q|d krd | _n&dd |D | _d| jkr| jd t|\| _| _| _d S )Nrf    Routed paths must start with '/'GETrN   c                 S  s   h | ]}|  qS r,   )upper).0methodr,   r,   r-   	<setcomp>   s     z!Route.__init__.<locals>.<setcomp>HEAD)rp   rv   r[   rW   rZ   r   r   r?   r@   rA   rB   rC   
isfunctionismethodrR   rN   reversedr   r{   r   r   r   r\   )r(   r[   rW   r   r   r   r   endpoint_handlerclsargskwargsr,   r,   r-   r'      s,    


zRoute.__init__r   r   r   c           	      C  s   |d dkrt |}| j|}|r| }| D ]\}}| j| |||< q4t|di }|	| | j
|d}| jr|d | jkrtj|fS tj|fS tji fS )Nr   r   r    rW   r    r   )r   r   r   	groupdictr_   r\   convertdictgetr   rW   r   r3   r7   r8   r6   	r(   rH   
route_pathr   matched_paramsrb   rc   r    r   r,   r,   r-   r     s    


zRoute.matchesr9   r   r   c                K  s^   t | }t | j }|| jks,||kr6t||t| j| j|\}}|rRtt|ddS )Nr   r[   protocol	rq   r%   r\   r   r   re   r   rv   r   r(   r   r    Zseen_paramsZexpected_paramsr[   remaining_paramsr,   r,   r-   r     s    
  zRoute.url_path_forr   r   rG   c                   st   | j r\|d | j kr\dd| j i}d|kr:td|dntdd|d}||||I d H  n| |||I d H  d S )Nr   ZAllowr"   rN   i  )r   headerszMethod Not Allowed)r   r#   r   r   rN   )r(   rH   rI   rJ   r   rL   r,   r,   r-   r      s      zRoute.handleotherr!   c                 C  s.   t |to,| j|jko,| j|jko,| j|jkS rK   )r?   r   r[   rW   r   r(   r   r,   r,   r-   __eq__-  s    



zRoute.__eq__r!   c                 C  s@   | j j}t| jpg }| j| j }}| d|d|d|dS )N(path=, name=z
, methods=rl   )r+   r.   r}   r   r[   r   )r(   
class_namer   r[   r   r,   r,   r-   __repr__5  s    zRoute.__repr__	r.   r/   r0   r'   r   r   r   r   r   r,   r,   r,   r-   r      s   )r   c                   @  s~   e Zd Zdddddddddd	d
ZdddddZddddddZdddddddZdddddZdddd ZdS )!WebSocketRouteN)r   r   r   rV   r   r   r   )r[   rW   r   r   r!   c          	      C  s   | dstd|| _|| _|d kr.t|n|| _|}t|tjrL|j	}q8t
|s`t
|rlt|| _n|| _|d k	rt|D ] \}}}||d| ji|| _qt|\| _| _| _d S )Nrf   r   rN   )rp   rv   r[   rW   rZ   r   r?   r@   rA   rB   rC   r   r   rU   rN   r   r   r   r   r\   )	r(   r[   rW   r   r   r   r   r   r   r,   r,   r-   r'   =  s    zWebSocketRoute.__init__r   r   r   c           	      C  s   |d dkrt |}| j|}|r| }| D ]\}}| j| |||< q4t|di }|	| | 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   rW   r3   r8   r6   r   r,   r,   r-   r   Z  s    

zWebSocketRoute.matchesr9   r   r   c                K  s^   t | }t | j }|| jks,||kr6t||t| j| j|\}}|rRtt|ddS )Nr   r   r   r   r,   r,   r-   r   i  s    
  zWebSocketRoute.url_path_forr   r   rG   c                   s   |  |||I d H  d S rK   rN   r   r,   r,   r-   r   v  s    zWebSocketRoute.handler:   r   c                 C  s"   t |to | j|jko | j|jkS rK   )r?   r   r[   rW   r   r,   r,   r-   r   y  s
    


zWebSocketRoute.__eq__r   c                 C  s   | j j d| jd| jdS )Nr   r   rl   )r+   r.   r[   r   r(   r,   r,   r-   r     s    zWebSocketRoute.__repr__r   r,   r,   r,   r-   r   <  s   r   c                	   @  s   e Zd Zd%ddddddddd	d
dZeddddZdddddZddddddZdddddddZddd d!d"Z	ddd#d$Z
dS )&MountNr   r   ASGIApp | None!typing.Sequence[BaseRoute] | Noner   r   r   )r[   rN   routesr   r   r!   c          	      C  s   |dks| dstd|d k	s2|d k	s2td|d| _|d k	rN|| _nt|d| _| j| _|d k	rt|D ] \}}}||d| ji|| _qr|| _t	| jd \| _
| _| _d S )Nrh   rf   r   z0Either 'app=...', or 'routes=' must be specified)r   rN   z/{path:path})rp   rv   rstripr[   	_base_appRouterrN   r   r   r   r   r   r\   )	r(   r[   rN   r   r   r   r   r   r   r,   r,   r-   r'     s&    	zMount.__init__list[BaseRoute]r   c                 C  s   t | jdg S Nr   )getattrr   r   r,   r,   r-   r     s    zMount.routesr   ztyping.Tuple[Match, Scope]r   c                 C  s   |d dkr| dd}t|}| j|}|r| }| D ]\}}| j| |||< q@d|d }|d t	|  }	t
| di }
|
| |
| d|||	 | jd	}tj|fS tji fS )
Nr   r   r   	root_pathrh   rf   r[   r    app_root_path)r    r   r   rW   )r   r   r   r   r   r_   r\   r   ra   r~   r   r   rN   r3   r8   r6   )r(   rH   r   r   r   r   rb   rc   Zremaining_pathZmatched_pathr    r   r,   r,   r-   r     s&    


zMount.matchesr9   r   r   c          
   	   K  s0  | j d k	rR|| j krRd|krR|d d|d< t| j| j|\}}|sPt|dS n| j d ksn|| j d r"| j d kr~|}n|t| j d d  }|d}d|d< t| j| j|\}}|d k	r||d< | j	pg D ]L}z0|j
|f|}	t|dt|	 |	jdW   S  tk
r   Y qX qt||d S )Nr[   rf   )r[   ri   r4   rh   r   )r   ru   re   r   r\   r   rp   r~   r   r   r   r   r   r   r   )
r(   r   r    r[   r   remaining_nameZ
path_kwargZpath_prefixrouteurlr,   r,   r-   r     s@      

   zMount.url_path_forr   r   rG   c                   s   |  |||I d H  d S rK   r   r   r,   r,   r-   r     s    zMount.handler:   r   c                 C  s"   t |to | j|jko | j|jkS rK   )r?   r   r[   rN   r   r,   r,   r-   r     s
    


zMount.__eq__c                 C  s2   | j j}| jpd}| d| jd|d| jdS )Nrh   r   r   , app=rl   )r+   r.   r   r[   rN   r(   r   r   r,   r,   r-   r     s    
zMount.__repr__)NNNr.   r/   r0   r'   propertyr   r   r   r   r   r   r,   r,   r,   r-   r     s      !!r   c                   @  s   e Zd Zd"dddddddZed	d
ddZdddddZddddddZdddddddZdddddZ	dd
d d!Z
dS )#HostNr   r   r   r   hostrN   r   r!   c                 C  s<   | drtd|| _|| _|| _t|\| _| _| _d S )Nrf   zHost must not start with '/')	rp   rv   r   rN   r   r   
host_regexhost_formatr\   )r(   r   rN   r   r,   r,   r-   r'     s
    zHost.__init__r   r   c                 C  s   t | jdg S r   )r   rN   r   r,   r,   r-   r     s    zHost.routesr   r   r   c           
      C  s   |d dkrt |d}|dddd }| j|}|r| }| D ]\}}| j| |||< qLt	|di }|
| || jd	}	tj|	fS tji fS )
Nr   r   rH   r   rh   ri   r   r    )r    rW   )r   r   r   r   r   r   r_   r\   r   r   r   rN   r3   r8   r6   )
r(   rH   r   r   r   r   rb   rc   r    r   r,   r,   r-   r     s    


zHost.matchesr9   r   r   c          	   	   K  s   | j d k	rL|| j krLd|krL|d}t| j| j|\}}|st||dS n| j d ksf|| j d r| j d krv|}n|t| j d d  }t| j| j|\}}| jpg D ]B}z(|j	|f|}tt
||j|dW   S  tk
r   Y qX qt||d S )Nr[   )r[   r   ri   r4   )r[   r   r   )r   ra   re   r   r\   r   rp   r~   r   r   r   r   r   )	r(   r   r    r[   r   r   r   r   r   r,   r,   r-   r     s2    
  
  zHost.url_path_forr   r   rG   c                   s   |  |||I d H  d S rK   r   r   r,   r,   r-   r   ,  s    zHost.handler:   r   c                 C  s"   t |to | j|jko | j|jkS rK   )r?   r   r   rN   r   r,   r,   r-   r   /  s
    


zHost.__eq__c                 C  s2   | j j}| jpd}| d| jd|d| jdS )Nrh   z(host=r   r   rl   )r+   r.   r   r   rN   r   r,   r,   r-   r   6  s    
zHost.__repr__)Nr   r,   r,   r,   r-   r     s   r   _Tc                   @  s<   e Zd ZddddZddddZd	d
dddddZdS )_AsyncLiftContextManagerztyping.ContextManager[_T])cmc                 C  s
   || _ d S rK   )_cm)r(   r   r,   r,   r-   r'   @  s    z!_AsyncLiftContextManager.__init__r   r   c                   s
   | j  S rK   )r   	__enter__r   r,   r,   r-   
__aenter__C  s    z#_AsyncLiftContextManager.__aenter__ztype[BaseException] | NonezBaseException | Noneztypes.TracebackType | Nonezbool | None)exc_type	exc_value	tracebackr!   c                   s   | j |||S rK   )r   __exit__)r(   r   r   r   r,   r,   r-   	__aexit__F  s    z"_AsyncLiftContextManager.__aexit__N)r.   r/   r0   r'   r   r   r,   r,   r,   r-   r   ?  s   r   zStyping.Callable[[typing.Any], typing.Generator[typing.Any, typing.Any, typing.Any]]zEtyping.Callable[[typing.Any], typing.AsyncContextManager[typing.Any]])lifespan_contextr!   c                   s,   t |  t ddd fdd}|S )Nr9   z$_AsyncLiftContextManager[typing.Any])rN   r!   c                   s   t  | S rK   )r   r   Zcmgrr,   r-   wrapperV  s    z+_wrap_gen_lifespan_context.<locals>.wrapper)
contextlibcontextmanagerr@   wraps)r   r   r,   r   r-   _wrap_gen_lifespan_contextO  s    
r   c                   @  sJ   e Zd ZddddZddddZd	dd
ddZdd	ddddZdS )_DefaultLifespanr   )routerc                 C  s
   || _ d S rK   )_router)r(   r   r,   r,   r-   r'   ^  s    z_DefaultLifespan.__init__r   r   c                   s   | j  I d H  d S rK   )r   startupr   r,   r,   r-   r   a  s    z_DefaultLifespan.__aenter__object)exc_infor!   c                   s   | j  I d H  d S rK   )r   shutdown)r(   r   r,   r,   r-   r   d  s    z_DefaultLifespan.__aexit__r   )r(   rN   r!   c                 C  s   | S rK   r,   )r(   rN   r,   r,   r-   r   g  s    z_DefaultLifespan.__call__N)r.   r/   r0   r'   r   r   r   r,   r,   r,   r-   r   ]  s   r   c                   @  sh  e Zd ZdGddddddddd	d
dddZdddd
dddZddddddZd
dddZd
dddZdddd
ddd Zdddd
dd!d"Z	dddd
dd#d$Z
ddd%d&d'ZdHdd(d)d
d*d+d,ZdIdd(d)d
d-d.d/ZdJdd0d1d)dd
d2d3d4ZdKdd5d)d
d6d7d8ZdLdd1d)dd9d:d;d<ZdMdd)d9d=d>d?Zdd@d
dAdBdCZdd9dDdEdFZdS )Nr   NTr   r   r:   r   z7typing.Sequence[typing.Callable[[], typing.Any]] | NonezLifespan[typing.Any] | Noner   r   )r   redirect_slashesdefault
on_startupon_shutdownlifespanr   r!   c                C  s  |d krg nt || _|| _|d kr*| jn|| _|d kr<g nt || _|d krRg nt || _|sd|r~tdt	 |r~td |d krt
| | _nJt|rtdt	 t|| _n(t|rtdt	 t|| _n|| _| j| _|rt|D ]\}}	}
|| jf|	|
| _qd S )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/.zThe `lifespan` parameter cannot be used with `on_startup` or `on_shutdown`. Both `on_startup` and `on_shutdown` will be ignored.zjasync generator function lifespans are deprecated, use an @contextlib.asynccontextmanager function insteadzdgenerator function lifespans are deprecated, use an @contextlib.asynccontextmanager function instead)r$   r   r  	not_foundr  r  r  r<   r=   r>   r   r   rC   isasyncgenfunctionr   isgeneratorfunctionr   rN   middleware_stackr   )r(   r   r  r  r  r  r  r   r   r   r   r,   r,   r-   r'   l  sJ    

zRouter.__init__r   r   r   rG   c                   s^   |d dkr(t  }||||I d H  d S d|kr<tddntddd}||||I d H  d S )Nr   r   rN   r   r   r   )r   r   r   )r(   rH   rI   rJ   r   rL   r,   r,   r-   r    s    zRouter.not_foundr   r9   r   r   c             	   K  sD   | j D ].}z|j|f|W   S  tk
r2   Y qX qt||d S rK   )r   r   r   )r(   r   r    r   r,   r,   r-   r     s    
zRouter.url_path_forr   c                   s,   | j D ] }t|r | I dH  q|  qdS )z7
        Run any `.on_startup` event handlers.
        N)r  r   r(   handlerr,   r,   r-   r     s    
zRouter.startupc                   s,   | j D ] }t|r | I dH  q|  qdS )z8
        Run any `.on_shutdown` event handlers.
        N)r  r   r  r,   r,   r-   r    s    
zRouter.shutdownc              
     s   d}| d}| I dH  zp| |4 I dH N}|dk	rVd|krHtd|d | |ddiI dH  d}| I dH  W 5 Q I dH R X W nL tk
r   t }|r|d	|d
I dH  n|d|d
I dH   Y nX |ddiI dH  dS )z{
        Handle ASGI lifespan messages, which allows us to manage application
        startup and shutdown events.
        FrN   Nstatez:The server does not support "state" in the lifespan scope.r   zlifespan.startup.completeTzlifespan.shutdown.failed)r   messagezlifespan.startup.failedzlifespan.shutdown.complete)r   r   RuntimeErrorr   BaseExceptionr   
format_exc)r(   rH   rI   rJ   startedrN   Zmaybe_stateexc_textr,   r,   r-   r    s*    
 zRouter.lifespanc                   s   |  |||I dH  dS )z;
        The main entry point to the Router class.
        N)r
  r   r,   r,   r-   r     s    zRouter.__call__c                   s  |d dkst d|kr | |d< |d dkrD| |||I d H  d S d }| jD ]Z}||\}}|tjkr|| ||||I d H   d S |tjkrN|d krN|}|}qN|d k	r|| ||||I d H  d S t	|}	|d dkr| j
r|	dkrt|}
|	dr$|
d d|
d< n|
d d |
d< | jD ]P}||
\}}|tjkr:t|
d}tt|d	}||||I d H   d S q:| |||I d H  d S )
Nr   )r   r   r  r   r  r   rf   r[   r   )r   )rv   r  r   r   r3   r8   r   r   r7   r   r  r   endswithr   r6   r   r   r   r  )r(   rH   rI   rJ   rA   r   r   r   Zpartial_scoper   Zredirect_scopeZredirect_urlrL   r,   r,   r-   rN     sD    



 


z
Router.appr   c                 C  s   t |to| j|jkS rK   )r?   r   r   r   r,   r,   r-   r   *  s    zRouter.__eq__r   r   )r[   rN   r   r!   c                 C  s   t |||d}| j| d S N)rN   r   )r   r   append)r(   r[   rN   r   r   r,   r,   r-   mount-  s    zRouter.mountr   c                 C  s   t |||d}| j| d S r  )r   r   r  )r(   r   rN   r   r   r,   r,   r-   r   3  s    zRouter.hostzAtyping.Callable[[Request], typing.Awaitable[Response] | Response]r   )r[   rW   r   r   r   r!   c                 C  s"   t |||||d}| j| d S )N)rW   r   r   r   )r   r   r  )r(   r[   rW   r   r   r   r   r,   r,   r-   	add_route9  s    zRouter.add_routerS   )r[   rW   r   r!   c                 C  s   t |||d}| j| d S )N)rW   r   )r   r   r  )r(   r[   rW   r   r   r,   r,   r-   add_websocket_routeJ  s    zRouter.add_websocket_routetyping.Callable)r[   r   r   r   r!   c                   s,   t dt ddd fd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.r  rF   c                   s   j |  d | S )N)r   r   r   )r  rP   r   r   r   r[   r(   r,   r-   	decoratorg  s    zRouter.route.<locals>.decoratorr<   r=   r>   )r(   r[   r   r   r   r  r,   r  r-   r   S  s    
zRouter.route)r[   r   r!   c                   s(   t dt ddd fd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.r  rF   c                   s   j |  d | S )N)r   )r  rP   r   r[   r(   r,   r-   r    s    z)Router.websocket_route.<locals>.decoratorr  )r(   r[   r   r  r,   r  r-   websocket_routes  s    zRouter.websocket_routeztyping.Callable[[], typing.Any])
event_typerB   r!   c                 C  s2   |dkst |dkr"| j| n| j| d S )N)r   r  r   )rv   r  r  r  )r(   r   rB   r,   r,   r-   add_event_handler  s    zRouter.add_event_handler)r   r!   c                   s&   t dt ddd fd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.r  rF   c                   s     |  | S rK   )r!  rP   r   r(   r,   r-   r    s    z"Router.on_event.<locals>.decoratorr  )r(   r   r  r,   r"  r-   on_event  s    zRouter.on_event)NTNNNN)N)N)NNT)N)NNT)N)r.   r/   r0   r'   r  r   r   r  r  r   rN   r   r  r   r  r  r   r  r!  r#  r,   r,   r,   r-   r   k  sD          >

2  
        
r   )E
__future__r   r   r@   rC   rw   r   typestypingr<   r   enumr   Zstarlette._exception_handlerr   Zstarlette._utilsr   r   Zstarlette.concurrencyr   Zstarlette.convertorsr	   r
   Zstarlette.datastructuresr   r   r   Zstarlette.exceptionsr   Zstarlette.middlewarer   Zstarlette.requestsr   Zstarlette.responsesr   r   r   Zstarlette.typesr   r   r   r   r   Zstarlette.websocketsr   r   	Exceptionr   r3   rE   rR   rU   rZ   re   r   rr   r   r   r   r   r   r   TypeVarr   AsyncContextManagerr   r   r   r   r,   r,   r,   r-   <module>   sP   
:eHrF
