o
    +ifĜ                     @   s:  U 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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mZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z*m+Z, dd	l-m.Z. dd
l m/Z/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8 ddl9m:Z:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@ ddlAmBZB ddlCmDZDmEZE ddlFmGZG dZHerddlImJZJ eeKeKf ZLneMZLeNeOePe,Qddd ZRee$ePdf  eSd< e	TdZUee!eK  eSd< e	TdZVee!eK  eSd< e	WdZXeeK eSd< eeBgee eE  f ZYe$e d e"eK f ZZej[ejWd d!Z\G d"d# d#e&d$d%Z]G d&d' d'e#ed( Z^G d)d( d(e j_Z`G d*d deLe/ZaG d+d, d,eaZbd-eBd.dfd/d0ZcG d1d2 d2e^ZdG d3d4 d4edZeG d5d6 d6edZfG d7d8 d8e^ZgG d9d: d:egZhG d;d< d<egZiG d=d> d>e j_ZjG d?d@ d@ejZkG dAdB dBekZlG dCdD dDeiZmG dEdF dFe`ZnG dGdH dHe`ZoG dIdJ dJe1ZpG dKdL dLe#ee^ ee^ ZqG dMdN dNe#ee` ee` ZrG dOdP dPe0eeKe^f ZsdQeKd.eKfdRdSZtdQeKd.eKfdTdUZudQeKd.eKfdVdWZvdS )X    N)contextmanager)wraps)Path)MappingProxyType)TYPE_CHECKINGAny	AwaitableCallable	ContainerDictFinal	GeneratorIterableIteratorListMappingNoReturnOptionalPatternSetSizedTupleType	TypedDictUnioncast)URL__version__   )hdrs)AbstractMatchInfoAbstractRouterAbstractView)DEBUG)HttpVersion11)HandlerPathLike)HTTPExceptionHTTPExpectationFailedHTTPForbiddenHTTPMethodNotAllowedHTTPNotFound)FileResponse)Request)ResponseStreamResponse)AbstractRouteDef)
UrlDispatcherUrlMappingMatchInfoAbstractResourceResourcePlainResourceDynamicResourceAbstractRouteResourceRouteStaticResourceView)Application.   .YARL_VERSIONz$^[0-9A-Za-z!#\$%&'\*\+\-\.\^_`\|~]+$HTTP_METHOD_REz*(\{[_a-zA-Z][^{}]*(?:\{[^{}]*\}[^{}]*)*\})ROUTE_RE/PATH_SEPr2   T)quotec                   @   sj   e Zd ZU eed< eed< ee ed< eed< eed< eedf ed< ded	< eed
< ded< eed< dS )	_InfoDictpath	formatterpattern	directoryprefixr7   routesr;   appdomainAbstractRuleMatchingrulehttp_exceptionN)	__name__
__module____qualname__str__annotations__r   r   r   r'    rU   rU   R/var/www/html/corbot_env/lib/python3.10/site-packages/aiohttp/web_urldispatcher.pyrD   b   s   
 rD   F)totalc                   @   s   e Zd Zdddee ddfddZedee fddZeej	defd	d
Z
ej	dedefddZej	dedefddZej	deddfddZej	defddZdddZej	dedefddZdS )r3   NnamerY   returnc                C   
   || _ d S N_nameselfrY   rU   rU   rV   __init__v      
zAbstractResource.__init__c                 C      | j S r\   r]   r`   rU   rU   rV   rY   y      zAbstractResource.namec                 C      dS )zWExposes the resource's canonical path.

        For example '/foo/bar/{name}'

        NrU   rd   rU   rU   rV   	canonical}       zAbstractResource.canonicalkwargsc                 K   rf   )z2Construct url for resource with additional params.NrU   )r`   ri   rU   rU   rV   url_for   rh   zAbstractResource.url_forrequestc                       dS )zWResolve resource.

        Return (UrlMappingMatchInfo, allowed_methods) pair.
        NrU   r`   rk   rU   rU   rV   resolve       zAbstractResource.resolverI   c                 C   rf   )zWAdd a prefix to processed URLs.

        Required for subapplications support.
        NrU   r`   rI   rU   rU   rV   
add_prefix   rh   zAbstractResource.add_prefixc                 C   rf   z;Return a dict with additional info useful for introspectionNrU   rd   rU   rU   rV   get_info   rh   zAbstractResource.get_infoc                 C      d S r\   rU   rd   rU   rU   rV   freeze      zAbstractResource.freezerE   c                 C   rf   )z Perform a raw match against pathNrU   r`   rE   rU   rU   rV   	raw_match   rh   zAbstractResource.raw_matchrZ   N)rP   rQ   rR   r   rS   ra   propertyrY   abcabstractmethodrg   r   rj   r-   _Resolvern   rq   rD   rs   ru   boolrx   rU   rU   rU   rV   r3   u   s$    
r3   r7   c                   @   s   e Zd Zddddedeeee f dee	 dee
 ddf
dd	Zedefd
dZedefddZeejdee fddZedee
 fddZejdefddZejdededefddZdedee fddZdS )r7   Nexpect_handlerresourcemethodhandlerr   r   rZ   c                   s   |d u rt }t|sJ d|| }t|s"t| dt|s*J |t|r0n0t	|r<t
dt n$t|trGt|trGnt
dt t|dtdtf fdd}| |}|| _|| _|| _|| _d S )	NzCoroutine is expected, got z is not allowed HTTP methodz6Bare generators are deprecated, use @coroutine wrapperz-Bare functions are deprecated, use async onesrk   rZ   c                    s0    | }t |r|I d H }t|tsJ |S r\   )asyncioiscoroutine
isinstancer/   )rk   resultold_handlerrU   rV   handler_wrapper   s   

z/AbstractRoute.__init__.<locals>.handler_wrapper)_default_expect_handlerr   iscoroutinefunctionupperr?   match
ValueErrorcallableinspectisgeneratorfunctionwarningswarnDeprecationWarningr   type
issubclassr"   r   r-   r/   _method_handler_expect_handler	_resource)r`   r   r   r   r   r   rU   r   rV   ra      s>   	



