o
    ùT·jw  ã                   @  sP  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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 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$m%Z%m&Z& d dl'm(Z(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2m3Z3 d dl4m5Z5m6Z6m7Z7m8Z8m9Z9 d dl:m;Z;m<Z< G dd„ de=ƒZ>G dd„ deƒZ?dHdd„Z@dIdd „ZAdJd$d%„ZBdKd,d-„ZCe Dd.¡ZEdLd0d1„ZFG d2d3„ d3ƒZGG d4d5„ d5eGƒZHG d6d7„ d7eGƒZIG d8d9„ d9eGƒZJG d:d;„ d;eGƒZKed<ƒZLG d=d>„ d>eeL ƒZMdMdBdC„ZNG dDdE„ dEƒZOG dFdG„ dGƒZPdS )Né    )ÚannotationsN)Ú	AwaitableÚCallableÚ
CollectionÚ	GeneratorÚSequence)ÚAbstractAsyncContextManagerÚAbstractContextManagerÚasynccontextmanager)ÚEnum)ÚPattern)ÚAnyÚTypeVar)Úwrap_app_handling_exceptions)Úget_route_pathÚis_async_callableÚparse_host_header)Úrun_in_threadpool)ÚCONVERTOR_TYPESÚ	Convertor)ÚURLÚHeadersÚURLPath)ÚHTTPExceptionÚStarletteDeprecationWarning)Ú
Middleware)ÚRequestBodyLimitMiddleware)ÚRequest)ÚPlainTextResponseÚRedirectResponseÚResponse)ÚASGIAppÚLifespanÚReceiveÚScopeÚSend)Ú	WebSocketÚWebSocketClosec                      s"   e Zd ZdZ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.
    ÚnameÚstrÚpath_paramsúdict[str, Any]ÚreturnÚNonec                   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__© úT/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/starlette/routing.pyr4   $   s   zNoMatchFound.__init__)r)   r*   r+   r,   r-   r.   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r4   Ú__classcell__r9   r9   r7   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ÚFULLr9   r9   r9   r:   r@   )   s    r@   Úfuncú3Callable[[Request], Awaitable[Response] | Response]r-   r!   c                   s*   t | ƒr| nt t| ¡‰ d‡ fd	d
„}|S )zi
    Takes a function or coroutine `func(request) -> response`,
    and returns an ASGI application.
    Úscoper$   Úreceiver#   Úsendr%   r-   r.   c                 “  s:   �t | ||ƒ‰ d‡‡ fd	d
„}t|ˆ ƒ| ||ƒI d H  d S )NrH   r$   rI   r#   rJ   r%   r-   r.   c                 “  s&   �ˆ ˆƒI d H }|| ||ƒI d H  d S ©Nr9   )rH   rI   rJ   Úresponse)ÚfÚrequestr9   r:   Úapp=   s   €z*request_response.<locals>.app.<locals>.app©rH   r$   rI   r#   rJ   r%   r-   r.   )r   r   ©rH   rI   rJ   rO   ©rM   )rN   r:   rO   :   s   €zrequest_response.<locals>.appNrP   )r   Ú	functoolsÚpartialr   ©rF   rO   r9   rR   r:   Úrequest_response/   s   ÿ	rV   ú&Callable[[WebSocket], Awaitable[None]]c                   s   d‡ fd	d
„}|S )zM
    Takes a coroutine `func(session)`, and returns an ASGI application.
    rH   r$   rI   r#   rJ   r%   r-   r.   c                 “  s<   �t | ||d�‰ d‡‡ fd
d„}t|ˆ ƒ| ||ƒI d H  d S )N)rI   rJ   rH   r$   rI   r#   rJ   r%   r-   r.   c                 “  s   �ˆ ˆƒI d H  d S rK   r9   )rH   rI   rJ   )rF   Úsessionr9   r:   rO   Q   s   €z+websocket_session.<locals>.app.<locals>.apprP   )r&   r   rQ   ©rF   )rX   r:   rO   N   s   €zwebsocket_session.<locals>.appNrP   r9   rU   r9   rY   r:   Úwebsocket_sessionF   s   rZ   ÚendpointúCallable[..., Any]r*   c                 C  s   t | d| jjƒS )Nr;   )Úgetattrr8   r;   )r[   r9   r9   r:   Úget_nameY   s   r^   ÚpathÚparam_convertorsúdict[str, Convertor[Any]]r+   údict[str, str]útuple[str, dict[str, str]]c                 C  s^   t | ¡ ƒD ]$\}}d| d | v r*|| }| |¡}|  d| d |¡} | |¡ q| |fS )NÚ{Ú})r1   ÚitemsÚ	to_stringÚreplaceÚpop)r_   r`   r+   ÚkeyÚvalueÚ	convertorr9   r9   r:   Úreplace_params]   s   

