B
    ind~                 @   s~  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 de(Z)G dd de
Z*ej+e,dddZ-ej.e dddZ/ej.e dddZ0ej.e1dddZ2e1ej3e1ef ej3e1e1f ej4e1e5f dddZ6e7d Z8e1ej4ej9e1ej3e1ef f d!d"d#Z:G d$d% d%Z;G d&d' d'e;Z<G d(d) d)e;Z=G d*d+ d+e;Z>G d,d- d-e;Z?e@d.ZAG d/d0 d0ejBeA ZCej.ej+gejDf ej.ej+gejBf d1d2d3ZEG d4d5 d5ZFG d6d7 d7ZGdS )8    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                   s6   e Zd ZdZeejeejf 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.
    N)namepath_paramsreturnc                s0   d t| }t d| d| d d S )Nz, zNo route exists for name "z" and params "z".)joinlistkeyssuper__init__)selfr   r   params)	__class__ 5/tmp/pip-unpacked-wheel-_bom8ime/starlette/routing.pyr      s    zNoMatchFound.__init__)
__name__
__module____qualname____doc__strtypingDictAnyr   __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&   r'   NONEPARTIALFULLr#   r#   r#   r$   r.   #   s   r.   )objr   c             C   s.   t dt xt| tjr"| j} qW 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)r4   r#   r#   r$   iscoroutinefunction_or_partial)   s    
r>   )r;   r   c                s&   t  tttdd fdd}|S )zi
    Takes a function or coroutine `func(request) -> response`,
    and returns an ASGI application.
    N)scopereceivesendr   c                sH   t | ||d}r" |I d H }nt |I d H }|| ||I d H  d S )N)r@   rA   )r   r   )r?   r@   rA   requestresponse)r;   is_coroutiner#   r$   app?   s
    zrequest_response.<locals>.app)r   r   r   r   )r;   rE   r#   )r;   rD   r$   request_response8   s    rF   c                s   t ttdd fdd}|S )zM
    Takes a coroutine `func(session)`, and returns an ASGI application.
    N)r?   r@   rA   r   c                s    t | ||d} |I d H  d S )N)r@   rA   )r   )r?   r@   rA   session)r;   r#   r$   rE   P   s    zwebsocket_session.<locals>.app)r   r   r   )r;   rE   r#   )r;   r$   websocket_sessionJ   s    rH   )endpointr   c             C   s"   t | st | r| jS | jjS )N)r<   	isroutineisclassr%   r"   )rI   r#   r#   r$   get_nameW   s    rL   )pathparam_convertorsr   r   c             C   sb   xXt | D ]H\}}d| d | kr|| }||}| d| d |} || qW | |fS )N{})r   itemsZ	to_stringreplacepop)rM   rN   r   keyvalue	convertorr#   r#   r$   replace_params]   s    
rW   z4{([a-zA-Z_][a-zA-Z0-9_]*)(:[a-zA-Z_][a-zA-Z0-9_]*)?})rM   r   c             C   s  |  d }d}d}t }d}i }xt| D ]}|d\}}	|	d}	|	tksbtd|	 dt|	 }
|t	| ||
  7 }|d	| d
|
j d7 }|| ||
  7 }|d| 7 }||kr|| |
||< | }q.W |r&dt|}t|dkrdnd}td| d| d|  |rV| |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}z, r/   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)rM   Zis_host
path_regexpath_formatZduplicated_paramsidxrN   match
param_nameZconvertor_typerV   namesZendinghostnamer#   r#   r$   compile_patho   s<    


r{   c               @   sb   e Zd Zeejeef dddZeej	e
dddZeeeddd	d
ZeeeddddZdS )	BaseRoute)r?   r   c             C   s
   t  d S )N)NotImplementedError)r    r?   r#   r#   r$   matches   s    zBaseRoute.matches)_BaseRoute__namer   r   c             K   s
   t  d S )N)r}   )r    r   r   r#   r#   r$   url_path_for   s    zBaseRoute.url_path_forN)r?   r@   rA   r   c                s
   t  d S )N)r}   )r    r?   r@   rA   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httpz	Not Foundi  )status_codeN	websocket)r~   r.   r1   r   r   updater   )r    r?   r@   rA   rw   child_scoperC   websocket_closer#   r#   r$   __call__   s    

zBaseRoute.__call__)r%   r&   r'   r   r*   Tupler.   r~   r)   r,   r
   r   r   r   r   r   r#   r#   r#   r$   r|      s   r|   c               @   s   e Zd Zddddeejejeje  eje eddddZ	e