zAbstractRoute.__init__c                 C   rc   r\   )r   rd   rU   rU   rV   r      re   zAbstractRoute.methodc                 C   rc   r\   )r   rd   rU   rU   rV   r      re   zAbstractRoute.handlerc                 C   rf   )z8Optional route's name, always equals to resource's name.NrU   rd   rU   rU   rV   rY      rh   zAbstractRoute.namec                 C   rc   r\   )r   rd   rU   rU   rV   r      re   zAbstractRoute.resourcec                 C   rf   rr   rU   rd   rU   rU   rV   rs      rh   zAbstractRoute.get_infoargsri   c                 O   rf   z/Construct url for route with additional params.NrU   r`   r   ri   rU   rU   rV   rj      rh   zAbstractRoute.url_forrk   c                    s   |  |I d H S r\   )r   rm   rU   rU   rV   handle_expect_header      z"AbstractRoute.handle_expect_header)rP   rQ   rR   rS   r   r%   r   r"   r   _ExpectHandlerr3   ra   rz   r   r   r{   r|   rY   r   rD   rs   r   rj   r-   r/   r   rU   rU   rU   rV   r7      s8    
3c                       s   e Zd Zdeeef def fddZedefddZ	edefdd	Z
edefd
dZedee fddZdefddZeded fddZd!ddZed"ddZeddded fddZd#ddZdef fdd Z  ZS )$r2   
match_dictroutec                    s(   t  | || _g | _d | _d| _d S NF)superra   _route_apps_current_app_frozen)r`   r   r   	__class__rU   rV   ra      s
   
zUrlMappingMatchInfo.__init__rZ   c                 C      | j jS r\   )r   r   rd   rU   rU   rV   r         zUrlMappingMatchInfo.handlerc                 C   rc   r\   )r   rd   rU   rU   rV   r     re   zUrlMappingMatchInfo.routec                 C   r   r\   )r   r   rd   rU   rU   rV   r     r   z"UrlMappingMatchInfo.expect_handlerc                 C   rt   r\   rU   rd   rU   rU   rV   rO   	     z"UrlMappingMatchInfo.http_exceptionc                 C   s
   | j  S r\   )r   rs   rd   rU   rU   rV   rs     rb   zUrlMappingMatchInfo.get_info)r;   .c                 C   
   t | jS r\   )tupler   rd   rU   rU   rV   apps  s   
zUrlMappingMatchInfo.appsrK   r;   Nc                 C   s0   | j rtd| jd u r|| _| jd| d S )Nz-Cannot change apps stack after .freeze() callr   )r   RuntimeErrorr   r   insertr`   rK   rU   rU   rV   add_app  s
   
zUrlMappingMatchInfo.add_appc                 C   s   | j }|d us	J |S r\   )r   r   rU   rU   rV   current_app  s   zUrlMappingMatchInfo.current_app)NNNc                 c   sJ    t r|| jvrtd| j|| j}|| _z	d V  W || _d S || _w )Nz1Expected one of the following apps {!r}, got {!r})r#   r   r   formatr   )r`   rK   prevrU   rU   rV   set_current_app!  s   
z#UrlMappingMatchInfo.set_current_appc                 C   s
   d| _ d S )NT)r   rd   rU   rU   rV   ru   1  rb   zUrlMappingMatchInfo.freezec                    s   dt    d| j dS )Nz<MatchInfo z: >)r   __repr__r   rd   r   rU   rV   r   4  s   zUrlMappingMatchInfo.__repr__)rK   r;   rZ   N)rZ   r;   ry   )rP   rQ   rR   r   rS   r7   ra   rz   r%   r   r   r   r   r   r'   rO   rD   rs   r   r   r   r   r   r   r   ru   r   __classcell__rU   rU   r   rV   r2      s(    

