a
    }3e;                     @   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	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$ 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l0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZBmCZC ddlDmEZE dZFerddlGmHZH eeIeIf ZJneKZJeLeMeNe(Oddd ZPe3e!eNdf  eQd< eRdZSe3eeI  eQd< eRdZTe3eeI  eQd< eUdZVe3eI eQd< ee@ged f ZWe!ed eeI f ZXG d d! d!e6d"d#ZYG d$d% d%e ed& ZZG d'd& d&e j[Z\G d(d deJe+Z]G d)d* d*e]Z^e@dd+d,d-Z_G d.d/ d/eZZ`G d0d1 d1e`ZaG d2d3 d3e`ZbG d4d5 d5eZZcG d6d7 d7ecZdG d8d9 d9ecZeG d:d; d;e j[ZfG d<d= d=efZgG d>d? d?egZhG d@dA dAeeZiG dBdC dCe\ZjG dDdE dEe\ZkG dFdG dGe-ZlG dHdI dIe eeZ eeZ ZmG dJdK dKe ee\ ee\ ZnG dLdM dMe,eeIeZf ZoeIeIdNdOdPZpeIeIdNdQdRZqeIeIdNdSdTZrdS )U    N)contextmanager)wraps)Path)MappingProxyType)TYPE_CHECKINGAny	AwaitableCallable	ContainerDict	GeneratorIterableIteratorListMappingOptionalPatternSetSizedTupleTypeUnioncast)URL__version__   )hdrs)AbstractMatchInfoAbstractRouterAbstractView)DEBUG)HttpVersion11)FinalHandlerPathLike	TypedDict)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_SEPr1   c                   @   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prefixr6   routesr:   appdomainAbstractRuleMatchingrulehttp_exceptionN)	__name__
__module____qualname__str__annotations__r   r   r   r&    rS   rS   L/home/pi/bot/my_env/lib/python3.9/site-packages/aiohttp/web_urldispatcher.pyrB   [   s   
rB   F)totalc                   @   s   e Zd Zddee ddddZeee dddZeej	edd	d
Z
ej	eedddZej	eedddZej	eddddZej	edddZddddZej	eedddZdS )r2   NnamerW   returnc                C   s
   || _ d S N_nameselfrW   rS   rS   rT   __init__o   s    zAbstractResource.__init__rY   c                 C   s   | j S rZ   r[   r^   rS   rS   rT   rW   r   s    zAbstractResource.namec                 C   s   dS )zWExposes the resource's canonical path.

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

        NrS   ra   rS   rS   rT   	canonicalv   s    zAbstractResource.canonical)kwargsrY   c                 K   s   dS )z2Construct url for resource with additional params.NrS   )r^   rc   rS   rS   rT   url_for   s    zAbstractResource.url_forrequestrY   c                    s   dS )zWResolve resource.

        Return (UrlMappingMatchInfo, allowed_methods) pair.
        NrS   r^   rf   rS   rS   rT   resolve   s    zAbstractResource.resolverG   rY   c                 C   s   dS )zWAdd a prefix to processed URLs.

        Required for subapplications support.
        NrS   r^   rG   rS   rS   rT   
add_prefix   s    zAbstractResource.add_prefixc                 C   s   dS z;Return a dict with additional info useful for introspectionNrS   ra   rS   rS   rT   get_info   s    zAbstractResource.get_infoc                 C   s   d S rZ   rS   ra   rS   rS   rT   freeze   s    zAbstractResource.freezerC   rY   c                 C   s   dS )z Perform a raw match against pathNrS   r^   rC   rS   rS   rT   	raw_match   s    zAbstractResource.raw_match)rN   rO   rP   r   rQ   r_   propertyrW   abcabstractmethodrb   r   rd   r,   _Resolverh   rk   rB   rm   rn   boolrq   rS   rS   rS   rT   r2   n   s"   r2   r6   c                   @   s   e Zd Zdddeeeee f ee	 ee
 ddddZeedddZeedd	d