€rm   z4{([a-zA-Z_][a-zA-Z0-9_]*)(:[a-zA-Z_][a-zA-Z0-9_]*)?}ú3tuple[Pattern[str], str, dict[str, Convertor[Any]]]c                 C  s–  |   d¡ }d}d}tƒ }d}i }t | ¡D ]X}| d¡\}}	|	 d¡}	|	tv s0J d|	› d�ƒ‚t|	 }
|t | || 	¡ … ¡7 }|d	|› d
|
j
› d�7 }|| || 	¡ … 7 }|d| 7 }||v rf| |¡ |
||< | ¡ }q|r�d t|ƒ¡}t|ƒdkr€dnd}td|› d|› d| › �ƒ‚|r®| |d… }| d¡s¤| 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/   rA   ÚszDuplicated param nameú z	 at path Nú]ú$)Ú
startswithÚsetÚPARAM_REGEXÚfinditerÚgroupsÚlstripr   ÚreÚescapeÚstartÚregexÚaddÚendr0   ÚsortedÚlenÚ
ValueErrorÚendswithÚrsplitÚcompile)r_   Úis_hostÚ
path_regexÚpath_formatÚduplicated_paramsÚidxr`   ÚmatchÚ
param_nameÚconvertor_typerl   ÚnamesÚendingÚhostnamer9   r9   r:   Úcompile_patho   s>   



r—   c                   @  s4   e Zd Zddd„Zddd„Zddd„Zddd„ZdS )Ú	BaseRouterH   r$   r-   útuple[Match, Scope]c                 C  ó   t ƒ ‚rK   ©ÚNotImplementedError)r5   rH   r9   r9   r:   Úmatchesª   ó   zBaseRoute.matchesr)   r*   r+   r   r   c                K  rš   rK   r›   )r5   r)   r+   r9   r9   r:   Úurl_path_for­   rž   zBaseRoute.url_path_forrI   r#   rJ   r%   r.   c                 Ã  s   �t ƒ ‚rK   r›   ©r5   rH   rI   rJ   r9   r9   r:   Úhandle°   s   €zBaseRoute.handlec                 Ã  s’   �|   |¡\}}|tjkr8|d dkr$tddd�}||||ƒI dH  dS |d dkr6tƒ }||||ƒ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@   rC   r   r'   Úupdater¡   )r5   rH   rI   rJ   r‘   Úchild_scoperL   Úwebsocket_closer9   r9   r:   Ú__call__³   s   €
ý
zBaseRoute.__call__N©rH   r$   r-   r™   ©r)   r*   r+   r   r-   r   rP   )r;   r<   r=   r�   rŸ   r¡   r¬   r9   r9   r9   r:   r˜   ©   ó
    


r˜   c                   @  sV   e Zd Zddddddœd+dd„Zd,dd„Zd-dd„Zd.d$d%„Zd/d'd(„Zd0d)d*„ZdS )1ÚRouteNT)Úmethodsr)   Úinclude_in_schemaÚ
middlewareÚmax_body_sizer_   r*   r[   r\   r±   úCollection[str] | Noner)   ú
str | Noner²   Úboolr³   úSequence[Middleware] | Noner´   ú
int | Noner-   r.   c                C  s,  |  d¡s	J dƒ‚|| _|| _|d u rt|ƒn|| _|| _|}t|tjƒr.|j	}t|tjƒs%t
 |¡s8t
 |¡rEt|ƒ| _|d u rDdg}n|| _|d urct|ƒD ]\}	}
}|	| jg|
¢R i |¤Ž| _qP|d urot| j|d�| _|d u rwd | _ndd„ |D ƒ| _d| jv rŠ| j d¡ t|ƒ\| _| _| _d S )Nro   ú Routed paths must start with '/'ÚGET©r´   c                 S  s   h | ]}|  ¡ ’qS r9   )Úupper)Ú.0Úmethodr9   r9   r:   Ú	<setcomp>î   s    z!Route.__init__.<locals>.<setcomp>ÚHEAD)rz   r_   r[   r^   r)   r²   Ú
isinstancerS   rT   rF   ÚinspectÚ
isfunctionÚismethodrV   rO   Úreversedr   r±   r„   r—   r�   rŽ   r`   )r5   r_   r[   r±   r)   r²   r³   r´   Úendpoint_handlerÚclsÚargsÚkwargsr9   r9   r:   r4   È   s4   ÿ
€
zRoute.__init__rH   r$   r™   c           	      C  sª   |d dkrPt |ƒ}| j |¡}|rP| ¡ }| ¡ D ]\}}| j|  |¡||< qt| di ¡ƒ}| 	|¡ | j
|dœ}| jrK|d | jvrKtj|fS tj|fS tji fS )Nr¢   r£   r+   ©r[   r+   r¿   )r   r�   r‘   Ú	groupdictrf   r`   ÚconvertÚdictÚgetr©   r[   r±   r@   rD   rE   rC   ©	r5   rH   Ú
route_pathr‘   Úmatched_paramsrj   rk   r+   rª   r9   r9   r:   r�   ô   s   



zRoute.matchesr+   r   r   c                K  ó^   t | ¡ ƒ}t | j ¡ ƒ}|| jks||krt||ƒ‚t| j| j|ƒ\}}|r)J ‚t|dd�S )Nr£   ©r_   Úprotocol©r{   r2   r`   r)   r(   rm   rŽ   r   ©r5   r)   r+   Úseen_paramsÚexpected_paramsr_   Úremaining_paramsr9   r9   r:   rŸ     ó   
zRoute.url_path_forrI   r#   rJ   r%   c                 Ã  sv   �| j r/|d | j vr/dd | j ¡i}d|v rtd|d�‚tdd|d�}||||ƒI d H  d S |  |||¡I d H  d S )Nr¿   ÚAllowr/   rO   i•  )r§   ÚheaderszMethod Not Allowed)r±   r0   r   r   rO   )r5   rH   rI   rJ   rÝ   rL   r9   r9   r:   r¡     s   €zRoute.handleÚotherc                 C  s.   t |tƒo| j|jko| j|jko| j|jkS rK   )rÂ   r°   r_   r[   r±   ©r5   rÞ   r9   r9   r:   Ú__eq__  s   