c                       sF   e Zd Zdeddf fddZedefddZdefdd	Z  Z	S )
MatchInfoErrorrO   rZ   Nc                    s   || _ t i t| j  d S r\   )
_exceptionr   ra   SystemRouter`   rO   r   rU   rV   ra   9  s   zMatchInfoError.__init__c                 C   rc   r\   )r   rd   rU   rU   rV   rO   =  re   zMatchInfoError.http_exceptionc                 C   s   d | jj| jjS )Nz<MatchInfoError {}: {}>)r   r   statusreasonrd   rU   rU   rV   r   A  s   zMatchInfoError.__repr__)
rP   rQ   rR   r'   ra   rz   rO   rS   r   r   rU   rU   r   rV   r   8  s
    r   rk   rZ   c                    sP   | j tjd}| jtkr&| dkr| jdI dH  dS t	d| ddS )zDefault handler for Expect header.

    Just send "100 Continue" to client.
    raise HTTPExpectationFailed if value of header is not "100-continue"
     z100-continues   HTTP/1.1 100 Continue

NzUnknown Expect: %s)text)
headersgetr   EXPECTversionr$   lowerwriterwriter(   )rk   expectrU   rU   rV   r   G  s   
r   c                	       s   e Zd Zdddee ddf fddZddded	eee e	f d
ee
 ddfddZdddZdedefddZejdedeeeef  fddZdefddZded fddZ  ZS )r4   NrX   rY   rZ   c                   s   t  j|d g | _d S )NrX   )r   ra   _routesr_   r   rU   rV   ra   V     
zResource.__init__r   r   r   r   r8   c                C   sP   | j D ]}|j|ks|jtjkrtdj|dqt||| |d}| | |S )NzOAdded route will never be executed, method {route.method} is already registered)r   r   )r   r   r   METH_ANYr   r   r8   register_route)r`   r   r   r   	route_objrU   rU   rV   	add_routeZ  s   

zResource.add_router   c                 C   s(   t |tsJ d|| j| d S )Nz)Instance of Route class is required, got )r   r8   r   appendr`   r   rU   rU   rV   r   n  s   zResource.register_routerk   c                    sp   t  }| |jj}|d u rd |fS | jD ]}|j}|| ||jks*|tjkr3t	|||f  S qd |fS r\   )
set_matchrel_urlraw_pathr   r   addr   r   r2   )r`   rk   allowed_methodsr   r   route_methodrU   rU   rV   rn   t  s   

zResource.resolverE   c                 C   rt   r\   rU   rw   rU   rU   rV   r     r   zResource._matchc                 C   r   r\   lenr   rd   rU   rU   rV   __len__  rb   zResource.__len__c                 C   r   r\   )iterr   rd   rU   rU   rV   __iter__  rb   zResource.__iter__)r   r8   rZ   N)rP   rQ   rR   r   rS   ra   r   r   r"   r%   r   r   r   r-   r}   rn   r{   r|   r   r   intr   r   r   r   rU   rU   r   rV   r4   U  s$     	

 r4   c                       s   e Zd Zdddedee ddf fddZedefdd	Zdd
dZdeddfddZ	dedee
eef  fddZdedefddZdefddZdefddZdefddZ  ZS )r5   NrX   rE   rY   rZ   c                   s*   t  j|d |r|dsJ || _d S )NrX   rA   )r   ra   
startswith_path)r`   rE   rY   r   rU   rV   ra     s   
zPlainResource.__init__c                 C   rc   r\   r   rd   rU   rU   rV   rg     re   zPlainResource.canonicalc                 C   s   | j sd| _ d S d S )NrA   r   rd   rU   rU   rV   ru     s   
zPlainResource.freezerI   c                 C   s<   | dsJ |drJ t|dksJ || j | _d S NrA   r   )r   endswithr   r   rp   rU   rU   rV   rq     s   zPlainResource.add_prefixc                 C   s   | j |kri S d S r\   r   rw   rU   rU   rV   r     s   
zPlainResource._matchc                 C   
   | j |kS r\   r   rw   rU   rU   rV   rx     rb   zPlainResource.raw_matchc                 C   
   d| j iS )NrE   r   rd   rU   rU   rV   rs     rb   zPlainResource.get_infoc                 C   s   t j| jddS NTrE   encoded)r   buildr   rd   rU   rU   rV   rj        zPlainResource.url_forc                 C   s0   | j d urd| j  d nd}d| d| j dS )N'' r   z<PlainResource  r   )rY   r   r_   rU   rU   rV   r     s   zPlainResource.__repr__ry   )rP   rQ   rR   rS   r   ra   rz   rg   ru   rq   r   r   r~   rx   rD   rs   r   rj   r   r   rU   rU   r   rV   r5     s    $
r5   c                       s   e Zd ZedZedZdZdddede	e ddf fd	d
Z
edefddZdeddfddZdede	eeef  fddZdedefddZdefddZdedefddZdefddZ  ZS )r6   z#\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*)\}z.\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*):(?P<re>.+)\}z[^{}/]+NrX   rE   rY   rZ   c          	   
      sX  t  j|d d}d}t|D ]d}| j|}|r2|d|d| j7 }|d|d d 7 }q| j	|}|rR|djdi |
 7 }|d|d d 7 }qd|v sZd|v retd| d	| d
t|}||7 }|t|7 }qzt|}W n tjy } ztd| d| d d }~ww |jtsJ |dsJ || _|| _d S )NrX   r   z
(?P<{}>{})var{}z(?P<{var}>{re})zInvalid path 'z'['z']zBad pattern 'z': rA   rU   )r   ra   r@   splitDYN	fullmatchr   groupGOODDYN_WITH_RE	groupdictr   _requote_pathreescapecompileerrorrG   r   rB   _pattern
_formatter)	r`   rE   rY   rG   rF   partr   compiledexcr   rU   rV   ra     s:   
zDynamicResource.__init__c                 C   rc   r\   r  rd   rU   rU   rV   rg     re   zDynamicResource.canonicalrI   c                 C   sV   | dsJ |drJ t|dksJ tt|| jj | _|| j | _d S r   )	r   r   r   r   r   r   r  rG   r  rp   rU   rU   rV   rq     s
   zDynamicResource.add_prefixc                 C   s.   | j |}|d u rd S dd |  D S )Nc                 S      i | ]	\}}|t |qS rU   )_unquote_path).0keyvaluerU   rU   rV   
