a
    h                     @  st  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	m
Z
mZ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mZ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l0m1Z1m2Z2m3Z3m4Z4m5Z5 d dl6m7Z7m8Z8 G dd de9Z:G dd deZ;dddddZ<ddddd Z=d!ddd"d#Z>d$d%d&d'd(Z?d%d)d*d+d,d-d.Z@eAd/ZBd%d0d1d2d3ZCG d4d5 d5ZDG d6d7 d7eDZEG d8d9 d9eDZFG d:d; d;eDZGG d<d= d=eDZHed>ZIG d?d@ d@eeI ZJdAdBdCdDdEZKG dFdG dGZLG dHdI dIZMdS )J    )annotationsN)	Awaitable
Collection	GeneratorSequence)AbstractAsyncContextManagerAbstractContextManagerasynccontextmanager)Enum)Pattern)AnyCallableTypeVar)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, 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__ M/var/www/html/assistant/venv/lib/python3.9/site-packages/starlette/routing.pyr1   #   s    zNoMatchFound.__init__)__name__
__module____qualname____doc__r1   __classcell__r6   r6   r4   r7   r%      s   r%   c                   @  s   e Zd ZdZdZdZdS )Matchr         N)r8   r9   r:   NONEPARTIALFULLr6   r6   r6   r7   r=   (   s   r=   r   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)rD   r6   r6   r7   iscoroutinefunction_or_partial.   s    rN   3Callable[[Request], Awaitable[Response] | Response]r   rK   r+   c                   s4   t | r| n
tt|  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'   rQ   c                   s$    I d H }|| ||I d H  d S Nr6   )rR   rS   rT   response)frequestr6   r7   appJ   s    z*request_response.<locals>.app.<locals>.app)r   r   rR   rS   rT   rY   rW   )rX   r7   rY   G   s    zrequest_response.<locals>.app)r   rI   rJ   r   rK   rY   r6   r[   r7   request_response<   s    	r]   &Callable[[WebSocket], 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'   rQ   c                   sD   t | ||d ddddd fdd}t| | ||I d H  d S )	N)rS   rT   r!   r    r"   r'   rQ   c                   s    I d H  d S rU   r6   )rR   rS   rT   )rK   sessionr6   r7   rY   ^   s    z+websocket_session.<locals>.app.<locals>.app)r#   r   rZ   rK   )r_   r7   rY   [   s    zwebsocket_session.<locals>.appr6   r\   r6   r`   r7   websocket_sessionS   s    ra   Callable[..., Any]r&   )endpointr+   c                 C  s   t | d| jjS )Nr8   )getattrr5   r8   )rc   r6   r6   r7   get_namef   s    re   zdict[str, Convertor[Any]]zdict[str, str]ztuple[str, dict[str, str]])pathparam_convertorsr*   r+   c                 C  s^   t | D ]H\}}d| d | v r|| }||}| d| d |} || q| |fS )N{})r.   itemsZ	to_stringreplacepop)rf   rg   r*   keyvalue	convertorr6   r6   r7   replace_paramsj   s    
rp   z4{([a-zA-Z_][a-zA-Z0-9_]*)(:[a-zA-Z_][a-zA-Z0-9_]*)?}z3tuple[Pattern[str], str, dict[str, Convertor[Any]]])rf   r+   c                 C  s  |  d }d}d}t }d}i }t| D ]}|d\}}	|	d}	|	tv s`J d|	 dt|	 }
|t| ||	  7 }|d	| d
|
j
 d7 }|| ||	  7 }|d| 7 }||v 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,   r>   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)rf   Zis_host
path_regexpath_formatZduplicated_paramsidxrg   match
param_nameZconvertor_typero   namesendinghostnamer6   r6   r7   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]rR   r+   c                 C  s
   t  d S rU   NotImplementedError)r2   rR   r6   r6   r7   matches   s    zBaseRoute.matchesr&   r   r   r(   c                K  s
   t  d S rU   r   )r2   r)   r*   r6   r6   r7   url_path_for   s    zBaseRoute.url_path_forr    r"   r'   rQ   c                   s
   t  d S rU   r   r2   rR   rS   rT   r6   r6   r7   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   r=   r@   r   r$   updater   )r2   rR   rS   rT   r   child_scoperV   websocket_closer6   r6   r7   __call__   s    

zBaseRoute.__call__N)r8   r9   r:   r   r   r   r   r6   r6   r6   r7   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&   rb   Collection[str] | None
str | NonerC   Sequence[Middleware] | Noner'   )rf   rc   r   r)   r   r   r+   c                C  s
  | dsJ d|| _|| _|d u r.t|n|| _|| _|}t|tjrR|j	}q>t
|sft
|rt|| _|d u rdg}n|| _|d urt|D ]$\}}	}
|| jg|	R i |
| _q|d u rd | _n&dd |D | _d| jv r| jd t|\| _| _| _d S )Nrq    Routed paths must start with '/'GETc                 S  s   h | ]}|  qS r6   )upper).0methodr6   r6   r7   	<setcomp>       z!Route.__init__.<locals>.<setcomp>HEAD)r{   rf   rc   re   r)   r   rH   rI   rJ   rK   rL   
isfunctionismethodr]   rY   reversedr   r   r   r   r   rg   )r2   rf   rc   r   r)   r   r   endpoint_handlerclsargskwargsr6   r6   r7   r1      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vrtj|fS tj|fS tji fS )Nr   r   r*   rc   r*   r   )r   r   r   	groupdictrj   rg   convertdictgetr   rc   r   r=   rA   rB   r@   	r2   rR   
route_pathr   matched_paramsrm   rn   r*   r   r6   r6   r7   r      s    


zRoute.matchesr   r   r(   c                K  s^   t | }t | j }|| jks,||kr6t||t| j| j|\}}|rRJ t|ddS )Nr   rf   protocolr|   r/   rg   r)   r%   rp   r   r   r2   r)   r*   Zseen_paramsZexpected_paramsrf   remaining_paramsr6   r6   r7   r     s    
zRoute.url_path_forr    r"   rQ   c                   st   | j r\|d | j vr\dd| j i}d|v r:td|dntdd|d}||||I d H  n| |||I d H  d S )Nr   ZAllowr,   rY   i  )r   headerszMethod Not Allowed)r   r-   r   r   rY   )r2   rR   rS   rT   r   rV   r6   r6   r7   r     s    zRoute.handleotherr+   c                 C  s.   t |to,| j|jko,| j|jko,| j|jkS rU   )rH   r   rf   rc   r   r2   r   r6   r6   r7   __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=rw   )r5   r8   r   r   rf   r)   )r2   
class_namer   rf   r)   r6   r6   r7   __repr__,  s    zRoute.__repr__	r8   r9   r:   r1   r   r   r   r   r   r6   r6   r6   r7   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&   rb   r   r   r'   )rf   rc   r)   r   r+   c          	      C  s   | dsJ d|| _|| _|d u r.t|n|| _|}t|tjrL|j}q8t	
|s`t	|rlt|| _n|| _|d urt|D ]$\}}}|| jg|R i || _qt|\| _| _| _d S )Nrq   r   )r{   rf   rc   re   r)   rH   rI   rJ   rK   rL   r   r   ra   rY   r   r   r   r   rg   )	r2   rf   rc   r)   r   r   r   r   r   r6   r6   r7   r1   4  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   rj   rg   r   r   r   r   rc   r=   rB   r@   r   r6   r6   r7   r   Q  s    