ÿ
þ
üzRoute.__eq__c                 C  s@   | j j}t| jp	g ƒ}| j| j}}|› d|›d|›d|›d�S )Nú(path=ú, name=z
, methods=ru   )r8   r;   r†   r±   r_   r)   )r5   Ú
class_namer±   r_   r)   r9   r9   r:   Ú__repr__$  s   zRoute.__repr__)r_   r*   r[   r\   r±   rµ   r)   r¶   r²   r·   r³   r¸   r´   r¹   r-   r.   r­   r®   rP   ©rÞ   r   r-   r·   ©r-   r*   ©	r;   r<   r=   r4   r�   rŸ   r¡   rà   rä   r9   r9   r9   r:   r°   Ç   s    ÷
,


r°   c                   @  sP   e Zd Zdddœd%dd„Zd&dd„Zd'dd„Zd(dd„Zd)d!d"„Zd*d#d$„ZdS )+ÚWebSocketRouteN)r)   r³   r_   r*   r[   r\   r)   r¶   r³   r¸   r-   r.   c          	      C  sÊ   |  d¡s	J dƒ‚|| _|| _|d u rt|ƒn|| _|}t|tjƒr+|j}t|tjƒs"t	 
|¡s5t	 |¡r;t|ƒ| _n|| _|d urYt|ƒD ]\}}}|| jg|¢R i |¤Ž| _qFt|ƒ\| _| _| _d S )Nro   rº   )rz   r_   r[   r^   r)   rÂ   rS   rT   rF   rÃ   rÄ   rÅ   rZ   rO   rÆ   r—   r�   rŽ   r`   )	r5   r_   r[   r)   r³   rÇ   rÈ   rÉ   rÊ   r9   r9   r:   r4   ,  s   ÿzWebSocketRoute.__init__rH   r$   r™   c           	      C  sŒ   |d dkrAt |ƒ}| j |¡}|rA| ¡ }| ¡ D ]\}}| j|  |¡||< qt| di ¡ƒ}| 	|¡ | j
|dœ}tj|fS tji fS )Nr¢   r¨   r+   rË   )r   r�   r‘   rÌ   rf   r`   rÍ   rÎ   rÏ   r©   r[   r@   rE   rC   rÐ   r9   r9   r:   r�   I  s   


zWebSocketRoute.matchesr+   r   r   c                K  rÓ   )Nr¨   rÔ   rÖ   r×   r9   r9   r:   rŸ   X  rÛ   zWebSocketRoute.url_path_forrI   r#   rJ   r%   c                 Ã  ó   �|   |||¡I d H  d S rK   ©rO   r    r9   r9   r:   r¡   c  ó   €zWebSocketRoute.handlerÞ   r·   c                 C  ó"   t |tƒo| j|jko| j|jkS rK   )rÂ   rè   r_   r[   rß   r9   r9   r:   rà   f  ó   "zWebSocketRoute.__eq__c                 C  s   | j j› d| j›d| j›d�S )Nrá   râ   ru   )r8   r;   r_   r)   ©r5   r9   r9   r:   rä   i  s   zWebSocketRoute.__repr__)
r_   r*   r[   r\   r)   r¶   r³   r¸   r-   r.   r­   r®   rP   rå   ræ   rç   r9   r9   r9   r:   rè   +  s    ú