<dictcomp>  s    z*DynamicResource._match.<locals>.<dictcomp>)r  r   r   items)r`   rE   r   rU   rU   rV   r     s   
zDynamicResource._matchc                 C   r   r\   r  rw   rU   rU   rV   rx     rb   zDynamicResource.raw_matchc                 C      | j | jdS )N)rF   rG   )r  r  rd   rU   rU   rV   rs        zDynamicResource.get_infopartsc                 K   s(   | j dd | D }tj|ddS )Nc                 S   r  rU   )_quote_path)r	  kvrU   rU   rV   r    s    z+DynamicResource.url_for.<locals>.<dictcomp>Tr   )r  
format_mapr  r   r   )r`   r  urlrU   rU   rV   rj     s   zDynamicResource.url_forc                 C   s,   | j d urd| j  d nd}dj|| jdS )Nr   r   r   z$<DynamicResource {name} {formatter}>)rY   rF   )rY   r   r  r_   rU   rU   rV   r     s   zDynamicResource.__repr__)rP   rQ   rR   r   r   r   r   r   rS   r   ra   rz   rg   rq   r   r   r~   rx   rD   rs   r   rj   r   r   rU   rU   r   rV   r6     s    

$!	r6   c                       sj   e Zd Zdddedee ddf fddZedefdd	Zdeddfd
dZdede	fddZ
  ZS )PrefixResourceNrX   rI   rY   rZ   c                   sX   |r| dsJ ||dv s|drJ |t j|d t|| _| jd | _d S )NrA   )r   rA   rX   )r   r   r   ra   r   _prefix_prefix2)r`   rI   rY   r   rU   rV   ra     s
   
zPrefixResource.__init__c                 C   rc   r\   )r  rd   rU   rU   rV   rg     re   zPrefixResource.canonicalc                 C   sH   | dsJ |drJ t|dksJ || j | _| jd | _d S r   )r   r   r   r  r  rp   rU   rU   rV   rq     s
   zPrefixResource.add_prefixc                 C   rf   r   rU   rp   rU   rU   rV   rx     rv   zPrefixResource.raw_match)rP   rQ   rR   rS   r   ra   rz   rg   rq   r~   rx   r   rU   rU   r   rV   r    s    $r  c                       s  e Zd ZdZddddddddededee d	ee d
ede	de	de	ddf fddZ
dddedee	 defddZededefddZdefddZdeddfddZdedefddZdefd d!Zdee fd"d#Zdedefd$d%Zd&edefd'd(Zdefd)d*Z  Z S )+r9   r  N   FrY   r   
chunk_size
show_indexfollow_symlinksappend_versionrI   rH   rY   r   r  r  r  r  rZ   c          
   
      s   t  j||d z#t|}t|drttjt|}| }|	 s*t
dW n tt
fyB }	 z	t
d| d|	d }	~	ww || _|| _|| _|| _|| _|| _td| j| |dtd| j| |dd	| _d S )
NrX   ~zNot a directoryzNo directory exists at 'r   GETr   HEAD)r   r!  )r   ra   r   rS   r   osrE   
expanduserrn   is_dirr   FileNotFoundError
_directory_show_index_chunk_size_follow_symlinksr   _append_versionr8   _handler   )
r`   rI   rH   rY   r   r  r  r  r  r   r   rU   rV   ra   "  s4   

zStaticResource.__init__)r  filenamec          
   	   C   s  |d u r| j }t|d}tj| jdd}tdk r#||dd }n|| }|r| j	|}z"| j
rFttj|}|| j | }n
| }|| j W n ttfy^   | Y S w | r|d}| }W d    n1 sww   Y  | |}	|| j|	i}|S |S )NrA   Tr   r      %%25rb)r*  rS   lstripr   r   r  r>   replacer&  joinpathr)  r   r"  rE   normpathrelative_torn   r   r%  is_fileopenread_get_file_hash
with_queryVERSION_KEY)
r`   r,  r  r  unresolved_pathnormalized_pathfilepathf
file_byteshrU   rU   rV   rj   H  s8   


zStaticResource.url_for
byte_arrayc                 C   s*   t  }||  t| }|dS )Nascii)hashlibsha256updatebase64urlsafe_b64encodedigestdecode)rC  mb64rU   rU   rV   r:  q  s   

zStaticResource._get_file_hashc                 C   s   | j | j| jdS )N)rH   rI   rJ   )r&  r  r   rd   rU   rU   rV   rs   x  s   zStaticResource.get_infor   c                 C   s.   d| j v r	tdtd|| | jd| j d< d S )NOPTIONSzOPTIONS route was set alreadyr   )r   r   r8   r   )r`   r   rU   rU   rV   set_options_route  s
   