Zeejee dddZeee
 dddZejedddZejeeedddZeddddZdS )r6   Nexpect_handlerresource)methodhandlerrx   ry   rY   c                   s   |d u rt }t|s$J d|| }t|sDt| dt|sTJ |t|r`n^t	|rxt
dt nFt|trt|trn0t
dt t|ttd 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 onesre   c                    s     | }t |r|I d H S |S rZ   )asyncioiscoroutine)rf   resultZold_handlerrS   rT   handler_wrapper   s    

z/AbstractRoute.__init__.<locals>.handler_wrapper)_default_expect_handlerr|   iscoroutinefunctionupperr>   match
ValueErrorcallableinspectisgeneratorfunctionwarningswarnDeprecationWarning
isinstancetype
issubclassr   r   r,   r.   _method_handler_expect_handler	_resource)r^   rz   r{   rx   ry   r   rS   r   rT   r_      s>    	


zAbstractRoute.__init__r`   c                 C   s   | j S rZ   )r   ra   rS   rS   rT   rz      s    zAbstractRoute.methodc                 C   s   | j S rZ   )r   ra   rS   rS   rT   r{      s    zAbstractRoute.handlerc                 C   s   dS )z8Optional route's name, always equals to resource's name.NrS   ra   rS   rS   rT   rW      s    zAbstractRoute.namec                 C   s   | j S rZ   )r   ra   rS   rS   rT   ry      s    zAbstractRoute.resourcec                 C   s   dS rl   rS   ra   rS   rS   rT   rm      s    zAbstractRoute.get_infoargsrc   rY   c                 O   s   dS z/Construct url for route with additional params.NrS   r^   r   rc   rS   rS   rT   rd      s    zAbstractRoute.url_forre   c                    s   |  |I d H  d S rZ   )r   rg   rS   rS   rT   handle_expect_header   s    z"AbstractRoute.handle_expect_header)rN   rO   rP   rQ   r   r#   r   r   r   _ExpectHandlerr2   r_   rr   rz   r{   rs   rt   rW   ry   rB   rm   r   rd   r,   r   rS   rS   rS   rT   r6      s.   2c                       s   e Zd Zeeef ed fddZeedddZ	eedddZ
eedd	d
Zeee dddZedddZeed dddZdddddZeddddZeded dddZddddZed fddZ  ZS ) r1   )
match_dictroutec                    s(   t  | || _g | _d | _d| _d S NF)superr_   _route_apps_current_app_frozen)r^   r   r   	__class__rS   rT   r_      s
    zUrlMappingMatchInfo.__init__r`   c                 C   s   | j jS rZ   )r   r{   ra   rS   rS   rT   r{      s    zUrlMappingMatchInfo.handlerc                 C   s   | j S rZ   )r   ra   rS   rS   rT   r      s    zUrlMappingMatchInfo.routec                 C   s   | j jS rZ   )r   r   ra   rS   rS   rT   rx      s    z"UrlMappingMatchInfo.expect_handlerc                 C   s   d S rZ   rS   ra   rS   rS   rT   rM     s    z"UrlMappingMatchInfo.http_exceptionc                 C   s
   | j  S rZ   )r   rm   ra   rS   rS   rT   rm     s    zUrlMappingMatchInfo.get_info)r:   .c                 C   s
   t | jS rZ   )tupler   ra   rS   rS   rT   apps  s    zUrlMappingMatchInfo.appsr:   N)rI   rY   c                 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^   rI   rS   rS   rT   add_app  s
    
zUrlMappingMatchInfo.add_appc                 C   s   | j }|d usJ |S rZ   )r   r   rS   rS   rT   current_app  s    zUrlMappingMatchInfo.current_app)NNNc                 c   sJ   t r || jvr td| j|| j}|| _zd V  W || _n|| _0 d S )Nz1Expected one of the following apps {!r}, got {!r})r    r   r   formatr   )r^   rI   prevrS   rS   rT   set_current_app  s    
z#UrlMappingMatchInfo.set_current_appc                 C   s
   d| _ d S )NT)r   ra   rS   rS   rT   rn   )  s    zUrlMappingMatchInfo.freezec                    s   dt    d| j dS )Nz<MatchInfo z: >)r   __repr__r   ra   r   rS   rT   r   ,  s    zUrlMappingMatchInfo.__repr__)rN   rO   rP   r   rQ   r6   r_   rr   r#   r{   r   r   rx   r   r&   rM   rB   rm   r   r   r   r   r   r   r   rn   r   __classcell__rS   rS   r   rT   r1      s&   c                       sD   e Zd Zedd fddZeedddZeddd	Z  Z	S )
MatchInfoErrorNrM   rY   c                    s   || _ t i t| j  d S rZ   )
_exceptionr   r_   SystemRouter^   rM   r   rS   rT   r_   1  s    zMatchInfoError.__init__r`   c                 C   s   | j S rZ   )r   ra   rS   rS   rT   rM   5  s    zMatchInfoError.http_exceptionc                 C   s   d | jj| jjS )Nz<MatchInfoError {}: {}>)r   r   statusreasonra   rS   rS   rT   r   9  s    zMatchInfoError.__repr__)
rN   rO   rP   r&   r_   rr   rM   rQ   r   r   rS   rS   r   rT   r   0  s   r   re   c                    sL   | j tjd}| jtkrH| dkr:| jdI dH  n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   ZEXPECTversionr!   lowerwriterwriter'   )rf   expectrS   rS   rT   r   ?  s
    
r   c                       s   e Zd Zddee dd fddZddeeee e	f ee
 ddd	d
ZdddddZeedddZejeeeeef  dddZedddZee dddZ  ZS )r3   NrV   rX   c                   s   t  j|d g | _d S )NrV   )r   r_   _routesr]   r   rS   rT   r_   N  s    zResource.__init__rx   r7   )rz   r{   rx   rY   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   rz   r   METH_ANYr   r   r7   register_route)r^   rz   r{   rx   	route_objrS   rS   rT   	add_routeR  s    

zResource.add_router   rY   c                 C   s(   t |tsJ d|| j| d S )Nz)Instance of Route class is required, got )r   r7   r   appendr^   r   rS   rS   rT   r   f  s    zResource.register_routere   c                    sn   t  }| |jj}|d u r$d |fS | jD ]:}|j}|| ||jksR|tjkr*t	|||f  S q*d |fS rZ   )
set_matchrel_urlraw_pathr   rz   addr   r   r1   )r^   rf   allowed_methodsr   r   Zroute_methodrS   rS   rT   rh   l  s    

