U
    nËj	‡  ã                   @  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-pzfrzqh9/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   úAtyping.Callable[[Request], typing.Awaitable[Response] | Response]r   ©rB   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   rH   c                 “  s$   ˆ ˆƒI d H }|| ||ƒI d H  d S ©Nr,   )rI   rJ   rK   Úresponse)ÚfÚrequestr,   r-   ÚappH   s    z*request_response.<locals>.app.<locals>.app)r   r   ©rI   rJ   rK   rP   ©rN   )rO   r-   rP   E   s    zrequest_response.<locals>.app)r   r@   rA   r   ©rB   rP   r,   rR   r-   Úrequest_response:   s    ÿ	rT   ú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   rH   c                 “  sD   t | ||d�‰ dddddœ‡‡ fdd„}t|ˆ ƒ| ||ƒI d H  d S )	N)rJ   rK   r   r   r   r   rH   c                 “  s   ˆ ˆƒI d H  d S rL   r,   )rI   rJ   rK   )rB   Úsessionr,   r-   rP   \   s    z+websocket_session.<locals>.app.<locals>.app)r   r   rQ   ©rB   )rV   r-   rP   Y   s    zwebsocket_session.<locals>.appr,   rS   r,   rW   r-   Úwebsocket_sessionQ   s    rX   ú typing.Callable[..., typing.Any]r   )Úendpointr!   c                 C  s   t | d| jjƒS )Nr.   )Úgetattrr+   r.   )rZ   r,   r,   r-   Úget_named   s    r\   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_paramsh   s    
rg   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_typerf   ÚnamesZendingÚhostnamer,   r,   r-   Úcompile_pathz   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]©rI   r!   c                 C  s
   t ƒ ‚d S rL   ©ÚNotImplementedError)r(   rI   r,   r,   r-   Úmatches³   s    zBaseRoute.matchesr   r9   r   r   c                K  s
   t ƒ ‚d S rL   r�   )r(   r   r    r,   r,   r-   Úurl_path_for¶   s    zBaseRoute.url_path_forr   r   r   rH   c                 Ã  s
   t ƒ ‚d S rL   r�   ©r(   rI   rJ   rK   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(   rI   rJ   rK   r‡   Úchild_scoperM   Ú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   rY   úlist[str] | Noneú
str | Noner:   ú"typing.Sequence[Middleware] | Noner   )r]   rZ   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 |¡r€t|ƒ| _|d kr†dg}n|| _|d k	r¶t|ƒD ]\}}	}
|| jf|	ž|
Ž| _q–|d krÆd | _n&dd„ |D ƒ| _d| jkrì| j d¡ t|ƒ\| _| _| _d S )Nrh   ú 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)rr   rx   r]   rZ   r\   r   r¢   r?   r@   rA   rB   rC   Ú
isfunctionÚismethodrT   rP   Úreversedr¡   r}   r‹   r„   r…   r^   )r(   r]   rZ   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r t |ƒ}| j |¡}|r | ¡ }| ¡ D ]\}}| j|  |¡||< q4t| di ¡ƒ}| 	|¡ | j
|dœ}| jr–|d | jkr–tj|fS tj|fS tji fS )Nr•   r–   r    ©rZ   r    r«   )r   r„   r‡   Ú	groupdictra   r^   ÚconvertÚdictÚgetrœ   rZ   r¡   r3   r7   r8   r6   ©	r(   rI   Ú
route_pathr‡   Úmatched_paramsrd   re   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©	rs   r%   r^   r   r   rg   r…   rx   r   ©r(   r   r    Zseen_paramsZexpected_paramsr]   Úremaining_paramsr,   r,   r-   r’     s    
zRoute.url_path_forr   r   rH   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"   rP   i•  )rš   ÚheaderszMethod Not Allowed)r¡   r#   r   r   rP   )r(   rI   rJ   rK   rÂ   rM   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 rL   )r?   r    r]   rZ   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=rn   )r+   r.   r   r¡   r]   r   )r(   Ú
class_namer¡   r]   r   r,   r,   r-   Ú__repr__*  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   rY   r¥   r¦   r   )r]   rZ   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	r¢t|ƒD ]\}}}|| jf|ž|Ž| _q‚t|ƒ\| _| _| _d S )Nrh   r§   )rr   rx   r]   rZ   r\   r   r?   r@   rA   rB   rC   r®   r¯   rX   rP   r°   r‹   r„   r…   r^   )	r(   r]   rZ   r   r£   r±   r²   r³   r´   r,   r,   r-   r'   2  s    zWebSocketRoute.__init__r   r�   rŽ   c           	      C  sŒ   |d dkr‚t |ƒ}| 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¶   ra   r^   r·   r¸   r¹   rœ   rZ   r3   r8   r6   rº   r,   r,   r-   r‘   O  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’   ^  s    
zWebSocketRoute.url_path_forr   r   rH   c                 Ã  s   |   |||¡I d H  d S rL   ©rP   r“   r,   r,   r-   r”   i  s    zWebSocketRoute.handler:   rÃ   c                 C  s"   t |tƒo | j|jko | j|jkS rL   )r?   rÍ   r]   rZ   rÅ   r,   r,   r-   rÆ   l  s    zWebSocketRoute.__eq__rÇ   c                 C  s   | j j› d| j›d| j›d�S )NrÈ   rÉ   rn   )r+   r.   r]   r   ©r(   r,   r,   r-   rË   o  s    zWebSocketRoute.__repr__rÌ   r,   r,   r,   r-   rÍ   1  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]   rP   Ú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	r’t|ƒD ]\}}}|| jf|ž|Ž| _qr|| _t	| jd ƒ\| _
| _| _d S )Nrj   rh   r§   z0Either 'app=...', or 'routes=' must be specified)rÔ   z/{path:path})rr   rx   Úrstripr]   Ú	_base_appÚRouterrP   r°   r   r‹   r„   r…   r^   )	r(   r]   rP   rÔ   r   r£   r²   r³   r´   r,   r,   r-   r'   t  s    	zMount.__init__úlist[BaseRoute]rÇ   c                 C  s   t | jdg ƒS ©NrÔ   )r[   rÖ   rÏ   r,   r,   r-   rÔ   ‹  s    zMount.routesr   r�   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_pathrj   rh   r]   r    Úapp_root_path)r    rÜ   rÛ   rZ   )r¹   r   r„   r‡   r¶   ra   r^   r·   rc   r€   r¸   rœ   rP   r3   r8   r6   )r(   rI   rÛ   r»   r‡   r¼   rd   re   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	pÒg D ]L}z0|j
|f|Ž}	t| d¡t|	ƒ |	jd�W   S  tk
�r   Y qÔX qÔt||ƒ‚d S )Nr]   rh   )r]   rk   r4   rj   r½   )r   rw   rg   r…   r^   r   rr   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   rH   c                 Ã  s   |   |||¡I d H  d S rL   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 rL   )r?   rÐ   r]   rP   rÅ   r,   r,   r-   rÆ   Î  s    zMount.__eq__c                 C  s2   | j j}| jpd}|› d| j›d|›d| j›d�S )Nrj   rÈ   rÉ   ú, app=rn   )r+   r.   r   r]   rP   ©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  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   ©ÚhostrP   r   r!   c                 C  s<   |  d¡rtdƒ‚|| _|| _|| _t|ƒ\| _| _| _d S )Nrh   zHost must not start with '/')	rr   rx   ræ   rP   r   r‹   Ú
host_regexÚhost_formatr^   )r(   ræ   rP   r   r,   r,   r-   r'   Ø  s
    zHost.__init__rØ   rÇ   c                 C  s   t | jdg ƒS rÙ   )r[   rP   rÏ   r,   r,   r-   rÔ   ß  s    zHost.routesr   r�   rŽ   c           
      C  s¤   |d dkršt |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Ú   ©rI   ræ   rj   rk   r   r    )r    rZ   )r   r¹   r‚   rç   r‡   r¶   ra   r^   r·   r¸   rœ   rP   r3   r8   r6   )