z StaticResource.set_options_routerk   c                    s|   |j j}|j}t| j}|| js|| jkrd t fS ||vr%d |fS dt|t	| jd d  i}t
|| j| |fS )Nr,  r   )r   r   r   r   r   r   r  r  r  r   r2   )r`   rk   rE   r   r   r   rU   rU   rV   rn     s   

zStaticResource.resolvec                 C   r   r\   r   rd   rU   rU   rV   r     rb   zStaticResource.__len__c                 C   s   t | j S r\   )r   r   valuesrd   rU   rU   rV   r     r  zStaticResource.__iter__c              
      s(  |j d }z2t|}|jrt | j|}| jr-ttj	|}|
| j | }n
| }|
| j W n/ ttfyJ } zt |d }~w tyQ     tyg } z|jj| t |d }~ww | r| jrz
t| |ddW S  ty   t w t | rt|| jdS t)Nr,  z	text/html)r   content_type)r  )
match_infor   anchorr)   r&  r4  r)  r"  rE   r5  r6  rn   r   r%  r+   	ExceptionrK   logger	exceptionr$  r'  r.   _directory_as_htmlPermissionErrorr7  r,   r(  )r`   rk   r   r,  r=  r>  r?  r   rU   rU   rV   r+    sJ   


zStaticResource._handler?  c                 C   s   |  sJ || j }dt| }d| d}g }| }t|D ]0}|| j }t| j d| }	|  rD|j	 d}
n|j	}
|
d|	 dt|
 d q%dd	|}d
| d	| d}d| d}d| d	| d}|S )Nz
Index of /z<h1>z</h1>rA   z<li><a href="z">z	</a></li>z<ul>
{}
</ul>
z<body>
z
</body>z<head>
<title>z</title>
</head>z<html>
z
</html>)r$  r6  r&  as_posixhtml_escapeiterdirsortedr  r  rY   r   r   join)r`   r?  relative_path_to_dirindex_ofh1
index_list	dir_index_filerel_pathquoted_file_url	file_nameulbodyhead_strhtmlrU   rU   rV   rW    s(   z!StaticResource._directory_as_htmlc                 C   s0   | j d urd| j  d nd}dj|| j| jdS )Nr   r   z/<StaticResource {name} {path} -> {directory!r}>)rY   rE   rH   )rY   r   r  r&  r_   rU   rU   rV   r     s   
zStaticResource.__repr__)!rP   rQ   rR   r<  rS   r&   r   r   r   r~   ra   r   rj   staticmethodbytesr:  rD   rs   r%   rO  r-   r}   rn   r   r   r7   r   r/   r+  r   rW  r   r   rU   rU   r   rV   r9     sZ    	
*
)+"r9   c                       s   e Zd Zdeddddf fddZdeddf fdd	Zd
ededefddZdefddZ	de
defddZdefddZdee fddZdefddZ  ZS )PrefixedSubAppResourcerI   rK   r;   rZ   Nc                    s0   t  | || _|j D ]}|| qd S r\   )r   ra   _approuter	resourcesrq   )r`   rI   rK   r   r   rU   rV   ra     s
   zPrefixedSubAppResource.__init__c                    s,   t  | | jj D ]}|| qd S r\   )r   rq   ro  rp  rq  )r`   rI   r   r   rU   rV   rq     s   z!PrefixedSubAppResource.add_prefixr   ri   c                 O      t d)Nz3.url_for() is not supported by sub-application rootr   r   rU   rU   rV   rj        zPrefixedSubAppResource.url_forc                 C   r  )N)rK   rI   )ro  r  rd   rU   rU   rV   rs     r  zPrefixedSubAppResource.get_infork   c                    st   |j j| js|j j| jkrd t fS | jj|I d H }|	| j t
|jtr3|jj}||fS t }||fS r\   )r  r   r   r  r  r   ro  rp  rn   r   r   rO   r*   r   r`   rk   rR  methodsrU   rU   rV   rn     s   
zPrefixedSubAppResource.resolvec                 C      t | jj S r\   )r   ro  rp  rJ   rd   rU   rU   rV   r     r   zPrefixedSubAppResource.__len__c                 C   rw  r\   )r   ro  rp  rJ   rd   rU   rU   rV   r     r   zPrefixedSubAppResource.__iter__c                 C   s   dj | j| jdS )Nz,<PrefixedSubAppResource {prefix} -> {app!r}>)rI   rK   )r   r  ro  rd   rU   rU   rV   r     s   zPrefixedSubAppResource.__repr__)rP   rQ   rR   rS   ra   rq   r   rj   rD   rs   r-   r}   rn   r   r   r   r7   r   r   r   rU   rU   r   rV   rn    s    rn  c                   @   sP   e Zd ZejdedefddZejdefddZ	e
ejdefddZd	S )
rM   rk   rZ   c                    rl   )z1Return bool if the request satisfies the criteriaNrU   rm   rU   rU   rV   r     ro   zAbstractRuleMatching.matchc                 C   rf   rr   rU   rd   rU   rU   rV   rs     rh   zAbstractRuleMatching.get_infoc                 C   rf   )zReturn a strNrU   rd   rU   rU   rV   rg   "  rh   zAbstractRuleMatching.canonicalN)rP   rQ   rR   r{   r|   r-   r~   r   rD   rs   rz   rS   rg   rU   rU   rU   rV   rM     s    rM   c                       s   e Zd ZedZdeddf fddZedefddZ	dedefd	d
Z
dedefddZdedefddZdefddZ  ZS )Domainz(?!-)[a-z\d-]{1,63}(?<!-)rL   rZ   Nc                    s   t    | || _d S r\   )r   ra   
validation_domain)r`   rL   r   rU   rV   ra   +  s   
zDomain.__init__c                 C   rc   r\   rz  rd   rU   rU   rV   rg   /  re   zDomain.canonicalc                    s   t |ts	td|d }|stdd|v rtdtd| }|jd us+J t fdd|j	dD s>td	|j
d
krF|jS |j d|j
 S )NzDomain must be strr<   zDomain cannot be emptyz://zScheme not supportedzhttp://c                 3   s    | ]	} j |V  qd S r\   )re_partr   )r	  xrd   rU   rV   	<genexpr>=  s    z$Domain.validation.<locals>.<genexpr>zDomain not validP   :)r   rS   	TypeErrorrstripr   r   r   raw_hostallr   port)r`   rL   r  rU   rd   rV   ry  3  s   