zResource.resolvero   c                 C   s   d S rZ   rS   rp   rS   rS   rT   r   |  s    zResource._matchr`   c                 C   s
   t | jS rZ   lenr   ra   rS   rS   rT   __len__  s    zResource.__len__c                 C   s
   t | jS rZ   )iterr   ra   rS   rS   rT   __iter__  s    zResource.__iter__)rN   rO   rP   r   rQ   r_   r   r   r   r#   r   r   r   r,   ru   rh   rs   rt   r   r   intr   r   r6   r   r   rS   rS   r   rT   r3   M  s   	r3   c                       s   e Zd Zddeee dd fddZeedddZddd	d
ZeddddZ	eee
eef  dddZeedddZedddZedddZedddZ  ZS )r4   NrV   rC   rW   rY   c                   s*   t  j|d |r |ds J || _d S )NrV   r@   )r   r_   
startswith_path)r^   rC   rW   r   rS   rT   r_     s    zPlainResource.__init__r`   c                 C   s   | j S rZ   r   ra   rS   rS   rT   rb     s    zPlainResource.canonicalc                 C   s   | j sd| _ d S )Nr@   r   ra   rS   rS   rT   rn     s    zPlainResource.freezeri   c                 C   s<   | dsJ |drJ t|dks,J || j | _d S Nr@   r   )r   endswithr   r   rj   rS   rS   rT   rk     s    zPlainResource.add_prefixro   c                 C   s   | j |kri S d S d S rZ   r   rp   rS   rS   rT   r     s    
zPlainResource._matchc                 C   s
   | j |kS rZ   r   rp   rS   rS   rT   rq     s    zPlainResource.raw_matchc                 C   s
   d| j iS )NrC   r   ra   rS   rS   rT   rm     s    zPlainResource.get_infoc                 C   s   t j| jddS NTrC   encoded)r   buildr   ra   rS   rS   rT   rd     s    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   )rW   r   r]   rS   rS   rT   r     s    zPlainResource.__repr__)rN   rO   rP   rQ   r   r_   rr   rb   rn   rk   r   r   rv   rq   rB   rm   r   rd   r   r   rS   rS   r   rT   r4     s    r4   c                       s   e Zd ZedZedZdZddee	e dd fddZ
eed	d
dZeddddZee	eeef  dddZeedddZed	ddZeedddZed	ddZ  ZS )r5   z#\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*)\}z.\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*):(?P<re>.+)\}z[^{}/]+NrV   r   c          	   
      sj  t  j|d d}d}t|D ]}| j|}|rd|d|d| j7 }|d|d d 7 }q | j	|}|r|djf i |
 7 }|d|d d 7 }q d|v sd|v rtd| d	| d
t|}||7 }|t|7 }q zt|}W n> tjy6 } z"td| d| d W Y d }~n
d }~0 0 |jtsJJ |dsZJ || _|| _d S )NrV   r   z
(?P<{}>{})var{}z(?P<{var}>{re})zInvalid path 'z'['z']zBad pattern 'z': r@   )r   r_   r?   splitDYN	fullmatchr   groupGOODDYN_WITH_RE	groupdictr   _requote_pathreescapecompileerrorrE   r   rA   _pattern
_formatter)	r^   rC   rW   rE   rD   partr   Zcompiledexcr   rS   rT   r_     s6    ,zDynamicResource.__init__r`   c                 C   s   | j S rZ   r   ra   rS   rS   rT   rb     s    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   rE   r   rj   rS   rS   rT   rk     s
    zDynamicResource.add_prefixro   c                 C   s2   | j |}|d u rd S dd |  D S d S )Nc                 S   s   i | ]\}}|t |qS rS   )_unquote_path).0keyvaluerS   rS   rT   
<dictcomp>  s   z*DynamicResource._match.<locals>.<dictcomp>)r   r   r   items)r^   rC   r   rS   rS   rT   r     s    
zDynamicResource._matchc                 C   s
   | j |kS rZ   r   rp   rS   rS   rT   rq     s    zDynamicResource.raw_matchc                 C   s   | j | jdS )N)rD   rE   )r   r   ra   rS   rS   rT   rm     s    zDynamicResource.get_info)partsrY   c                 K   s(   | j dd | D }tj|ddS )Nc                 S   s   i | ]\}}|t |qS rS   )_quote_path)r   kvrS   rS   rT   r         z+DynamicResource.url_for.<locals>.<dictcomp>Tr   )r   
format_mapr   r   r   )r^   r   urlrS   rS   rT   rd     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}>)rW   rD   )rW   r   r   r]   rS   rS   rT   r     s    zDynamicResource.__repr__)rN   rO   rP   r   r   r   r   r   rQ   r   r_   rr   rb   rk   r   r   rv   rq   rB   rm   r   rd   r   r   rS   rS   r   rT   r5     s   

 !	r5   c                       sb   e Zd Zddeee dd fddZeedddZedd	d
dZee	d	ddZ
  ZS )PrefixResourceNrV   )rG   rW   rY   c                   sX   |r| dsJ ||dv s0|dr0J |t j|d t|| _| jd | _d S )Nr@   )r   r@   rV   )r   r   r   r_   r   _prefix_prefix2)r^   rG   rW   r   rS   rT   r_     s
    
zPrefixResource.__init__r`   c                 C   s   | j S rZ   )r  ra   rS   rS   rT   rb     s    zPrefixResource.canonicalri   c                 C   sH   | dsJ |drJ t|dks,J || j | _| jd | _d S r   )r   r   r   r  r  rj   rS   rS   rT   rk   
  s
    zPrefixResource.add_prefixc                 C   s   dS r   rS   rj   rS   rS   rT   rq     s    zPrefixResource.raw_match)rN   rO   rP   rQ   r   r_   rr   rb   rk   rv   rq   r   rS   rS   r   rT   r    s
    r  c                       s  e Zd ZdZdddddddeeee ee ee	e	e	dd	 fddZ