r(   rI   rÂ   ræ   r‡   r¼   rd   re   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|ƒ\}}|sît||d�S n¢| j d ksf| | j d ¡rî| j d krv|}n|t| j ƒd d … }t| j| j|ƒ\}}| jp¨g D ]B}z(|j	|f|Ž}tt
|ƒ|j|d�W   S  tk
rê   Y qªX qªt||ƒ‚d S )Nr]   )r]   ræ   rk   r4   )r]   r¾   ræ   )r   rc   rg   rè   r^   r   rr   r€   rÔ   r’   r   r¾   r   )	r(   r   r    r]   ræ   rÁ   rÝ   rÞ   rß   r,   r,   r-   r’   ò  s"    

zHost.url_path_forr   r   rH   c                 Ã  s   |   |||¡I d H  d S rL   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 rL   )r?   rä   ræ   rP   rÅ   r,   r,   r-   rÆ     s    zHost.__eq__c                 C  s2   | j j}| jpd}|› d| j›d|›d| j›d�S )Nrj   z(host=rÉ   rà   rn   )r+   r.   r   ræ   rP   rá   r,   r,   r-   rË     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 rL   )Ú_cm)r(   rì   r,   r,   r-   r'     s    z!_AsyncLiftContextManager.__init__rê   rÇ   c                 Ã  s
   | j  ¡ S rL   )rí   Ú	__enter__rÏ   r,   r,   r-   Ú