rè   c                   @  sf   e Zd Z			d,dddœd-dd„Zed.dd„ƒZd/dd„Zd0dd„Zd1d$d%„Zd2d(d)„Z	d3d*d+„Z
dS )4ÚMountN©r³   r´   r_   r*   rO   úASGIApp | NoneÚroutesúSequence[BaseRoute] | Noner)   r¶   r³   r¸   r´   r¹   r-   r.   c          
      C  sÔ   |dks|  d¡sJ dƒ‚|d us|d usJ dƒ‚| d¡| _|d ur'|| _nt|d�| _| j| _|d urLt|ƒD ]\}}}	|| jg|¢R i |	¤Ž| _q9|d urXt| j|d�| _|| _t	| jd ƒ\| _
| _| _d S )Nrq   ro   rº   z0Either 'app=...', or 'routes=' must be specified)rò   r¼   z/{path:path})rz   Úrstripr_   Ú	_base_appÚRouterrO   rÆ   r   r)   r—   r�   rŽ   r`   )
r5   r_   rO   rò   r)   r³   r´   rÈ   rÉ   rÊ   r9   r9   r:   r4   n  s   
zMount.__init__úlist[BaseRoute]c                 C  ó   t | jdg ƒS ©Nrò   )r]   rõ   rî   r9   r9   r:   rò   ˆ  ó   zMount.routesrH   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_pathrq   ro   r_   r+   Úapp_root_path)r+   rý   rü   r[   )rÏ   r   r�   r‘   rÌ   rf   r`   rÍ   ri   r‡   rÎ   r©   rO   r@   rE   rC   )r5   rH   rü   rÑ   r‘   rÒ   rj   rk   Úremaining_pathÚmatched_pathr+   rª   r9   r9   r:   r�   Œ  s&   

ò

zMount.matchesr+   r   r   c          
   	   K  s(  | j d ur)|| j kr)d|v r)|d  d¡|d< t| j| j|ƒ\}}|s(t|d�S nf| j d u s6| | j d ¡r�| j d u r>|}n|t| j ƒd d … }| d¡}d|d< t| j| j|ƒ\}}|d urd||d< | j	phg D ]%}z|j