zWebSocketRoute.matchesr   r   r(   c                K  s^   t | }t | j }|| jks,||kr6t||t| j| j|\}}|rRJ t|ddS )Nr   r   r   r   r6   r6   r7   r   `  s    
zWebSocketRoute.url_path_forr    r"   rQ   c                   s   |  |||I d H  d S rU   rY   r   r6   r6   r7   r   k  s    zWebSocketRoute.handlerC   r   c                 C  s"   t |to | j|jko | j|jkS rU   )rH   r   rf   rc   r   r6   r6   r7   r   n  s    zWebSocketRoute.__eq__r   c                 C  s   | j j d| jd| jdS )Nr   r   rw   )r5   r8   rf   r)   r2   r6   r6   r7   r   q  s    zWebSocketRoute.__repr__r   r6   r6   r6   r7   r   3  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Sequence[BaseRoute] | Noner   r   r'   )rf   rY   routesr)   r   r+   c          	      C  s   |dks| dsJ d|d us2|d us2J d|d| _|d urN|| _nt|d| _| j| _|d urt|D ]$\}}}|| jg|R i || _qr|| _t| jd \| _	| _
| _d S )Nrs   rq   r   z0Either 'app=...', or 'routes=' must be specified)r   z/{path:path})r{   rstriprf   	_base_appRouterrY   r   r)   r   r   r   rg   )	r2   rf   rY   r   r)   r   r   r   r   r6   r6   r7   r1   v  s    	zMount.__init__list[BaseRoute]r   c                 C  s   t | jdg S Nr   )rd   r   r   r6   r6   r7   r     s    zMount.routesr!   r   r   c                 C  s   |d dv 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_pathrs   rq   rf   r*   app_root_path)r*   r   r   rc   )r   r   r   r   r   rj   rg   r   rl   r   r   r   rY   r=   rB   r@   )r2   rR   r   r   r   r   rm   rn   Zremaining_pathZmatched_pathr*   r   r6   r6   r7   r     s&    


zMount.matchesr   r   r(   c          
   	   K  s2  | j d urR|| j krRd|v rR|d d|d< t| j| j|\}}|sPt|dS n| j d u sn|| j d r$| j d u r~|}n|t| j d d  }|d}d|d< t| j| j|\}}|d ur||d< | j	pg D ]N}z4|j
|fi |}	t|dt|	 |	jdW   S  ty    Y q0 qt||d S )Nrf   rq   )rf   rt   r>   rs   r   )r)   r   rp   r   rg   r   r{   r   r   r   r   r   r&   r   r%   )
r2   r)   r*   rf   r   remaining_nameZ
path_kwargZpath_prefixrouteurlr6   r6   r7   r     s*    

"zMount.url_path_forr    r"   rQ   c                   s   |  |||I d H  d S rU   r   r   r6   r6   r7   r     s    zMount.handlerC   r   c                 C  s"   t |to | j|jko | j|jkS rU   )rH   r   rf   rY   r   r6   r6   r7   r     s    zMount.__eq__c                 C  s2   | j j}| jpd}| d| jd|d| jdS )Nrs   r   r   , app=rw   )r5   r8   r)   rf   rY   r2   r   r)   r6   r6   r7   r     s    
zMount.__repr__)NNNr8   r9   r:   r1   propertyr   r   r   r   r   r   r6   r6   r6   r7   r   u  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'   hostrY   r)   r+   c                 C  s<   | drJ d|| _|| _|| _t|\| _| _| _d S )Nrq   zHost must not start with '/')r{   r   rY   r)   r   
host_regexhost_formatrg   )r2   r   rY   r)   r6   r6   r7   r1     s
    zHost.__init__r   r   c                 C  s   t | jdg S r   )rd   rY   r   r6   r6   r7   r     s    zHost.routesr!   r   r   c           
      C  s   |d dv 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   rR   r   rs   rt   r   r*   )r*   rc   )r   r   r   r   r   r   rj   rg   r   r   r   rY   r=   rB   r@   )
r2   rR   r   r   r   r   rm   rn   r*   r   r6   r6   r7   r     s    


zHost.matchesr   r   r(   c          	   	   K  s   | j d urL|| j krLd|v rL|d}t| j| j|\}}|st||dS n| j d u sf|| j d r| j d u rv|}n|t| j d d  }t| j| j|\}}| jpg D ]D}z,|j	|fi |}tt
||j|dW   S  ty   Y q0 qt||d S )Nrf   )rf   r   rt   r>   )rf   r   r   )r)   rl   rp   r   rg   r   r{   r   r   r   r&   r   r%   )	r2   r)   r*   rf   r   r   r   r   r   r6   r6   r7   r     s"    

zHost.url_path_forr    r"   rQ   c                   s   |  |||I d H  d S rU   r   r   r6   r6   r7   r     s    zHost.handlerC   r   c                 C  s"   t |to | j|jko | j|jkS rU   )rH   r   r   rY   r   r6   r6   r7   r     s    zHost.__eq__c                 C  s2   | j j}| jpd}| d| jd|d| jdS )Nrs   z(host=r   r   rw   )r5   r8   r)   r   rY   r   r6   r6   r7   r     s    
zHost.__repr__)Nr   r6   r6   r6   r7   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AbstractContextManager[_T])cmc                 C  s
   || _ d S rU   )_cm)r2   r   r6   r6   r7   r1     s    z!_AsyncLiftContextManager.__init__r   r   c                   s
   | j  S rU   )r   	__enter__r   r6   r6   r7   
__aenter__  s    z#_AsyncLiftContextManager.__aenter__ztype[BaseException] | NonezBaseException | Noneztypes.TracebackType | Nonezbool | None)exc_type	exc_value	tracebackr+   c                   s   | j |||S rU   )r   __exit__)r2   r   r   r   r6   r6   r7   	__aexit__!  s    z"_AsyncLiftContextManager.__aexit__N)r8   r9   r:   r1   r   r   r6   r6   r6   r7   r     s   r   z)Callable[[Any], Generator[Any, Any, Any]]z1Callable[[Any], AbstractAsyncContextManager[Any]])lifespan_contextr+   c                   s,   t |  t ddd fdd}|S )Nr   z_AsyncLiftContextManager[Any])rY   r+   c                   s   t  | S rU   )r   r   Zcmgrr6   r7   wrapper/  s    z+_wrap_gen_lifespan_context.<locals>.wrapper)
contextlibcontextmanagerrI   wraps)r   r  r6   r   r7   _wrap_gen_lifespan_context*  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 rU   )_router)r2   r  r6   r6   r7   r1   7  s    z_DefaultLifespan.__init__r'   r   c                   s   | j  I d H  d S rU   )r  startupr   r6   r6   r7   r   :  s    z_DefaultLifespan.__aenter__object)exc_infor+   c                   s   | j  I d H  d S rU   )r  shutdown)r2   r  r6   r6   r7   r   =  s    z_DefaultLifespan.__aexit__r   )r2   rY   r+   c                 C  s   | S rU   r6   )r2   rY   r6   r6   r7   r   @  s    z_DefaultLifespan.__call__N)r8   r9   r:   r1   r   r   r   r6   r6   r6   r7   r  6  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   rC   r   z"Sequence[Callable[[], Any]] | NonezLifespan[Any] | Noner   r'   )r   redirect_slashesdefault
on_startupon_shutdownlifespanr   r+   c                C  s  |d u rg nt || _|| _|d u r*| jn|| _|d u r<g nt || _|d u rRg nt || _|sd|r~tdt	 |r~td |d u rt
| | _nJt|rtdt	 t|| _n(t|rtdt	 t|| _n|| _| j| _|rt|D ]$\}}	}
|| jg|	R i |
| _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  rE   rF   rG   r  r   rL   isasyncgenfunctionr	   isgeneratorfunctionr  rY   middleware_stackr   )r2   r   r  r  r  r  r  r   r   r   r   r6   r6   r7   r1   E  sJ    

zRouter.__init__r!   r    r"   rQ   c                   s^   |d dkr(t  }||||I d H  d S d|v r<tddntddd}||||I d H  d S )Nr   r   rY   r   r   r   )r$   r   r   )r2   rR   rS   rT   r   rV   r6   r6   r7   r    s    zRouter.not_foundr&   r   r   r(   c             	   K  sF   | j D ]0}z|j|fi |W   S  ty4   Y q0 qt||d S rU   )r   r   r%   )r2   r)   r*   r   r6   r6   r7   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   r2   handlerr6   r6   r7   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  r6   r6   r7   r    s    
zRouter.shutdownc              	     s  d}| d}| I dH  z| |4 I dH ^}|durVd|vrHtd|d | |ddiI dH  d}| I dH  W d  I dH  q1 I dH s0    Y  W nJ ty   t }|r|d	|d
I dH  n|d|d
I dH   Y n0 |ddiI dH  dS )z{
        Handle ASGI lifespan messages, which allows us to manage application
        startup and shutdown events.
        FrY   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)r2   rR   rS   rT   startedrY   Zmaybe_stateexc_textr6   r6   r7   r    s&    
:zRouter.lifespanc                   s   |  |||I dH  dS )z;
        The main entry point to the Router class.
        N)r  r   r6   r6   r7   r     s    zRouter.__call__c                   s  |d dv sJ d|v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 u rN|}|}qN|d u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   rq   rf   r   )r   )r  r   r   r=   rB   r   r   rA   r   r  r   endswithr   r@   r   r   r&   r  )r2   rR   rS   rT   rJ   r   r   r   Zpartial_scoper   Zredirect_scopeZredirect_urlrV   r6   r6   r7   rY     sD    



 


z
Router.appr   c                 C  s   t |to| j|jkS rU   )rH   r   r   r   r6   r6   r7   r      s    zRouter.__eq__r   r   )rf   rY   r)   r+   c                 C  s   t |||d}| j| d S N)rY   r)   )r   r   append)r2   rf   rY   r)   r   r6   r6   r7   mount  s    zRouter.mountr   c                 C  s   t |||d}| j| d S r   )r   r   r!  )r2   r   rY   r)   r   r6   r6   r7   r     s    zRouter.hostrO   r   )rf   rc   r   r)   r   r+   c                 C  s"   t |||||d}| j| d S )N)rc   r   r)   r   )r   r   r!  )r2   rf   rc   r   r)   r   r   r6   r6   r7   	add_route  s    zRouter.add_router^   )rf   rc   r)   r+   c                 C  s   t |||d}| j| d S )N)rc   r)   )r   r   r!  )r2   rf   rc   r)   r   r6   r6   r7   add_websocket_route  s    zRouter.add_websocket_router   )rf   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   rP   c                   s   j |  d | S )N)r   r)   r   )r#  r`   r   r   r)   rf   r2   r6   r7   	decorator9  s    zRouter.route.<locals>.decoratorrE   rF   rG   )r2   rf   r   r)   r   r&  r6   r%  r7   r   %  s    
zRouter.route)rf   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   rP   c                   s   j |  d | S )N)r)   )r$  r`   r)   rf   r2   r6   r7   r&  S  s    z)Router.websocket_route.<locals>.decoratorr'  )r2   rf   r)   r&  r6   r(  r7   websocket_routeE  s    zRouter.websocket_routezCallable[[], Any])
event_typerK   r+   c                 C  s2   |dv sJ |dkr"| j | n| j| d S )N)r	  r  r	  )r  r!  r  )r2   r*  rK   r6   r6   r7   add_event_handlerY  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   rP   c                   s     |  | S rU   )r+  r`   r*  r2   r6   r7   r&  h  s    z"Router.on_event.<locals>.decoratorr'  )r2   r*  r&  r6   r,  r7   on_eventa  s    zRouter.on_event)NTNNNN)N)N)NNT)N)NNT)N)r8   r9   r:   r1   r  r   r	  r  r  r   rY   r   r"  r   r#  r$  r   r)  r+  r-  r6   r6   r6   r7   r   D  s@          =

2        r   )N
__future__r   r  rI   rL   r   r   typesrE   collections.abcr   r   r   r   r   r   r	   enumr
   r   typingr   r   r   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%   r=   rN   r]   ra   re   rp   r   r}   r   r   r   r   r   r   r   r   r  r  r   r6   r6   r6   r7   <module>   sT   
8aBd>