ejee
f ddd	Zeejed
ddZe
eeddddZejedddZedddZdS )RouteNT)methodsr   include_in_schema)rM   rI   r   r   r   r   c            C   s   | dstd|| _|| _|d kr.t|n|| _|| _|}xt|tj	rT|j
}q@W t|sjt|rt|| _|d krdg}n|| _|d krd | _n&dd |D | _d| jkr| jd t|\| _| _| _d S )NrX   z Routed paths must start with '/'GETc             S   s   h | ]}|  qS r#   )upper).0methodr#   r#   r$   	<setcomp>   s    z!Route.__init__.<locals>.<setcomp>HEAD)rb   rh   rM   rI   rL   r   r   r8   r9   r:   r;   r<   
isfunctionismethodrF   rE   r   rm   r{   rt   ru   rN   )r    rM   rI   r   r   r   endpoint_handlerr#   r#   r$   r      s&    	


zRoute.__init__)r?   r   c             C   s   |d dkr| j |d }|r| }x(| D ]\}}| j| |||< q2W t|di }|| | j	|d}| j
r|d | j
krtj|fS tj|fS tji fS )Nr   r   rM   r   )rI   r   r   )rt   rw   	groupdictrQ   rN   convertdictgetr   rI   r   r.   r2   r3   r1   )r    r?   rw   matched_paramsrT   rU   r   r   r#   r#   r$   r~      s    


zRoute.matches)_Route__namer   r   c             K   s^   t | }t | j }|| jks,||kr6t||t| j| j|\}}|rRtt|ddS )Nr   )rM   protocol)	rc   r   rN   r   r   rW   ru   rh   r
   )r    r   r   seen_paramsexpected_paramsrM   remaining_paramsr#   r#   r$   r      s    
zRoute.url_path_for)r?   r@   rA   r   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Allowz, rE   i  )r   headerszMethod Not Allowed)r   r   r   r   rE   )r    r?   r@   rA   r   rC   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 )N)r8   r   rM   rI   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 )Nz(path=z, name=z
, methods=r^   )r"   r%   ro   r   rM   r   )r    
class_namer   rM   r   r#   r#   r$   __repr__  s    zRoute.__repr__)r%   r&   r'   r)   r*   CallableOptionalListboolr   r   r   r.   r~   r,   r
   r   r   r   r   r   r   r#   r#   r#   r$   r      s   $r   c               @   s   e Zd Zddeejeje ddddZeej	e
ef dddZeejed	d
dZeeeddddZejedddZedddZdS )WebSocketRouteN)r   )rM   rI   r   r   c            C   s   | dstd|| _|| _|d kr.t|n|| _|}xt|tjrN|j	}q:W t
|sdt
|rpt|| _n|| _t|\| _| _| _d S )NrX   z Routed paths must start with '/')rb   rh   rM   rI   rL   r   r8   r9   r:   r;   r<   r   r   rH   rE   r{   rt   ru   rN   )r    rM   rI   r   r   r#   r#   r$   r   &  s    
zWebSocketRoute.__init__)r?   r   c             C   s   |d dkr| j |d }|r| }x(| D ]\}}| j| |||< q2W t|di }|| | j	|d}t
j|fS t
ji fS )Nr   r   rM   r   )rI   r   )rt   rw   r   rQ   rN   r   r   r   r   rI   r.   r3   r1   )r    r?   rw   r   rT   rU   r   r   r#   r#   r$   r~   :  s    

zWebSocketRoute.matches)_WebSocketRoute__namer   r   c             K   s^   t | }t | j }|| jks,||kr6t||t| j| j|\}}|rRtt|ddS )Nr   )rM   r   )	rc   r   rN   r   r   rW   ru   rh   r
   )r    r   r   r   r   rM   r   r#   r#   r$   r   G  s    
zWebSocketRoute.url_path_for)r?   r@   rA   r   c                s   |  |||I d H  d S )N)rE   )r    r?   r@   rA   r#   r#   r$   r   T  s    zWebSocketRoute.handle)r   r   c             C   s"   t |to | j|jko | j|jkS )N)r8   r   rM   rI   )r    r   r#   r#   r$   r   W  s    
zWebSocketRoute.__eq__)r   c             C   s   | j j d| jd| jdS )Nz(path=z, name=r^   )r"   r%   rM   r   )r    r#   r#   r$   r   ^  s    zWebSocketRoute.__repr__)r%   r&   r'   r)   r*   r   r   r   r   r   r.   r~   r,   r
   r   r   r   r   r   r   r   r#   r#   r#   r$   r   %  s   r   c            	   @   s   e Zd Zdddeeje ejeje  eje ejeje	  ddddZ