dd	eeef ee	 ed
ddZeeedddZedddZeddddZeedddZedddZee dddZeedddZeedd d!Zedd"d#Z   Z!S )$r8   r   N   FrW   rx   
chunk_size
show_indexfollow_symlinksappend_version)	rG   rF   rW   rx   r  r	  r
  r  rY   c          
   
      s   t  j||d zFt|}t|dr<ttjt|}| }|	 sTt
dW n: tt
fy }	 zt
d| d|	W Y d }	~	n
d }	~	0 0 || _|| _|| _|| _|| _|| _td| j| |dtd| j| |dd	| _d S )
NrV   ~zNot a directoryzNo directory exists at 'r   GETr   HEAD)r  r  )r   r_   r   rQ   r   osrC   
expanduserrh   is_dirr   FileNotFoundError
_directory_show_index_chunk_size_follow_symlinksr   _append_versionr7   _handler   )
r^   rG   rF   rW   rx   r  r	  r
  r  r   r   rS   rT   r_     s.    (

zStaticResource.__init__)r  )filenamer  rY   c             	   C   s   |d u r| j }t|tr t|}|d}tj| jdd}tdk rT||	dd }n|| }|rz&| j
| }| js|| j
 W n ttfy   | Y S 0 | r|d}| }W d    n1 s0    Y  | |}|| j|i}|S |S )Nr@   Tr   r      %%25rb)r  r   r   rQ   lstripr   r   r  r=   replacer  joinpathrh   r  relative_tor   r  is_fileopenread_get_file_hashZ
with_queryVERSION_KEY)r^   r  r  r  filepathfZ
file_byteshrS   rS   rT   rd   @  s.    