zDomain.validationrk   c                    s"   |j tj}|sdS | |S r   )r   r   r   HOSTmatch_domain)r`   rk   hostrU   rU   rV   r   C  s
   
zDomain.matchr  c                 C   s   |  | jkS r\   )r   rz  r`   r  rU   rU   rV   r  I  r  zDomain.match_domainc                 C   r   )NrL   r{  rd   rU   rU   rV   rs   L  rb   zDomain.get_info)rP   rQ   rR   r   r   r|  rS   ra   rz   rg   ry  r-   r~   r   r  rD   rs   r   rU   rU   r   rV   rx  (  s    
rx  c                       sT   e Zd ZedZdeddf fddZedefddZ	d	ede
fd
dZ  ZS )
MaskDomainz(?!-)[a-z\d\*-]{1,63}(?<!-)rL   rZ   Nc                    s2   t  | | jdddd}t|| _d S )Nr<   z\.*z.*)r   ra   rz  r3  r   r   _mask)r`   rL   maskr   rU   rV   ra   S  s   zMaskDomain.__init__c                 C   r   r\   )r  rG   rd   rU   rU   rV   rg   X  r   zMaskDomain.canonicalr  c                 C   s   | j |d uS r\   )r  r   r  rU   rU   rV   r  \  r   zMaskDomain.match_domain)rP   rQ   rR   r   r   r|  rS   ra   rz   rg   r~   r  r   rU   rU   r   rV   r  P  s    
r  c                   @   sb   e Zd ZdeddddfddZedefdd	Zdefd
dZ	de
defddZdefddZdS )MatchedSubAppResourcerN   rK   r;   rZ   Nc                 C   s    t |  d| _|| _|| _d S )Nr   )r3   ra   r  ro  _rule)r`   rN   rK   rU   rU   rV   ra   a  s   

zMatchedSubAppResource.__init__c                 C   r   r\   )r  rg   rd   rU   rU   rV   rg   g  r   zMatchedSubAppResource.canonicalc                 C   r  )N)rK   rN   )ro  r  rd   rU   rU   rV   rs   k  r  zMatchedSubAppResource.get_infork   c                    sh   | j |I d H sd t fS | jj|I d H }|| j t|jt	r-|jj
}||fS t }||fS r\   )r  r   r   ro  rp  rn   r   r   rO   r*   r   ru  rU   rU   rV   rn   n  s   
zMatchedSubAppResource.resolvec                 C   s   dj | jdS )Nz"<MatchedSubAppResource -> {app!r}>)rK   )r   ro  rd   rU   rU   rV   r   y  r  zMatchedSubAppResource.__repr__)rP   rQ   rR   rM   ra   rz   rS   rg   rD   rs   r-   r}   rn   r   rU   rU   rU   rV   r  `  s    r  c                       s   e Zd ZdZdddedeeee f de	de
e ddf
 fd	d