eeje dddZeejeef d	d
dZeejedddZeeeddddZejedddZedddZdS )MountN)
middleware)rM   rE   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	rx*t|D ]\}}|f d| ji|| _qtW || _t	| jd \| _
| _| _d S )NrZ   rX   z Routed paths must start with '/'z0Either 'app=...', or 'routes=' must be specified)r   rE   z/{path:path})rb   rh   rstriprM   	_base_appRouterrE   reversedr   r{   rt   ru   rN   )r    rM   rE   r   r   r   clsoptionsr#   r#   r$   r   c  s    	zMount.__init__)r   c             C   s   t | jdg S )Nr   )getattrr   )r    r#   r#   r$   r   ~  s    zMount.routes)r?   r   c             C   s   |d dkr|d }| j |}|r| }x(| D ]\}}| j| |||< q6W d|d }|d t|  }t|	di }	|	
| |	dd}
|	|	d|
|
| || jd	}tj|fS tji fS )
Nr   )r   r   rM   rX   r   	root_pathrZ   app_root_path)r   r   r   rM   rI   )rt   rw   r   rQ   rN   r   rS   rp   r   r   r   rE   r.   r3   r1   )r    r?   rM   rw   r   rT   rU   Zremaining_pathZmatched_pathr   r   r   r#   r#   r$   r~     s&    



zMount.matches)_Mount__namer   r   c       
   	   K   s.  | 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< xT| j	pg D ]F}y*|j
|f|}	t|dt|	 |	jdS  tk
r   Y qX qW t||d S )NrM   rX   )rM   r[   r/   rZ   )rM   r   )r   rg   rW   ru   rN   r
   rb   rp   r   r   r   r   r)   r   r   )
r    r   r   rM   r   remaining_nameZ
path_kwargZpath_prefixrouteurlr#   r#   r$   r     s0    


zMount.url_path_for)r?   r@   rA   r   c                s   |  |||I d H  d S )N)rE   )r    r?   r@   rA   r#   r#   r$   r     s    zMount.handle)r   r   c             C   s"   t |to | j|jko | j|jkS )N)r8   r   rM   rE   )r    r   r#   r#   r$   r     s    
zMount.__eq__c             C   s2   | j j}| jpd}| d| jd|d| jdS )NrZ   z(path=z, name=z, app=r^   )r"   r%   r   rM   rE   )r    r   r   r#   r#   r$   r     s    
zMount.__repr__)NNN)r%   r&   r'   r)   r*   r   r   Sequencer|   r   r   propertyr   r   r   r   r.   r~   r,   r
   r   r   r   r   r   r   r   r#   r#   r#   r$   r   b  s     4!r   c               @   s   e Zd Zdeeeje ddddZeej	e
 dddZeejeef dd	d
ZeejedddZeeeddddZejedddZedddZdS )HostN)hostrE   r   r   c             C   s<   | drtd|| _|| _|| _t|\| _| _| _d S )NrX   zHost must not start with '/')	rb   rh   r   rE   r   r{   
host_regexhost_formatrN   )r    r   rE   r   r#   r#   r$   r     s
    zHost.__init__)r   c             C   s   t | jdg S )Nr   )r   rE   )r    r#   r#   r$   r     s    zHost.routes)r?   r   c       
      C   s   |d dkrt |d}|dddd }| j|}|r| }x(| D ]\}}| j| |||< qNW t	|di }|
| || jd	}	tj|	fS tji fS )
Nr   )r   r   )r?   r   rZ   r[   r   r   )r   rI   )r	   r   rr   r   rw   r   rQ   rN   r   r   r   rE   r.   r3   r1   )
r    r?   r   r   rw   r   rT   rU   r   r   r#   r#   r$   r~     s    


zHost.matches)_Host__namer   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|\}}xJ| jpg D ]<}y"|j	|f|}tt
||j|dS  tk
r   Y qX qW t||d S )NrM   )rM   r   r[   r/   )rM   r   r   )r   rS   rW   r   rN   r
   rb   rp   r   r   r)   r   r   )	r    r   r   rM   r   r   r   r   r   r#   r#   r$   r     s&    