&
zStaticResource.url_for)
byte_arrayrY   c                 C   s*   t  }||  t| }|dS )Nascii)hashlibsha256updatebase64urlsafe_b64encodedigestdecode)r+  mZb64rS   rS   rT   r&  f  s    
zStaticResource._get_file_hashr`   c                 C   s   | j | j| jdS )N)rF   rG   rH   )r  r  r   ra   rS   rS   rT   rm   m  s    zStaticResource.get_info)r{   rY   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   r7   r   )r^   r{   rS   rS   rT   set_options_routet  s
    

z StaticResource.set_options_routere   c                    sz   |j j}|j}t| j}|| js8|| jkr8d t fS ||vrHd |fS dt|t	| jd d  i}t
|| j| |fS )Nr  r   )r   r   rz   r   r   r   r  r  r   r   r1   )r^   rf   rC   rz   r   r   rS   rS   rT   rh   {  s    

zStaticResource.resolvec                 C   s
   t | jS rZ   r   ra   rS   rS   rT   r     s    zStaticResource.__len__c                 C   s   t | j S rZ   )r   r   valuesra   rS   rS   rT   r     s    zStaticResource.__iter__c              
      s,  |j d }z:t|}|jr t | j| }| jsB|| j W nz t	t
fyt } zt |W Y d }~nTd }~0  ty    Y n: ty } z"|jj| t |W Y d }~n
d }~0 0 | r| jrzt| |ddW S  ty    t Y n0 nt n| r$t|| jdS td S )Nr  z	text/html)r   content_type)r  )
match_infor   anchorr(   r  r!  rh   r  r"  r   r  r*   	ExceptionrI   logger	exceptionr  r  r-   _directory_as_htmlPermissionErrorr#  r+   r  )r^   rf   r   r  r(  r   rS   rS   rT   r    s6    



zStaticResource._handle)r(  rY   c                 C   s   |  sJ || j }d| }d| d}g }| }t|D ]R}|| j }| jd | }	|  r~|j d}
n|j}
|dj	|	|
d qFd	d
|}d	| d| d
}d| d}d| d| d}|S )Nz
Index of /z<h1>z</h1>r@   z#<li><a href="{url}">{name}</a></li>)r  rW   z<ul>
{}
</ul>
z<body>
z
</body>z<head>
<title>z</title>
</head>z<html>
z
</html>)r  r"  r  as_posixiterdirsortedr  rW   r   r   join)r^   r(  Zrelative_path_to_dirZindex_ofh1Z
index_listZ	dir_index_filerel_pathZfile_url	file_nameulbodyZhead_strhtmlrS   rS   rT   r>    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}>)rW   rC   rF   )rW   r   r  r  r]   rS   rS   rT   r     s    
zStaticResource.__repr__)"rN   rO   rP   r'  rQ   r$   r   r   r   rv   r_   r   r   r   rd   staticmethodbytesr&  rB   rm   r#   r6  r,   ru   rh   r   r   r6   r   r.   r  r>  r   r   rS   rS   r   rT   r8     sD   *
&&$r8   c                       s   e Zd Zeddd fddZedd fddZeeed	d
dZedddZ	e
edddZedddZee dddZedddZ  ZS )PrefixedSubAppResourcer:   N)rG   rI   rY   c                    s0   t  | || _|j D ]}|| qd S rZ   )r   r_   _approuter	resourcesrk   )r^   rG   rI   ry   r   rS   rT   r_     s    zPrefixedSubAppResource.__init__ri   c                    s,   t  | | jj D ]}|| qd S rZ   )r   rk   rO  rP  rQ  )r^   rG   ry   r   rS   rT   rk     s    z!PrefixedSubAppResource.add_prefixr   c                 O   s   t dd S )Nz3.url_for() is not supported by sub-application rootr   r   rS   rS   rT   rd     s    zPrefixedSubAppResource.url_forr`   c                 C   s   | j | jdS )N)rI   rG   )rO  r  ra   rS   rS   rT   rm     s    zPrefixedSubAppResource.get_infore   c                    sl   |j j| js(|j j| jkr(d t fS | jj|I d H }|	| j t
|jtr^|jj}nt }||fS rZ   )r  r   r   r  r  r   rO  rP  rh   r   r   rM   r)   r   r^   rf   r9  methodsrS   rS   rT   rh     s    

zPrefixedSubAppResource.resolvec                 C   s   t | jj S rZ   )r   rO  rP  rH   ra   rS   rS   rT   r     s    zPrefixedSubAppResource.__len__c                 C   s   t | jj S rZ   )r   rO  rP  rH   ra   rS   rS   rT   r     s    zPrefixedSubAppResource.__iter__c                 C   s   dj | j| jdS )Nz,<PrefixedSubAppResource {prefix} -> {app!r}>)rG   rI   )r   r  rO  ra   rS   rS   rT   r     s    zPrefixedSubAppResource.__repr__)rN   rO   rP   rQ   r_   rk   r   rd   rB   rm   r,   ru   rh   r   r   r   r6   r   r   r   rS   rS   r   rT   rN    s   rN  c                   @   sN   e Zd ZejeedddZejedddZ	e
ejedddZd	S )
rK   re   c                    s   dS )z1Return bool if the request satisfies the criteriaNrS   rg   rS   rS   rT   r     s    zAbstractRuleMatching.matchr`   c                 C   s   dS rl   rS   ra   rS   rS   rT   rm     s    zAbstractRuleMatching.get_infoc                 C   s   dS )zReturn a strNrS   ra   rS   rS   rT   rb     s    zAbstractRuleMatching.canonicalN)rN   rO   rP   rs   rt   r,   rv   r   rB   rm   rr   rQ   rb   rS   rS   rS   rT   rK     s   rK   c                       s~   e Zd ZedZedd fddZeedddZ	eedd	d
Z
eedddZeedddZedddZ  ZS )Domainz(?!-)[a-z\d-]{1,63}(?<!-)NrJ   rY   c                    s   t    | || _d S rZ   )r   r_   
validation_domain)r^   rJ   r   rS   rT   r_     s    
zDomain.__init__r`   c                 C   s   | j S rZ   rX  ra   rS   rS   rT   rb   !  s    zDomain.canonicalc                    s   t |tstd|d }|s.tdnd|v r>tdtd| }|jd usXJ t fdd|j	dD s~td	|j
d
kr|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 rZ   )re_partr   )r   xra   rS   rT   	<genexpr>/  r   z$Domain.validation.<locals>.<genexpr>zDomain not validP   :)r   rQ   	TypeErrorrstripr   r   r   Zraw_hostallr   port)r^   rJ   r  rS   ra   rT   rW  %  s    