|fi |¤Ž}	t| d¡t|	ƒ |	jd�W   S  tyŽ   Y qiw t||ƒ‚)Nr_   ro   )r_   rr   rA   rq   rÔ   )r)   r   rm   rŽ   r`   r   rz   r‡   rÏ   rò   rŸ   rô   r*   rÕ   r(   )
r5   r)   r+   r_   rÚ   Úremaining_nameÚ
path_kwargÚpath_prefixÚrouteÚurlr9   r9   r:   rŸ   ­  s.   
ÿ

"ÿ
zMount.url_path_forrI   r#   rJ   r%   c                 Ã  ré   rK   rê   r    r9   r9   r:   r¡   È  rë   zMount.handlerÞ   r·   c                 C  rì   rK   )rÂ   rï   r_   rO   rß   r9   r9   r:   rà   Ë  rí   zMount.__eq__c                 C  ó2   | j j}| jpd}|› d| j›d|›d| j›d�S )Nrq   rá   râ   ú, app=ru   )r8   r;   r)   r_   rO   ©r5   rã   r)   r9   r9   r:   rä   Î  ó   
 zMount.__repr__)NNN)r_   r*   rO   rñ   rò   ró   r)   r¶   r³   r¸   r´   r¹   r-   r.   ©r-   r÷   r­   r®   rP   rå   ræ   ©r;   r<   r=   r4   Úpropertyrò   r�   rŸ   r¡   rà   rä   r9   r9   r9   r:   rï   m  s    ûø

!

rï   c                   @  sX   e Zd Zd%d&d
d„Zed'dd„ƒZd(dd„Zd)dd„Zd*dd„Zd+d!d"„Z	d,d#d$„Z
dS )-ÚHostNÚhostr*   rO   r!   r)   r¶   r-   r.   c                 C  s<   |  d¡r	J dƒ‚|| _|| _|| _t|ƒ\| _| _| _d S )Nro   zHost must not start with '/')rz   r  rO   r)   r—   Ú
host_regexÚhost_formatr`   )r5   r  rO   r)   r9   r9   r:   r4   Õ  s
   zHost.__init__r÷   c                 C  rø   rù   )r]   rO   rî   r9   r9   r:   rò   Ü  rú   zHost.routesrH   r$   r™   c                 C  s´   |d dv rUt |d�}t| d¡ƒ}|d u rtji fS |j}| j |¡}|rU| ¡ }| 	¡ D ]\}}| j
|  |¡||< q.t| di ¡ƒ}	|	 |¡ |	| jdœ}
tj|
fS tji fS )Nr¢   rû   ©rH   r  r+   )r+   r[   )r   r   rÏ   r@   rC   r  r  r‘   rÌ   rf   r`   rÍ   rÎ   r©   rO   rE   )r5   rH   rÝ   Úparsed_hostr  r‘   rÒ   rj   rk   r+   rª   r9   r9   r:   r�   à  s    




zHost.matchesr+   r   r   c          	   	   K  sø   | j d ur&|| j kr&d|v r&| d¡}t| j| j|ƒ\}}|s%t||d�S nQ| j d u s3| | j d ¡rw| j d u r;|}n|t| j ƒd d … }t| j| j|ƒ\}}| jpTg D ]!}z|j	|fi |¤Ž}tt
|ƒ|j|d�W   S  tyv   Y qUw t||ƒ‚)Nr_   )r_   r  rr   rA   )r_   rÕ   r  )r)   ri   rm   r  r`   r   rz   r‡   rò   rŸ   r*   rÕ   r(   )	r5   r)   r+   r_   r  rÚ   r   r  r  r9   r9   r:   rŸ   ó  s&   
ÿ
ÿ
zHost.url_path_forrI   r#   rJ   r%   c                 Ã  ré   rK   rê   r    r9   r9   r:   r¡   
  rë   zHost.handlerÞ   r·   c                 C  rì   rK   )rÂ   r  r  rO   rß   r9   r9   r:   rà     rí   zHost.__eq__c                 C  r  )Nrq   z(host=râ   r  ru   )r8   r;   r)   r  rO   r  r9   r9   r:   rä     r  zHost.__repr__rK   ©r  r*   rO   r!   r)   r¶   r-   r.   r	  r­   r®   rP   rå   ræ   r
  r9   r9   r9   r:   r  Ô  s    



r  Ú_Tc                   @  s*   e Zd Zddd„Zddd„Zddd„ZdS )Ú_AsyncLiftContextManagerÚcmúAbstractContextManager[_T]c                 C  ó
   || _ d S rK   )Ú_cm)r5   r  r9   r9   r:   r4     ó   
z!_AsyncLiftContextManager.__init__r-   r  c                 Ã  s   �| j  ¡ S rK   )r  Ú	__enter__rî   r9   r9   r:   Ú
__aenter__  s   €
z#_AsyncLiftContextManager.__aenter__Úexc_typeútype[BaseException] | NoneÚ	exc_valueúBaseException | NoneÚ	tracebackútypes.TracebackType | Noneúbool | Nonec                 Ã  s   �| j  |||¡S rK   )r  Ú__exit__)r5   r  r  r   r9   r9   r:   Ú	__aexit__   s   €z"_AsyncLiftContextManager.__aexit__N)r  r  )r-   r  )r  r  r  r  r   r!  r-   r"  )r;   r<   r=   r4   r  r$  r9   r9   r9   r:   r    s    