zHost.url_path_for)r?   r@   rA   r   c                s   |  |||I d H  d S )N)rE   )r    r?   r@   rA   r#   r#   r$   r     s    zHost.handle)r   r   c             C   s"   t |to | j|jko | j|jkS )N)r8   r   r   rE   )r    r   r#   r#   r$   r     s    
zHost.__eq__c             C   s2   | j j}| jpd}| d| jd|d| jdS )NrZ   z(host=z, name=z, app=r^   )r"   r%   r   r   rE   )r    r   r   r#   r#   r$   r     s    
zHost.__repr__)N)r%   r&   r'   r)   r   r*   r   r   r   r   r|   r   r   r   r.   r~   r,   r
   r   r   r   r   r   r   r   r#   r#   r#   r$   r     s   r   _Tc               @   sb   e Zd Zeje dddZedddZejej	e
  eje
 ejej eje ddd	Zd
S )_AsyncLiftContextManager)cmc             C   s
   || _ d S )N)_cm)r    r   r#   r#   r$   r     s    z!_AsyncLiftContextManager.__init__)r   c                s
   | j  S )N)r   	__enter__)r    r#   r#   r$   
__aenter__  s    z#_AsyncLiftContextManager.__aenter__)exc_type	exc_value	tracebackr   c                s   | j |||S )N)r   __exit__)r    r   r   r   r#   r#   r$   	__aexit__  s    z"_AsyncLiftContextManager.__aexit__N)r%   r&   r'   r*   ContextManagerr   r   r   r   TypeBaseExceptiontypesTracebackTyper   r   r#   r#   r#   r$   r     s   
r   )lifespan_contextr   c                s.   t |  t tjtd fdd}|S )N)rE   r   c                s   t  | S )N)r   )rE   )cmgrr#   r$   wrapper*  s    z+_wrap_gen_lifespan_context.<locals>.wrapper)
contextlibcontextmanagerr9   wrapsr*   r,   r   )r   r   r#   )r   r$   _wrap_gen_lifespan_context%  s    
r   c               @   sJ   e Zd ZddddZddddZedd	d
dZeeedddZdS )_DefaultLifespanr   )routerc             C   s
   || _ d S )N)_router)r    r   r#   r#   r$   r   2  s    z_DefaultLifespan.__init__N)r   c                s   | j  I d H  d S )N)r   startup)r    r#   r#   r$   r   5  s    z_DefaultLifespan.__aenter__)exc_infor   c                s   | j  I d H  d S )N)r   shutdown)r    r   r#   r#   r$   r   8  s    z_DefaultLifespan.__aexit__)r    rE   r   c             C   s   | S )Nr#   )r    rE   r#   r#   r$   r   ;  s    z_DefaultLifespan.__call__)	r%   r&   r'   r   r   objectr   r   r   r#   r#   r#   r$   r   1  s   r   c            	   @   s  e Zd Zd0ejeje  eeje ejejej	  ejejej	  eje
ej  ddddZeeeddddZeejed	d
dZddddZddddZeeeddddZeeeddddZejedddZd1eeeje ddddZd2eeeje ddddZd3eej	ejeje  eje edddd Zd4eej	eje dd!d"d#Zd5eejeje  eje eej	d$d%d&Zd6eeje ej	d'd(d)Zeej	dd*d+d,Z eej	d-d.d/Z!dS )7r   NT)r   redirect_slashesdefault
on_startupon_shutdownlifespanr   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|rptdt	 |d krt
| | _nJt|rtdt	 t|| _n(t|rtdt	 t|| _n|| _d 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/.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   r5   r6   r7   r   r   r<   isasyncgenfunctionr   isgeneratorfunctionr   )r    r   r   r   r   r   r   r#   r#   r$   r   @  s0    



zRouter.__init__)r?   r@   rA   r   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   rE   i  )r   z	Not Found)r   r   r   )r    r?   r@   rA   r   rC   r#   r#   r$   r   q  s    zRouter.not_found)_Router__namer   r   c          	   K   sB   x2| j D ](}y|j|f|S  tk
r.   Y qX qW t||d S )N)r   r   r   )r    r   r   r   r#   r#   r$   r     s    
zRouter.url_path_for)r   c                s0   x*| j D ] }t|r"| I dH  q|  qW dS )z7
        Run any `.on_startup` event handlers.
        N)r   r   )r    handlerr#   r#   r$   r     s    zRouter.startupc                s0   x*| j D ] }t|r"| I dH  q|  qW dS )z8
        Run any `.on_shutdown` event handlers.
        N)r   r   )r    r   r#   r#   r$   r     s    zRouter.shutdownc          
      s   d}| d}| I dH  yp| |4 I dH N}|dk	rVd|krHtd|d | |ddiI dH  d}| I dH  W d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.
        FrE   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   r   r   