__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 rL   )rí   Ú__exit__)r(   rð   rñ   rò   r,   r,   r-   Ú	__aexit__  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])rP   r!   c                   s   t ˆ | ƒƒS rL   )rë   rÎ   ©Zcmgrr,   r-   Úwrapper-  s    z+_wrap_gen_lifespan_context.<locals>.wrapper)Ú
contextlibÚcontextmanagerr@   Úwraps)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d	dd
œdd„Zdd	ddœdd„ZdS )Ú_DefaultLifespanr×   )Úrouterc                 C  s
   || _ d S rL   )Ú_router)r(   rý   r,   r,   r-   r'   5  s    z_DefaultLifespan.__init__r   rÇ   c                 Ã  s   | j  ¡ I d H  d S rL   )rþ   ÚstartuprÏ   r,   r,   r-   rï   8  s    z_DefaultLifespan.__aenter__Úobject)Úexc_infor!   c                 Ç  s   | j  ¡ I d H  d S rL   )rþ   Úshutdown)r(   r  r,   r,   r-   rô   ;  s    z_DefaultLifespan.__aexit__rê   )r(   rP   r!   c                 C  s   | S rL   r,   )r(   rP   r,   r,   r-   rŸ   >  s    z_DefaultLifespan.__call__N)r.   r/   r0   r'   rï   rô   rŸ   r,   r,   r,   r-   rü   4  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r’t
| ƒ| _nJt |¡r´t dt	¡ t|ƒ| _n(t |¡rÖt dt	¡ t|ƒ| _n|| _| j| _|�rt|ƒD ]\}}	}
|| jf|	ž|
Ž| _qòd S )Nz¿The 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/.z€The `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û   rP   Úmiddleware_stackr°   )r(   rÔ   r  r  r  r  r  r£   r²   r³   r´   r,   r,   r-   r'   C  sJ    üÿ
ýÿ
ýÿzRouter.__init__r   r   r   rH   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›   rP   r˜   r™   r—   )r   r   r   )r(   rI   rJ   rK   rž   rM   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 rL   )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.
        FrP   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(   rI   rJ   rK   ÚstartedrP   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�rŒt|ƒ}
|	 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–   rh   r]   ré   )rß   )rx   r  rÔ   r‘   r3   r8   rœ   r”   r7   r   r  r¸   ÚendswithrÕ   r6   r   r   r   r  )r(   rI   rJ   rK   rA   rÞ   r‡   r�   Zpartial_scoper»   Zredirect_scopeZredirect_urlrM   r,   r,   r-   rP   Í  sD    



 


z
Router.apprÃ   c                 C  s   t |tƒo| j|jkS rL   )r?   r×   rÔ   rÅ   r,   r,   r-   rÆ   ÿ  s    zRouter.__eq__r   r¥   )r]   rP   r   r!   c                 C  s   t |||d�}| j |¡ d S ©N)rP   r   )rÐ   rÔ   Úappend)r(   r]   rP   r   rÞ   r,   r,   r-   Úmount  s    zRouter.mountrå   c                 C  s   t |||d�}| j |¡ d S r  )rä   rÔ   r  )r(   ræ   rP   r   rÞ   r,   r,   r-   ræ     s    zRouter.hostrF   r¤   )r]   rZ   r¡   r   r¢   r!   c                 C  s"   t |||||d�}| j |¡ d S )N)rZ   r¡   r   r¢   )r    rÔ   r  )r(   r]   rZ   r¡   r   r¢   rÞ   r,   r,   r-   Ú	add_route
  s    ûzRouter.add_routerU   )r]   rZ   r   r!   c                 C  s   t |||d�}| j |¡ d S )N)rZ   r   )rÍ   rÔ   r  )r(   r]   rZ   r   rÞ   r,   r,   r-   Úadd_websocket_route  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)
        zŸThe `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  rG   c                   s   ˆj ˆ| ˆˆˆ d� | S )N)r¡   r   r¢   )r  rW   ©r¢   r¡   r   r]   r(   r,   r-   Ú	decorator8  s    ûzRouter.route.<locals>.decorator©r<   r=   r>   )r(   r]   r¡   r   r¢   r  r,   r  r-   rÞ   $  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)
        z¯The `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  rG   c                   s   ˆj ˆ| ˆ d� | S )N)r   )r  rW   ©r   r]   r(   r,   r-   r  R  s    z)Router.websocket_route.<locals>.decoratorr  )r(   r]   r   r  r,   r  r-   Úwebsocket_routeD  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ÿ   )rx   r  r  r  )r(   r!  rB   r,   r,   r-   Úadd_event_handlerX  s    zRouter.add_event_handler)r!  r!   c                   s&   t  dt¡ dddœ‡ ‡fdd„}|S )Nz“The `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  rG   c                   s   ˆ  ˆ | ¡ | S rL   )r"  rW   ©r!  r(   r,   r-   r  g  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Ÿ   rP   rÆ   r  ræ   r  r  rÞ   r   r"  r$  r,   r,   r,   r-   r×   B  s@         ÷õ >

2   ú ü   û r×   )EÚ
__future__r   rø   r@   rC   ry   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   rT   rX   r\   rg   rƒ   rt   r‹   rŒ   r    rÍ   rÐ   rä   ÚTypeVarrê   ÚAsyncContextManagerrë   rû   rü   r×   r,   r,   r,   r-   Ú<module>   sP   
8aBd>