zDomain.validationre   c                    s    |j tj}|sdS | |S r   )r   r   r   ZHOSTmatch_domain)r^   rf   hostrS   rS   rT   r   5  s    zDomain.matchrd  rY   c                 C   s   |  | jkS rZ   )r   rX  r^   rd  rS   rS   rT   rc  ;  s    zDomain.match_domainc                 C   s
   d| j iS )NrJ   rY  ra   rS   rS   rT   rm   >  s    zDomain.get_info)rN   rO   rP   r   r   rZ  rQ   r_   rr   rb   rW  r,   rv   r   rc  rB   rm   r   rS   rS   r   rT   rU    s   
rU  c                       sP   e Zd ZedZedd fddZeedddZ	ee
d	d
dZ  ZS )
MaskDomainz(?!-)[a-z\d\*-]{1,63}(?<!-)NrV  c                    s2   t  | | jdddd}t|| _d S )Nr;   z\.*z.*)r   r_   rX  r   r   r   _mask)r^   rJ   maskr   rS   rT   r_   E  s    zMaskDomain.__init__r`   c                 C   s   | j jS rZ   )ri  rE   ra   rS   rS   rT   rb   J  s    zMaskDomain.canonicalre  c                 C   s   | j |d uS rZ   )ri  r   rf  rS   rS   rT   rc  N  s    zMaskDomain.match_domain)rN   rO   rP   r   r   rZ  rQ   r_   rr   rb   rv   rc  r   rS   rS   r   rT   rg  B  s
   
rg  c                   @   s\   e Zd ZedddddZeedddZedd	d
Z	e
edddZedddZdS )MatchedSubAppResourcer:   N)rL   rI   rY   c                 C   s    t |  d| _|| _|| _d S )Nr   )r2   r_   r  rO  _rule)r^   rL   rI   rS   rS   rT   r_   S  s    
zMatchedSubAppResource.__init__r`   c                 C   s   | j jS rZ   )rl  rb   ra   rS   rS   rT   rb   Y  s    zMatchedSubAppResource.canonicalc                 C   s   | j | jdS )N)rI   rL   )rO  rl  ra   rS   rS   rT   rm   ]  s    zMatchedSubAppResource.get_infore   c                    s`   | j |I d H sd t fS | jj|I d H }|| j t|jt	rR|jj
}nt }||fS rZ   )rl  r   r   rO  rP  rh   r   r   rM   r)   r   rS  rS   rS   rT   rh   `  s    

zMatchedSubAppResource.resolvec                 C   s   dj | jdS )Nz"<MatchedSubAppResource -> {app!r}>)rI   )r   rO  ra   rS   rS   rT   r   k  s    zMatchedSubAppResource.__repr__)rN   rO   rP   rK   r_   rr   rQ   rb   rB   rm   r,   ru   rh   r   rS   rS   rS   rT   rk  R  s   rk  c                       s   e Zd ZdZddeeeee f e	e
e dd fddZeddd	Zee
e dd
dZeeedddZedddZ  ZS )r7   zA route with resourceNr   )rz   r{   ry   rx   rY   c                   s   t  j||||d d S )Nrw   )r   r_   )r^   rz   r{   ry   rx   r   rS   rT   r_   r  s    zResourceRoute.__init__r`   c                 C   s   dj | j| j| jdS )Nz3<ResourceRoute [{method}] {resource} -> {handler!r})rz   ry   r{   )r   rz   r   r{   ra   rS   rS   rT   r   ~  s    zResourceRoute.__repr__c                 C   s   | j d u rd S | j jS rZ   )r   rW   ra   rS   rS   rT   rW     s    
zResourceRoute.namer   c                 O   s    | j dusJ | j j|i |S r   )r   rd   r   rS   rS   rT   rd     s    zResourceRoute.url_forc                 C   s   | j d usJ | j  S rZ   )r   rm   ra   rS   rS   rT   rm     s    zResourceRoute.get_info)rN   rO   rP   __doc__rQ   r   r#   r   r   r2   r   r   r_   r   rr   rW   r   rd   rB   rm   r   rS   rS   r   rT   r7   o  s   r7   c                       s   e Zd Zedd fddZeeedddZee	e dd	d
Z
edddZeedddZeedddZeedddZedddZ  ZS )r   Nr   c                    s   t  tj| j || _d S rZ   )r   r_   r   r   r  _http_exceptionr   r   rS   rT   r_     s    zSystemRoute.__init__r   c                 O   s   t dd S )Nz).url_for() is not allowed for SystemRouterR  r   rS   rS   rT   rd     s    zSystemRoute.url_forr`   c                 C   s   d S rZ   rS   ra   rS   rS   rT   rW     s    zSystemRoute.namec                 C   s
   d| j iS )NrM   rn  ra   rS   rS   rT   rm     s    zSystemRoute.get_infore   c                    s
   | j d S rZ   ro  rg   rS   rS   rT   r    s    zSystemRoute._handlec                 C   s   | j jS rZ   )rn  r   ra   rS   rS   rT   r     s    zSystemRoute.statusc                 C   s   | j jS rZ   )rn  r   ra   rS   rS   rT   r     s    zSystemRoute.reasonc                 C   s   dj | dS )Nz*<SystemRoute {self.status}: {self.reason}>ra   )r   ra   rS   rS   rT   r     s    zSystemRoute.__repr__)rN   rO   rP   r&   r_   rQ   r   rd   rr   r   rW   rB   rm   r,   r.   r  r   r   r   r   r   rS   rS   r   rT   r     s   r   c                   @   s@   e Zd ZedddZeedef dddZddddZdS )	r9   r`   c                    sJ   | j jtjvr|   t| | j j d }|d u r:|   | I d H }|S rZ   )rf   rz   r   METH_ALL_raise_allowed_methodsgetattrr   )r^   rz   resprS   rS   rT   _iter  s    z
View._iterNc                 C   s   |    S rZ   )rt  	__await__ra   rS   rS   rT   ru    s    zView.__await__c                    s&    fddt jD }t jj|d S )Nc                    s   h | ]}t  | r|qS rS   )hasattrr   )r   r4  ra   rS   rT   	<setcomp>  r   z.View._raise_allowed_methods.<locals>.<setcomp>)r   rp  r)   rf   rz   )r^   r   rS   ra   rT   rq    s    zView._raise_allowed_methods)	rN   rO   rP   r.   rt  r   r   ru  rq  rS   rS   rS   rT   r9     s   r9   c                   @   sP   e Zd Zee ddddZedddZee ddd	Z	e
ed
ddZdS )ResourcesViewN)rQ  rY   c                 C   s
   || _ d S rZ   
_resources)r^   rQ  rS   rS   rT   r_     s    zResourcesView.__init__r`   c                 C   s
   t | jS rZ   )r   rz  ra   rS   rS   rT   r     s    zResourcesView.__len__c                 c   s   | j E d H  d S rZ   ry  ra   rS   rS   rT   r     s    zResourcesView.__iter__ry   rY   c                 C   s
   || j v S rZ   ry  r^   ry   rS   rS   rT   __contains__  s    zResourcesView.__contains__)rN   rO   rP   r   r2   r_   r   r   r   r   objectrv   r}  rS   rS   rS   rT   rx    s   rx  c                   @   sN   e Zd Zee dddZedddZee	 dddZ