format_exc)r    r?   r@   rA   startedrE   Zmaybe_stateexc_textr#   r#   r$   r     s(    
 zRouter.lifespanc                s  |d dkst d|kr | |d< |d dkrD| |||I dH  dS d}xb| jD ]X}||\}}|tjkr|| ||||I dH  dS |tjkrP|dkrP|}|}qPW |dk	r|| ||||I dH  dS |d dkr| j	r|d dkrt
|}	|d dr&|	d d|	d< n|	d d |	d< xX| jD ]N}||	\}}|tjkr>t|	d	}
tt|
d
}||||I dH  dS q>W | |||I dH  dS )z;
        The main entry point to the Router class.
        r   )r   r   r   r   r   Nr   rM   rX   )r?   )r   )rh   r   r   r~   r.   r3   r   r   r2   r   r   endswithr   r1   r   r   r)   r   )r    r?   r@   rA   r:   r   rw   r   Zpartial_scopeZredirect_scopeZredirect_urlrC   r#   r#   r$   r     sB    


$

zRouter.__call__)r   r   c             C   s   t |to| j|jkS )N)r8   r   r   )r    r   r#   r#   r$   r     s    zRouter.__eq__)rM   rE   r   r   c             C   s   t |||d}| j| d S )N)rE   r   )r   r   append)r    rM   rE   r   r   r#   r#   r$   mount  s    zRouter.mount)r   rE   r   r   c             C   s   t |||d}| j| d S )N)rE   r   )r   r   r   )r    r   rE   r   r   r#   r#   r$   r     s    zRouter.host)rM   rI   r   r   r   r   c             C   s"   t |||||d}| j| d S )N)rI   r   r   r   )r   r   r   )r    rM   rI   r   r   r   r   r#   r#   r$   	add_route  s    zRouter.add_route)rM   rI   r   r   c             C   s   t |||d}| j| d S )N)rI   r   )r   r   r   )r    rM   rI   r   r   r#   r#   r$   add_websocket_route  s    zRouter.add_websocket_route)rM   r   r   r   r   c                s0   t dt tjtj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;   r   c                s   j |  d | S )N)r   r   r   )r   )r;   )r   r   r   rM   r    r#   r$   	decorator'  s    zRouter.route.<locals>.decorator)r5   r6   r7   r*   r   )r    rM   r   r   r   r   r#   )r   r   r   rM   r    r$   r     s
     
zRouter.route)rM   r   r   c                s,   t dt tjtj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;   r   c                s   j |  d | S )N)r   )r   )r;   )r   rM   r    r#   r$   r   C  s    z)Router.websocket_route.<locals>.decorator)r5   r6   r7   r*   r   )r    rM   r   r   r#   )r   rM   r    r$   websocket_route3  s
    
zRouter.websocket_route)
event_typer;   r   c             C   s2   |dkst |dkr"| j| n| j| d S )N)r   r   r   )rh   r   r   r   )r    r   r;   r#   r#   r$   add_event_handlerI  s    zRouter.add_event_handler)r   r   c                s*   t dt tjtj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;   r   c                s     |  | S )N)r   )r;   )r   r    r#   r$   r   Z  s    z"Router.on_event.<locals>.decorator)r5   r6   r7   r*   r   )r    r   r   r#   )r   r    r$   on_eventS  s
    zRouter.on_event)NTNNNN)N)N)NNT)N)NNT)N)"r%   r&   r'   r*   r   r   r|   r   r   r   r   r,   r   r   r   r   r   r)   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#   r#   r#   r$   r   ?  sB        H'

4     r   )Hr   r9   r<   ri   r   r   r*   r5   r   enumr   Zstarlette._utilsr   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   Zstarlette.typesr   r   r   r   r   Zstarlette.websocketsr   r   	Exceptionr   r.   r,   r   r>   r   rF   rH   r)   rL   r+   r   r   rW   rs   rd   Patternr{   r|   r   r   r   r   TypeVarr   AsyncContextManagerr   	Generatorr   r   r   r#   r#   r#   r$   <module>   sV   
&8^=hH