ZdefddZede
e fddZdededefddZdefddZ  ZS )r8   zA route with resourceNr   r   r   r   r   rZ   c                   s   t  j||||d d S )Nr   )r   ra   )r`   r   r   r   r   r   rU   rV   ra     s   
zResourceRoute.__init__c                 C   s   dj | j| j| jdS )Nz3<ResourceRoute [{method}] {resource} -> {handler!r})r   r   r   )r   r   r   r   rd   rU   rU   rV   r     s   zResourceRoute.__repr__c                 C   s   | j d u rd S | j jS r\   )r   rY   rd   rU   rU   rV   rY     s   
zResourceRoute.namer   ri   c                 O   s    | j dusJ | j j|i |S r   )r   rj   r   rU   rU   rV   rj     s   zResourceRoute.url_forc                 C   s   | j d usJ | j  S r\   )r   rs   rd   rU   rU   rV   rs     r   zResourceRoute.get_info)rP   rQ   rR   __doc__rS   r   r%   r   r"   r3   r   r   ra   r   rz   rY   r   rj   rD   rs   r   rU   rU   r   rV   r8   }  s&    r8   c                       s   e Zd Zdeddf fddZdededefdd	Zede	e fd
dZ
defddZdedefddZedefddZedefddZdefddZ  ZS )r   rO   rZ   Nc                    s   t  tj| j || _d S r\   )r   ra   r   r   r+  _http_exceptionr   r   rU   rV   ra     s   
zSystemRoute.__init__r   ri   c                 O   rr  )Nz).url_for() is not allowed for SystemRouters  r   rU   rU   rV   rj     rt  zSystemRoute.url_forc                 C   rt   r\   rU   rd   rU   rU   rV   rY     r   zSystemRoute.namec                 C   r   )NrO   r  rd   rU   rU   rV   rs     rb   zSystemRoute.get_infork   c                    s   | j r\   r  rm   rU   rU   rV   r+    s   zSystemRoute._handlec                 C   r   r\   )r  r   rd   rU   rU   rV   r     r   zSystemRoute.statusc                 C   r   r\   )r  r   rd   rU   rU   rV   r     r   zSystemRoute.reasonc                 C   s   dj | dS )Nz*<SystemRoute {self.status}: {self.reason}>rd   )r   rd   rU   rU   rV   r        zSystemRoute.__repr__)rP   rQ   rR   r'   ra   rS   r   rj   rz   r   rY   rD   rs   r-   r/   r+  r   r   r   r   r   rU   rU   r   rV   r     s    r   c                   @   s@   e Zd ZdefddZdeedef fddZdefddZ	dS )	r:   rZ   c                    sZ   | j jtjvr|   t| | j j d }|d u r|   | I d H }t|ts+J |S r\   )	rk   r   r   METH_ALL_raise_allowed_methodsgetattrr   r   r/   )r`   r   retrU   rU   rV   _iter  s   z
View._iterNc                 C   s   |    S r\   )r  	__await__rd   rU   rU   rV   r    r  zView.__await__c                    s"    fddt jD }t jj|)Nc                    s   h | ]}t  | r|qS rU   )hasattrr   )r	  rL  rd   rU   rV   	<setcomp>  s    z.View._raise_allowed_methods.<locals>.<setcomp>)r   r  r*   rk   r   )r`   r   rU   rd   rV   r    s   zView._raise_allowed_methods)
rP   rQ   rR   r/   r  r   r   r  r   r  rU   rU   rU   rV   r:     s    r:   c                   @   sT   e Zd Zdee ddfddZdefddZdee fdd	Z	d
e
defddZdS )ResourcesViewrq  rZ   Nc                 C   r[   r\   
_resources)r`   rq  rU   rU   rV   ra     rb   zResourcesView.__init__c                 C   r   r\   )r   r  rd   rU   rU   rV   r     rb   zResourcesView.__len__c                 c       | j E d H  d S r\   r  rd   rU   rU   rV   r     r   zResourcesView.__iter__r   c                 C   
   || j v S r\   r  r`   r   rU   rU   rV   __contains__  rb   zResourcesView.__contains__)rP   rQ   rR   r   r3   ra   r   r   r   r   objectr~   r  rU   rU   rU   rV   r    s
    r  c                   @   sP   e Zd Zdee fddZdefddZdee	 fddZ
d	edefd
dZdS )
RoutesViewrq  c                 C   s*   g | _ |D ]}|D ]}| j | q	qd S r\   )r   r   )r`   rq  r   r   rU   rU   rV   ra     s   zRoutesView.__init__rZ   c                 C   r   r\   r   rd   rU   rU   rV   r     rb   zRoutesView.__len__c                 c   r  r\   r   rd   rU   rU   rV   r     r   zRoutesView.__iter__r   c                 C   r  r\   r  r   rU   rU   rV   r    rb   zRoutesView.__contains__N)rP   rQ   rR   r   r3   ra   r   r   r   r7   r   r  r~   r  rU   rU   rU   rV   r    s
    r  c                       sv  e Zd ZedZdH fddZdedefddZ	de
e fd	d
ZdefddZdedefddZdedefddZdefddZdefddZdeeef fddZdeddfddZdddedee defddZdddd eded!eee e! f dee d"ee" de#fd#d$Z$ddd%d&d&d&d'd(ede%dee d"ee" d)ed*ed+ed,edefd-d.Z&ded!ed/e'de#fd0d1Z(ded!ed/e'de#fd2d3Z)dd4d5ded!edee d6ed/e'de#fd7d8Z*ded!ed/e'de#fd9d:Z+ded!ed/e'de#fd;d<Z,ded!ed/e'de#fd=d>Z-ded!ed/e'de#fd?d@Z.ded!e e! d/e'de#fdAdBZ/dH fdCdDZ0dEe1e2 de3e# fdFdGZ4  Z5S )Ir1   z[.:-]rZ   Nc                    s   t    g | _i | _d S r\   )r   ra   r  _named_resourcesrd   r   rU   rV   ra     s   

zUrlDispatcher.__init__rk   c                    sb   |j }t }| jD ]}||I d H \}}|d ur|  S ||O }q
|r,tt||S tt S r\   )r   r   r  rn   r   r*   r+   )r`   rk   r   r   r   r   allowedrU   rU   rV   rn     s   


zUrlDispatcher.resolvec                 C   r   r\   )r   r  rd   rU   rU   rV   r     rb   zUrlDispatcher.__iter__c                 C   r   r\   )r   r  rd   rU   rU   rV   r     rb   zUrlDispatcher.__len__r   c                 C   r  r\   r  r  rU   rU   rV   r    rb   zUrlDispatcher.__contains__rY   c                 C   s
   | j | S r\   r  r_   rU   rU   rV   __getitem__  rb   zUrlDispatcher.__getitem__c                 C   r   r\   )r  r  rd   rU   rU   rV   rq    rb   zUrlDispatcher.resourcesc                 C   r   r\   )r  r  rd   rU   rU   rV   rJ     rb   zUrlDispatcher.routesc                 C   r   r\   )r   r  rd   rU   rU   rV   named_resources  rb   zUrlDispatcher.named_resourcesc                 C   s   t |tsJ d|| jrtd|j}|d urR| j|}|D ]}t|r1t	d|d|
 s<t	d|q"|| jv rMt	d|| j| || j|< | j| d S )Nz4Instance of AbstractResource class is required, got z.Cannot register a resource into frozen router.zIncorrect route name z/, python keywords cannot be used for route namezoIncorrect route name {!r}, the name should be a sequence of python identifiers separated by dash, dot or columnz'Duplicate {!r}, already handled by {!r})r   r3   frozenr   rY   NAME_SPLIT_REr   keyword	iskeywordr   isidentifierr   r  r  r   )r`   r   rY   r  r  rU   rU   rV   register_resource   s8   