eed	d
dZdS )
RoutesView)rQ  c                 C   s*   g | _ |D ]}|D ]}| j | qq
d S rZ   )r   r   )r^   rQ  ry   r   rS   rS   rT   r_     s    zRoutesView.__init__r`   c                 C   s
   t | jS rZ   r   ra   rS   rS   rT   r     s    zRoutesView.__len__c                 c   s   | j E d H  d S rZ   r   ra   rS   rS   rT   r     s    zRoutesView.__iter__r   c                 C   s
   || j v S rZ   r  r   rS   rS   rT   r}    s    zRoutesView.__contains__N)rN   rO   rP   r   r2   r_   r   r   r   r6   r   r~  rv   r}  rS   rS   rS   rT   r    s   r  c                       s"  e Zd ZedZdd fddZeedddZ	e
e dd	d
ZedddZeedddZeedddZedddZedddZeeef dddZeddddZddeee edddZdddeeeee e! f ee ee" e#d d!d"Z$ddd#d$d$d$d%ee%ee ee" eeeeed&	d'd(Z&eee'e#d)d*d+Z(eee'e#d)d,d-Z)dd.d/eeee ee'e#d0d1d2Z*eee'e#d)d3d4Z+eee'e#d)d5d6Z,eee'e#d)d7d8Z-eee'e#d)d9d:Z.ee e! e'e#d)d;d<Z/dd fd=d>Z0e1e2 e3e# d?d@dAZ4  Z5S )Br0   z[.:-]Nr`   c                    s   t    g | _i | _d S rZ   )r   r_   rz  _named_resourcesra   r   rS   rT   r_     s    
zUrlDispatcher.__init__re   c                    sd   |j }t }| jD ]0}||I d H \}}|d ur:|  S ||O }q|rVtt||S tt S d S rZ   )rz   r   rz  rh   r   r)   r*   )r^   rf   rz   r   ry   r   allowedrS   rS   rT   rh     s    

zUrlDispatcher.resolvec                 C   s
   t | jS rZ   )r   r  ra   rS   rS   rT   r     s    zUrlDispatcher.__iter__c                 C   s
   t | jS rZ   )r   r  ra   rS   rS   rT   r      s    zUrlDispatcher.__len__r{  c                 C   s
   || j v S rZ   r  r|  rS   rS   rT   r}    s    zUrlDispatcher.__contains__rX   c                 C   s
   | j | S rZ   r  r]   rS   rS   rT   __getitem__  s    zUrlDispatcher.__getitem__c                 C   s
   t | jS rZ   )rx  rz  ra   rS   rS   rT   rQ  	  s    zUrlDispatcher.resourcesc                 C   s
   t | jS rZ   )r  rz  ra   rS   rS   rT   rH     s    zUrlDispatcher.routesc                 C   s
   t | jS rZ   )r   r  ra   rS   rS   rT   named_resources  s    zUrlDispatcher.named_resourcesc                 C   s   t |tsJ d|| jr&td|j}|d ur| j|}|D ]4}t|rbt	d|d|
 sDt	d|qD|| jv rt	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   r2   frozenr   rW   NAME_SPLIT_REr   keyword	iskeywordr   isidentifierr   r  rz  r   )r^   ry   rW   r   r   rS   rS   rT   register_resource  s:    