r  Úlifespan_contextú)Callable[[Any], Generator[Any, Any, Any]]ú1Callable[[Any], AbstractAsyncContextManager[Any]]c                   s&   t  | ¡‰ t ˆ ¡d‡ fdd„ƒ}|S )NrO   r   r-   ú_AsyncLiftContextManager[Any]c                   s   t ˆ | ƒƒS rK   )r  rê   ©Úcmgrr9   r:   Úwrapper.  s   z+_wrap_gen_lifespan_context.<locals>.wrapper)rO   r   r-   r(  )Ú
contextlibÚcontextmanagerrS   Úwraps)r%  r+  r9   r)  r:   Ú_wrap_gen_lifespan_context)  s   
r/  c                   @  s4   e Zd Zddd„Zddd„Zddd„Zddd„ZdS )Ú_DefaultLifespanÚrouterrö   c                 C  r  rK   )Ú_router)r5   r1  r9   r9   r:   r4   6  r  z_DefaultLifespan.__init__r-   r.   c                 Ã  ó   �d S rK   r9   rî   r9   r9   r:   r  9  ó   €z_DefaultLifespan.__aenter__Úexc_infoÚobjectc                 Ç  r3  rK   r9   )r5   r5  r9   r9   r:   r$  <  r4  z_DefaultLifespan.__aexit__r5   r  rO   c                 C  s   | S rK   r9   )r5   rO   r9   r9   r:   r¬   ?  s   z_DefaultLifespan.__call__N)r1  rö   )r-   r.   )r5  r6  r-   r.   )r5   r  rO   r6  r-   r  )r;   r<   r=   r4   r  r$  r¬   r9   r9   r9   r:   r0  5  r¯   r0  c                   @  sœ   e Zd Z				d?dddœd@dd„ZdAdd„ZdBd!d"„ZdAd#d$„ZdAd%d&„ZdAd'd(„ZdCd*d+„Z	dDdEd0d1„Z
dDdFd3d4„Z			dGdHd:d;„Z	dDdId=d>„ZdS )Jrö   NTrð   rò   ró   Úredirect_slashesr·   Údefaultrñ   ÚlifespanúLifespan[Any] | Noner³   r¸   r´   r¹   r-   r.   c          
      C  sè   |d u rg nt |ƒ| _|| _|d u r| jn|| _|d u r"t| ƒ| _n%t |¡r3t	 
dt¡ t|ƒ| _nt |¡rDt	 
dt¡ t|ƒ| _n|| _| j| _|rdt|ƒD ]\}}}	|| jg|¢R i |	¤Ž| _qQ|d urrt| j|d�| _d S d S )Nzjasync generator function lifespans are deprecated, use an @contextlib.asynccontextmanager function insteadzdgenerator function lifespans are deprecated, use an @contextlib.asynccontextmanager function insteadr¼   )r1   rò   r7  Ú	not_foundr8  r0  r%  rÃ   ÚisasyncgenfunctionÚwarningsÚwarnr   r
   Úisgeneratorfunctionr/  rO   Úmiddleware_stackrÆ   r   )
r5   rò   r7  r8  r9  r³   r´   rÈ   rÉ   rÊ   r9   r9   r:   r4   D  s2   
ý
þÿzRouter.__init__rH   r$   rI   r#   rJ   r%   c                 Ã  s^   �|d dkrt ƒ }||||ƒI d H  d S d|v rtdd�‚tddd�}||||ƒI d H  d S )Nr¢   r¨   rO   r¥   r¦   r¤   )r'   r   r   )r5   rH   rI   rJ   r«   rL   r9   r9   r:   r;  n  s   €
zRouter.not_foundr)   r*   r+   r   r   c             	   K  s@   | j D ]}z|j|fi |¤ŽW   S  ty   Y qw t||ƒ‚rK   )rò   rŸ   r(   )r5   r)   r+   r  r9   r9   r:   rŸ   }  s   
ÿ
zRouter.url_path_forc              	   Ã  s  �d}|  d¡}|ƒ I dH  zE|  |¡4 I dH š/}|dur,d|vr%tdƒ‚|d  |¡ |ddiƒI dH  d}|ƒ I dH  W d  ƒI dH  n1 I dH sMw   Y  W n# tyv   t ¡ }|rk|d	|d
œƒI dH  ‚ |d|d
œƒI dH  ‚ w |ddiƒI dH  dS )z{
        Handle ASGI lifespan messages, which allows us to manage application
        startup and shutdown events.
        FrO   NÚstatez:The server does not support "state" in the lifespan scope.r¢   zlifespan.startup.completeTzlifespan.shutdown.failed)r¢   Úmessagezlifespan.startup.failedzlifespan.shutdown.complete)rÏ   r%  ÚRuntimeErrorr©   ÚBaseExceptionr   Ú