zUrlDispatcher.register_resourcerX   rE   c                C   s   |r| dstd| jr"| jd }|j|kr"||r"tt|S d|v s>d|v s>t|s>t	t
||d}| | |S t||d}| | |S )NrA   z)path should be started with / or be emptyr   r   rX   )r   r   r  rY   rx   r   r4   r@   searchr5   r   r  r6   )r`   rE   rY   r   rU   rU   rV   add_resourceA  s   



zUrlDispatcher.add_resource)rY   r   r   r   r   c                C   s   | j ||d}|j|||dS )NrX   r   )r  r   )r`   r   rE   r   rY   r   r   rU   rU   rV   r   Q  s   	zUrlDispatcher.add_router  Fr  rI   r  r  r  r  c          
   
   C   sJ   | dsJ |dr|dd }t||||||||d}	| |	 |	S )z^Add static files view.

        prefix - url prefix
        path - folder with files

        rA   Nr  r  )r   r   r9   r  )
r`   rI   rE   rY   r   r  r  r  r  r   rU   rU   rV   
add_static]  s   


zUrlDispatcher.add_staticri   c                 K      | j tj||fi |S )z(Shortcut for add_route with method HEAD.)r   r   	METH_HEADr`   rE   r   ri   rU   rU   rV   add_head     zUrlDispatcher.add_headc                 K   r  )z+Shortcut for add_route with method OPTIONS.)r   r   METH_OPTIONSr  rU   rU   rV   add_options  r  zUrlDispatcher.add_optionsT)rY   
allow_headr  c                K   s>   | j ||d}|r|jtj|fi | |jtj|fi |S )zShortcut for add_route with method GET.

        If allow_head is true, another
        route is added allowing head requests to the same endpoint.
        rX   )r  r   r   r  METH_GET)r`   rE   r   rY   r  ri   r   rU   rU   rV   add_get  s   zUrlDispatcher.add_getc                 K   r  )z(Shortcut for add_route with method POST.)r   r   	METH_POSTr  rU   rU   rV   add_post  r  zUrlDispatcher.add_postc                 K   r  )z'Shortcut for add_route with method PUT.)r   r   METH_PUTr  rU   rU   rV   add_put  r  zUrlDispatcher.add_putc                 K   r  )z)Shortcut for add_route with method PATCH.)r   r   
METH_PATCHr  rU   rU   rV   	add_patch  r  zUrlDispatcher.add_patchc                 K   r  )z*Shortcut for add_route with method DELETE.)r   r   METH_DELETEr  rU   rU   rV   
add_delete  r  zUrlDispatcher.add_deletec                 K   r  )z?Shortcut for add_route with ANY methods for a class-based view.)r   r   r   r  rU   rU   rV   add_view  s   zUrlDispatcher.add_viewc                    s"   t    | jD ]}|  qd S r\   )r   ru   r  r  r   rU   rV   ru     s   


zUrlDispatcher.freezerJ   c                 C   s"   g }|D ]
}| ||  q|S )zAppend routes to route table.

        Parameter should be a sequence of RouteDef objects.

        Returns a list of registered AbstractRoute instances.
        )extendregister)r`   rJ   registered_routes	route_defrU   rU   rV   
add_routes  s   zUrlDispatcher.add_routesry   )6rP   rQ   rR   r   r   r  ra   r-   r2   rn   r   rS   r   r   r   r  r~   r  r3   r  r  rq  r  rJ   r   r  r  r   r4   r  r   r%   r   r"   r   r7   r   r&   r  r   r  r  r  r  r  r  r  r  ru   r   r0   r   r  r   rU   rU   r   rV   r1     s    
 !
	

"	

"r1   r  c                 C   s$   t dk r
| dd} tj| ddjS )Nr-  r/  r0  Fr   )r>   r3  r   r   r   r  rU   rU   rV   r    s   r  c                 C   s   t j| ddjS r   )r   r   rE   r  rU   rU   rV   r    r   r  c                 C   s    t | }d| v r|dd}|S )Nr/  r0  )r  r3  )r  r   rU   rU   rV   r     s   r   )wr{   r   rH  	functoolsrE  rk  r   r  r"  r   r   
contextlibr   r   pathlibr   typesr   typingr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   yarlr   r   yarl_versionr   r   r    r!   r"   helpersr#   httpr$   typedefsr%   r&   web_exceptionsr'   r(   r)   r*   r+   web_fileresponser,   web_requestr-   web_responser.   r/   web_routedefr0   __all__web_appr;   rS   BaseDictdictr   mapr   r   r>   rT   r   r?   r@   r   rB   r   r}   partialr[  rD   r3   ABCr7   r2   r   r   r4   r5   r6   r  r9   rn  rM   rx  r  r  r8   r   r:   r  r  r1   r  r  r   rU   rU   rU   rV   <module>   s   
 `0/QC<)L O,($ Q