zUrlDispatcher.register_resourcerV   r   c                C   s   |r| dstd| jrD| jd }|j|krD||rDtt|S d|v s|d|v s|t|s|t	t
||d}| | |S t||d}| | |S )Nr@   z)path should be started with / or be emptyr   r   rV   )r   r   rz  rW   rq   r   r3   r?   searchr4   r   r  r5   )r^   rC   rW   ry   rS   rS   rT   add_resource3  s    



zUrlDispatcher.add_resource)rW   rx   )rz   rC   r{   rW   rx   rY   c                C   s   | j ||d}|j|||dS )NrV   r   )r  r   )r^   rz   rC   r{   rW   rx   ry   rS   rS   rT   r   C  s    	zUrlDispatcher.add_router  Fr  )	rG   rC   rW   rx   r  r	  r
  r  rY   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

        r@   Nr  r  )r   r   r8   r  )
r^   rG   rC   rW   rx   r  r	  r
  r  ry   rS   rS   rT   
add_staticO  s    


zUrlDispatcher.add_static)rC   r{   rc   rY   c                 K   s   | j tj||fi |S )z(Shortcut for add_route with method HEAD.)r   r   	METH_HEADr^   rC   r{   rc   rS   rS   rT   add_headq  s    zUrlDispatcher.add_headc                 K   s   | j tj||fi |S )z+Shortcut for add_route with method OPTIONS.)r   r   ZMETH_OPTIONSr  rS   rS   rT   add_optionsu  s    zUrlDispatcher.add_optionsT)rW   
allow_head)rC   r{   rW   r  rc   rY   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.
        rV   )r  r   r   r  ZMETH_GET)r^   rC   r{   rW   r  rc   ry   rS   rS   rT   add_gety  s    zUrlDispatcher.add_getc                 K   s   | j tj||fi |S )z(Shortcut for add_route with method POST.)r   r   Z	METH_POSTr  rS   rS   rT   add_post  s    zUrlDispatcher.add_postc                 K   s   | j tj||fi |S )z'Shortcut for add_route with method PUT.)r   r   ZMETH_PUTr  rS   rS   rT   add_put  s    zUrlDispatcher.add_putc                 K   s   | j tj||fi |S )z)Shortcut for add_route with method PATCH.)r   r   Z
METH_PATCHr  rS   rS   rT   	add_patch  s    zUrlDispatcher.add_patchc                 K   s   | j tj||fi |S )z*Shortcut for add_route with method DELETE.)r   r   ZMETH_DELETEr  rS   rS   rT   
add_delete  s    zUrlDispatcher.add_deletec                 K   s   | j tj||fi |S )z?Shortcut for add_route with ANY methods for a class-based view.)r   r   r   r  rS   rS   rT   add_view  s    zUrlDispatcher.add_viewc                    s"   t    | jD ]}|  qd S rZ   )r   rn   rz  r|  r   rS   rT   rn     s    

zUrlDispatcher.freeze)rH   rY   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^   rH   Zregistered_routesZ	route_defrS   rS   rT   
add_routes  s    zUrlDispatcher.add_routes)6rN   rO   rP   r   r   r  r_   r,   r1   rh   r   rQ   r   r   r   r~  rv   r}  r2   r  rx  rQ  r  rH   r   r  r  r   r3   r  r   r#   r   r   r   r6   r   r$   r  r   r  r  r  r  r  r  r  r  rn   r   r/   r   r  r   rS   rS   r   rT   r0     sx   
!"	
r0   )r   rY   c                 C   s$   t dk r| dd} tj| ddjS )Nr  r  r  Fr   )r=   r   r   r   r   r   rS   rS   rT   r     s    r   c                 C   s   t j| ddjS r   )r   r   rC   r  rS   rS   rT   r     s    r   c                 C   s    t | }d| v r|dd}|S )Nr  r  )r   r   )r   r~   rS   rS   rT   r     s    r   )srs   r|   r0  r-  r   r  r  r   r   
contextlibr   	functoolsr   pathlibr   typesr   typingr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zyarlr   r   Zyarl_versionr   r   r   r   r   Zhelpersr    httpr!   Ztypedefsr"   r#   r$   r%   Zweb_exceptionsr&   r'   r(   r)   r*   Zweb_fileresponser+   Zweb_requestr,   Zweb_responser-   r.   Zweb_routedefr/   __all__Zweb_appr:   rQ   ZBaseDictdictr   mapr   r   r=   rR   r   r>   r?   r   rA   r   ru   rB   r2   ABCr6   r1   r   r   r3   r4   r5   r  r8   rN  rK   rU  rg  rk  r7   r   r9   rx  r  r0   r   r   r   rS   rS   rS   rT   <module>   s   
T0/PC<)L I,($ Q