format_exc)r5   rH   rI   rJ   ÚstartedrO   Úmaybe_stateÚexc_textr9   r9   r:   r9  …  s0   €
(ù€ÿúzRouter.lifespanc                 Ã  s   �|   |||¡I dH  dS )z;
        The main entry point to the Router class.
        N)r@  r    r9   r9   r:   r¬      s   €zRouter.__call__c                 Ã  sª  �|d dv s	J ‚d|vr| |d< |d dkr#|   |||¡I d H  d S d }| jD ]1}| |¡\}}|tjkrL||d< | |¡ | |||¡I d H   d S |tjkrY|d u rY|}|}q(|d urs||d< | |¡ | |||¡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 ]&}| |
¡\}}|tjkrÈt|
d	�}tt|ƒd
�}||||ƒI d H   d S q¢|  |||¡I d H  d S )Nr¢   )r£   r¨   r9  r1  r9  r  r£   ro   r_   r  )r  )r9  rò   r�   r@   rE   r©   r¡   rD   r   r7  rÎ   r‰   rô   rC   r   r   r*   r8  )r5   rH   rI   rJ   rT   r  r‘   rª   Úpartial_scoperÑ   Úredirect_scopeÚredirect_urlrL   r9   r9   r:   rO   ¦  sN   €


€




üz
Router.apprÞ   c                 C  s   t |tƒo
| j|jkS rK   )rÂ   rö   rò   rß   r9   r9   r:   rà   Ú  s   zRouter.__eq__r_   rO   r!   r¶   c                 C  ó   t |||d�}| j |¡ d S ©N)rO   r)   )rï   rò   Úappend)r5   r_   rO   r)   r  r9   r9   r:   ÚmountÝ  ó   zRouter.mountr  c                 C  rL  rM  )r  rò   rN  )r5   r  rO   r)   r  r9   r9   r:   r  á  rP  zRouter.hostr[   rG   r±   rµ   r²   c                 C  s"   t |||||d�}| j |¡ d S )N)r[   r±   r)   r²   )r°   rò   rN  )r5   r_   r[   r±   r)   r²   r  r9   r9   r:   Ú	add_routeå  s   ûzRouter.add_routerW   c                 C  rL  )N)r[   r)   )rè   rò   rN  )r5   r_   r[   r)   r  r9   r9   r:   Úadd_websocket_routeö  s   zRouter.add_websocket_route)NTNN)rò   ró   r7  r·   r8  rñ   r9  r:  r³   r¸   r´   r¹   r-   r.   rP   r®   rå   rK   )r_   r*   rO   r!   r)   r¶   r-   r.   r  )NNT)r_   r*   r[   rG   r±   rµ   r)   r¶   r²   r·   r-   r.   )r_   r*   r[   rW   r)   r¶   r-   r.   )r;   r<   r=   r4   r;  rŸ   r9  r¬   rO   rà   rO  r  rQ  rR  r9   r9   r9   r:   rö   C  s.    ù	ö
*




4úürö   )rF   rG   r-   r!   )rF   rW   r-   r!   )r[   r\   r-   r*   )r_   r*   r`   ra   r+   rb   r-   rc   )r_   r*   r-   rn   )r%  r&  r-   r'  )QÚ
__future__r   r,  rS   rÃ   r€   r   Útypesr=  Úcollections.abcr   r   r   r   r   r   r	   r
   Úenumr   r   Útypingr   r   Ústarlette._exception_handlerr   Ústarlette._utilsr   r   r   Ústarlette.concurrencyr   Ústarlette.convertorsr   r   Ústarlette.datastructuresr   r   r   Ústarlette.exceptionsr   r   Ústarlette.middlewarer   Ústarlette.middleware.body_limitr   Ústarlette.requestsr   Ústarlette.responsesr   r   r    Ústarlette.typesr!   r"   r#   r$   r%   Ústarlette.websocketsr&   r'   Ú	Exceptionr(   r@   rV   rZ   r^   rm   r‹   r|   r—   r˜   r°   rè   rï   r  r  r  r/  r0  rö   r9   r9   r9   r:   Ú<module>   sV    





:dBgB
