
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
U
    '7`l                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl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& d dl'm(Z(m)Z* d	d
l+m,Z, d	dl m-Z-m.Z.m/Z/ d	dl0m1Z1 d	dl2m3Z3 d	dl4m5Z5 d	dl6m7Z7m8Z8m9Z9m:Z:m;Z; d	dl<m=Z= d	dl>m?Z? d	dl@mAZAmBZB d	dlCmDZD dZEerd	dlFmGZG eeHeHf ZIneJZIeKeLeMe*Nddd ZOePdZQePdZReSdZTee?geeB f ZUee?ged f ZVe!ee- eeH f ZWG dd de&ddZXG dd  d e ed! ZYG d"d! d!e jZZ[G d#d$ d$eIe-Z\G d%d& d&e\Z]e?dd'd(d)Z^G d*d+ d+eYZ_G d,d- d-e_Z`G d.d/ d/e_ZaG d0d1 d1eYZbG d2d3 d3ebZcG d4d5 d5ebZdG d6d7 d7e jZZeG d8d9 d9eeZfG d:d; d;efZgG d<d= d=edZhG d>d? d?e[ZiG d@dA dAe[ZjG dBdC dCe/ZkG dDdE dEe eeY eeY ZlG dFdG dGe ee[ ee[ ZmG dHdI dIe.eeHeYf ZneHeHdJdKdLZoeHeHdJdMdNZpeHeHdJdOdPZqdS )Q    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)	TypedDict)URL__version__   )hdrs)AbstractMatchInfoAbstractRouterAbstractView)DEBUG)HttpVersion11)PathLike)HTTPExceptionHTTPExpectationFailedHTTPForbiddenHTTPMethodNotAllowedHTTPNotFound)FileResponse)Request)ResponseStreamResponse)AbstractRouteDef)
UrlDispatcherUrlMappingMatchInfoAbstractResourceResourcePlainResourceDynamicResourceAbstractRouteResourceRouteStaticResourceView)Application.   z$^[0-9A-Za-z!#\$%&'\*\+\-\.\^_`\|~]+$z*(\{[_a-zA-Z][^{}]*(?:\{[^{}]*\}[^{}]*)*\})/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prefixr4   routesr8   appdomainAbstractRuleMatchingrulehttp_exceptionN)	__name__
__module____qualname__str__annotations__r   r   r   r$    rM   rM   L/opt/alt/python38/lib64/python3.8/site-packages/aiohttp/web_urldispatcher.pyr<   Y   s   
r<   F)Z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 )r0   NnamerP   returnc                C   s
   || _ d S N_nameselfrP   rM   rM   rN   __init__m   s    zAbstractResource.__init__rR   c                 C   s   | j S rS   rT   rW   rM   rM   rN   rP   p   s    zAbstractResource.namec                 C   s   dS )zWExposes the resource's canonical path.

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

        NrM   rZ   rM   rM   rN   	canonicalt   s    zAbstractResource.canonical)kwargsrR   c                 K   s   dS )z2Construct url for resource with additional params.NrM   )rW   r\   rM   rM   rN   url_for}   s    zAbstractResource.url_forrequestrR   c                    s   dS )zMResolve resource

        Return (UrlMappingMatchInfo, allowed_methods) pair.NrM   rW   r_   rM   rM   rN   resolve   s    zAbstractResource.resolverA   rR   c                 C   s   dS )zXAdd a prefix to processed URLs.

        Required for subapplications support.

        NrM   rW   rA   rM   rM   rN   
add_prefix   s    zAbstractResource.add_prefixc                 C   s   dS z;Return a dict with additional info useful for introspectionNrM   rZ   rM   rM   rN   get_info   s    zAbstractResource.get_infoc                 C   s   d S rS   rM   rZ   rM   rM   rN   freeze   s    zAbstractResource.freezer=   rR   c                 C   s   dS )z Perform a raw match against pathNrM   rW   r=   rM   rM   rN   	raw_match   s    zAbstractResource.raw_match)rH   rI   rJ   r   rK   rX   propertyrP   abcabstractmethodr[   r   r]   r*   _Resolvera   rd   r<   rf   rg   boolrj   rM   rM   rM   rN   r0   l   s"   r0   r4   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 )r4   Nexpect_handlerresource)methodhandlerrq   rr   rR   c                   s   |d krt }t|s$td|| }t|sDt| dt|sTt|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 onesr^   c                    s     | }t |r|I d H S |S rS   )asyncioZiscoroutine)r_   resultZold_handlerrM   rN   handler_wrapper   s    

z/AbstractRoute.__init__.<locals>.handler_wrapper)_default_expect_handlerru   ZiscoroutinefunctionAssertionErrorupperHTTP_METHOD_REmatch
ValueErrorcallableinspectZisgeneratorfunctionwarningswarnDeprecationWarning
isinstancetype
issubclassr    r   r*   r,   _method_handler_expect_handler	_resource)rW   rs   rt   rq   rr   rx   rM   rw   rN   rX      s@    	


 zAbstractRoute.__init__rY   c                 C   s   | j S rS   )r   rZ   rM   rM   rN   rs      s    zAbstractRoute.methodc                 C   s   | j S rS   )r   rZ   rM   rM   rN   rt      s    zAbstractRoute.handlerc                 C   s   dS )z8Optional route's name, always equals to resource's name.NrM   rZ   rM   rM   rN   rP      s    zAbstractRoute.namec                 C   s   | j S rS   )r   rZ   rM   rM   rN   rr      s    zAbstractRoute.resourcec                 C   s   dS re   rM   rZ   rM   rM   rN   rf      s    zAbstractRoute.get_infoargsr\   rR   c                 O   s   dS z/Construct url for route with additional params.NrM   rW   r   r\   rM   rM   rN   r]      s    zAbstractRoute.url_forr^   c                    s   |  |I d H  d S rS   )r   r`   rM   rM   rN   handle_expect_header   s    z"AbstractRoute.handle_expect_header)rH   rI   rJ   rK   r   _WebHandlerr   r    r   _ExpectHandlerr0   rX   rk   rs   rt   rl   rm   rP   rr   r<   rf   r   r]   r*   r   rM   rM   rM   rN   r4      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 ) r/   )
match_dictroutec                    s(   t  | || _g | _d | _d| _d S NF)superrX   _route_apps_current_app_frozen)rW   r   r   	__class__rM   rN   rX      s
    zUrlMappingMatchInfo.__init__rY   c                 C   s   | j jS rS   )r   rt   rZ   rM   rM   rN   rt      s    zUrlMappingMatchInfo.handlerc                 C   s   | j S rS   )r   rZ   rM   rM   rN   r      s    zUrlMappingMatchInfo.routec                 C   s   | j jS rS   )r   r   rZ   rM   rM   rN   rq      s    z"UrlMappingMatchInfo.expect_handlerc                 C   s   d S rS   rM   rZ   rM   rM   rN   rG      s    z"UrlMappingMatchInfo.http_exceptionc                 C   s
   | j  S rS   )r   rf   rZ   rM   rM   rN   rf     s    zUrlMappingMatchInfo.get_info)r8   .c                 C   s
   t | jS rS   )tupler   rZ   rM   rM   rN   apps  s    zUrlMappingMatchInfo.appsr8   N)rC   rR   c                 C   s0   | j rtd| jd kr|| _| jd| d S )Nz-Cannot change apps stack after .freeze() callr   )r   RuntimeErrorr   r   insertrW   rC   rM   rM   rN   add_app
  s
    
zUrlMappingMatchInfo.add_appc                 C   s   | j }|d k	st|S rS   )r   rz   r   rM   rM   rN   current_app  s    zUrlMappingMatchInfo.current_app)NNNc                 c   sD   t r || jkr td| j|| j}|| _z
d V  W 5 || _X d S )Nz1Expected one of the following apps {!r}, got {!r})r!   r   r   formatr   )rW   rC   prevrM   rM   rN   set_current_app  s    
 
z#UrlMappingMatchInfo.set_current_appc                 C   s
   d| _ d S )NT)r   rZ   rM   rM   rN   rg   '  s    zUrlMappingMatchInfo.freezec                    s   dt    d| j dS )Nz<MatchInfo z: >)r   __repr__r   rZ   r   rM   rN   r   *  s    zUrlMappingMatchInfo.__repr__)rH   rI   rJ   r   rK   r4   rX   rk   r   rt   r   r   rq   r   r$   rG   r<   rf   r   r   r   r   r   r   r   rg   r   __classcell__rM   rM   r   rN   r/      s&   r/   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rG   rR   c                    s   || _ t i t| j  d S rS   )
_exceptionr   rX   SystemRouterW   rG   r   rM   rN   rX   /  s    zMatchInfoError.__init__rY   c                 C   s   | j S rS   )r   rZ   rM   rM   rN   rG   3  s    zMatchInfoError.http_exceptionc                 C   s   d | jj| jjS )Nz<MatchInfoError {}: {}>)r   r   statusreasonrZ   rM   rM   rN   r   7  s     zMatchInfoError.__repr__)
rH   rI   rJ   r$   rX   rk   rG   rK   r   r   rM   rM   r   rN   r   .  s   r   r^   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%   )r_   ZexpectrM   rM   rN   ry   =  s
    
ry   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 )r1   NrO   rQ   c                   s   t  j|d g | _d S )NrO   )r   rX   _routesrV   r   rM   rN   rX   L  s    zResource.__init__rq   r5   )rs   rt   rq   rR   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   rs   r   METH_ANYr   r   r5   register_route)rW   rs   rt   rq   	route_objrM   rM   rN   	add_routeP  s    

zResource.add_router   rR   c                 C   s(   t |tstd|| j| d S )Nz)Instance of Route class is required, got )r   r5   rz   r   appendrW   r   rM   rM   rN   r   d  s     zResource.register_router^   c                    sn   t  }| |jj}|d kr$d |fS | jD ]:}|j}|| ||jksR|tjkr*t	|||f  S q*d |fS rS   )
set_matchrel_urlraw_pathr   rs   addr   r   r/   )rW   r_   allowed_methodsr   r   Zroute_methodrM   rM   rN   ra   j  s    

zResource.resolverh   c                 C   s   d S rS   rM   ri   rM   rM   rN   r   z  s    zResource._matchrY   c                 C   s
   t | jS rS   lenr   rZ   rM   rM   rN   __len__~  s    zResource.__len__c                 C   s
   t | jS rS   )iterr   rZ   rM   rM   rN   __iter__  s    zResource.__iter__)rH   rI   rJ   r   rK   rX   r   r   r    r   r   r   r   r*   rn   ra   rl   rm   r   r   intr   r   r4   r   r   rM   rM   r   rN   r1   K  s   	r1   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 )r2   NrO   r=   rP   rR   c                   s*   t  j|d |r |ds t|| _d S )NrO   r;   )r   rX   
startswithrz   _path)rW   r=   rP   r   rM   rN   rX     s    zPlainResource.__init__rY   c                 C   s   | j S rS   r   rZ   rM   rM   rN   r[     s    zPlainResource.canonicalc                 C   s   | j sd| _ d S Nr;   r   rZ   rM   rM   rN   rg     s    zPlainResource.freezerb   c                 C   s<   | dst|drtt|dks,t|| j | _d S Nr;   r   )r   rz   endswithr   r   rc   rM   rM   rN   rd     s    zPlainResource.add_prefixrh   c                 C   s   | j |kri S d S d S rS   r   ri   rM   rM   rN   r     s    
zPlainResource._matchc                 C   s
   | j |kS rS   r   ri   rM   rM   rN   rj     s    zPlainResource.raw_matchc                 C   s
   d| j iS )Nr=   r   rZ   rM   rM   rN   rf     s    zPlainResource.get_infoc                 C   s   t j| jddS NTr=   Zencoded)r   buildr   rZ   rM   rM   rN   r]     s    zPlainResource.url_forc                 C   s0   | j d k	rd| j  d nd}d| d| j dS )N'' r   z<PlainResource  r   )rP   r   rV   rM   rM   rN   r     s    zPlainResource.__repr__)rH   rI   rJ   rK   r   rX   rk   r[   rg   rd   r   r   ro   rj   r<   rf   r   r]   r   r   rM   rM   r   rN   r2     s    r2   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 )r3   z#\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*)\}z.\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*):(?P<re>.+)\}z[^{}/]+NrO   r   c          	   
      sd  t  j|d d}d}t|D ]}| j|}|rd|d|d| j7 }|d|d d 7 }q | j	|}|r|djf |
 7 }|d|d d 7 }q d|ksd|krtd| d	| d
t|}||7 }|t|7 }q zt|}W n< tjk
r0 } ztd| d| d W 5 d }~X Y nX |jtsDt|dsTt|| _|| _d S )NrO   r   z
(?P<{}>{})var{}z(?P<{var}>{re})zInvalid path 'z'['z']zBad pattern 'z': r;   )r   rX   ROUTE_REsplitDYN	fullmatchr   groupGOODDYN_WITH_RE	groupdictr~   _requote_pathreescapecompileerrorr?   r   PATH_SEPrz   _pattern
_formatter)	rW   r=   rP   r?   r>   partr}   Zcompiledexcr   rM   rN   rX     s6    (zDynamicResource.__init__rY   c                 C   s   | j S rS   r   rZ   rM   rM   rN   r[     s    zDynamicResource.canonicalrb   c                 C   sV   | dst|drtt|dks,ttt|| jj | _|| j	 | _	d S r   )
r   rz   r   r   r   r   r   r   r?   r   rc   rM   rM   rN   rd     s
    zDynamicResource.add_prefixrh   c                 C   s2   | j |}|d krd S dd |  D S d S )Nc                 S   s   i | ]\}}|t |qS rM   )_unquote_path).0keyvaluerM   rM   rN   
<dictcomp>  s     z*DynamicResource._match.<locals>.<dictcomp>)r   r   r   items)rW   r=   r}   rM   rM   rN   r     s    
zDynamicResource._matchc                 C   s
   | j |kS rS   r   ri   rM   rM   rN   rj     s    zDynamicResource.raw_matchc                 C   s   | j | jdS )N)r>   r?   )r   r   rZ   rM   rM   rN   rf     s    zDynamicResource.get_info)partsrR   c                 K   s(   | j dd | D }tj|ddS )Nc                 S   s   i | ]\}}|t |qS rM   )_quote_path)r   kvrM   rM   rN   r     s      z+DynamicResource.url_for.<locals>.<dictcomp>Tr   )r   
format_mapr   r   r   )rW   r   urlrM   rM   rN   r]     s    zDynamicResource.url_forc                 C   s,   | j d k	rd| j  d nd}dj|| jdS )Nr   r   r   z$<DynamicResource {name} {formatter}>)rP   r>   )rP   r   r   rV   rM   rM   rN   r     s
     zDynamicResource.__repr__)rH   rI   rJ   r   r   r   r   r   rK   r   rX   rk   r[   rd   r   r   ro   rj   r<   rf   r   r]   r   r   rM   rM   r   rN   r3     s   

 !	r3   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 )PrefixResourceNrO   )rA   rP   rR   c                   sL   |r| dst||dks0|dr0t|t j|d t|| _d S )Nr;   )r   r;   rO   )r   rz   r   r   rX   r   _prefix)rW   rA   rP   r   rM   rN   rX     s    zPrefixResource.__init__rY   c                 C   s   | j S rS   )r   rZ   rM   rM   rN   r[     s    zPrefixResource.canonicalrb   c                 C   s<   | dst|drtt|dks,t|| j | _d S r   )r   rz   r   r   r   rc   rM   rM   rN   rd     s    zPrefixResource.add_prefixc                 C   s   dS r   rM   rc   rM   rM   rN   rj     s    zPrefixResource.raw_match)rH   rI   rJ   rK   r   rX   rk   r[   rd   ro   rj   r   rM   rM   r   rN   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 )$r6   r   N   FrP   rq   
chunk_size
show_indexfollow_symlinksappend_version)	rA   r@   rP   rq   r   r  r  r  rR   c          
   
      s   t  j||d zFt|}t|dr<ttjt|}| }|	 sTt
dW n8 tt
fk
r }	 zt
d| d|	W 5 d }	~	X Y nX || _|| _|| _|| _|| _|| _td| j| |dtd| j| |dd	| _d S )
NrO   ~zNot a directoryzNo directory exists at 'r   GETr   HEAD)r  r  )r   rX   r   rK   r   osr=   
expanduserra   is_dirr~   FileNotFoundError
_directory_show_index_chunk_size_follow_symlinksr   _append_versionr5   _handler   )
rW   rA   r@   rP   rq   r   r  r  r  r   r   rM   rN   rX     s:    $      zStaticResource.__init__)r  )filenamer  rR   c             	   C   s   |d k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k
r   | Y S X | r|d}| }W 5 Q R X | |}|| j|i}|S |S )Nr;   Tr   r      %%25rb)r  r   r   rK   lstripr   r   r   YARL_VERSIONreplacer  joinpathra   r  relative_tor~   r
  is_fileopenread_get_file_hashZ
with_queryVERSION_KEY)rW   r  r  r   filepathfZ
file_byteshrM   rM   rN   r]   <  s.    



zStaticResource.url_for)
byte_arrayrR   c                 C   s*   t  }||  t| }|dS )Nascii)hashlibZsha256updatebase64Zurlsafe_b64encodeZdigestdecode)r$  mZb64rM   rM   rN   r  b  s    
zStaticResource._get_file_hashrY   c                 C   s   | j | j| jdS )N)r@   rA   rB   )r  r   r   rZ   rM   rM   rN   rf   i  s    zStaticResource.get_info)rt   rR   c                 C   s.   d| j krtdtd|| | jd| j d< d S )NZOPTIONSzOPTIONS route was set alreadyr   )r   r   r5   r   )rW   rt   rM   rM   rN   set_options_routep  s    
   z StaticResource.set_options_router^   c                    sp   |j j}|j}t| j}|| js.d t fS ||kr>d |fS dt|t| jd d  i}t	|| j| |fS )Nr  r   )
r   r   rs   r   r   r   r   r   r   r/   )rW   r_   r=   rs   r   r   rM   rM   rN   ra   w  s    

zStaticResource.resolvec                 C   s
   t | jS rS   r   rZ   rM   rM   rN   r     s    zStaticResource.__len__c                 C   s   t | j S rS   )r   r   valuesrZ   rM   rM   rN   r     s    zStaticResource.__iter__c              
      s,  |j d }z:t|}|jr t | j| }| jsB|| j W nx t	t
fk
rr } zt |W 5 d }~X Y nL tk
r    Y n8 tk
r } z|jj| t |W 5 d }~X Y nX | r| jrzt| |ddW S  tk
r    t Y nX nt n| r$t|| jdS td S )Nr  z	text/html)r   Zcontent_type)r   )
match_infor   Zanchorr&   r  r  ra   r  r  r~   r
  r(   	ExceptionrC   ZloggerZ	exceptionr	  r  r+   _directory_as_htmlPermissionErrorr  r)   r  )rW   r_   r   r  r!  r   rM   rM   rN   r    s8    

 
zStaticResource._handle)r!  rR   c                 C   s   |  st|| 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   rP   z<ul>
{}
</ul>
z<body>
z
</body>z<head>
<title>z</title>
</head>z<html>
z
</html>)r	  rz   r  r  Zas_posixZiterdirsortedr   rP   r   r   join)rW   r!  Zrelative_path_to_dirZindex_ofZh1Z
index_listZ	dir_indexZ_fileZrel_pathZfile_url	file_nameZulZbodyZhead_strZhtmlrM   rM   rN   r/    s.    
 z!StaticResource._directory_as_htmlc                 C   s0   | j d k	rd| j  d nd}dj|| j| jdS )Nr   r   z/<StaticResource {name} {path} -> {directory!r}>)rP   r=   r@   )rP   r   r   r  rV   rM   rM   rN   r     s      zStaticResource.__repr__)"rH   rI   rJ   r   rK   r#   r   r   r   ro   rX   r   r   r   r]   staticmethodbytesr  r<   rf   r   r+  r*   rn   ra   r   r   r4   r   r,   r  r/  r   r   rM   rM   r   rN   r6     sD   *
&&$r6   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 )PrefixedSubAppResourcer8   N)rA   rC   rR   c                    s0   t  | || _|j D ]}|| qd S rS   )r   rX   _approuter	resourcesrd   )rW   rA   rC   rr   r   rM   rN   rX     s    zPrefixedSubAppResource.__init__rb   c                    s,   t  | | jj D ]}|| qd S rS   )r   rd   r8  r9  r:  )rW   rA   rr   r   rM   rN   rd     s    z!PrefixedSubAppResource.add_prefixr   c                 O   s   t dd S )Nz3.url_for() is not supported by sub-application rootr   r   rM   rM   rN   r]     s    zPrefixedSubAppResource.url_forrY   c                 C   s   | j | jdS )N)rC   rA   )r8  r   rZ   rM   rM   rN   rf     s    zPrefixedSubAppResource.get_infor^   c                    sp   |j j| jd s,|j j| jkr,d t fS | jj|I d H }|| j t	|j
trb|j
j}nt }||fS r   )r   r   r   r   r   r8  r9  ra   r   r   rG   r'   r   rW   r_   r-  methodsrM   rM   rN   ra     s    

zPrefixedSubAppResource.resolvec                 C   s   t | jj S rS   )r   r8  r9  rB   rZ   rM   rM   rN   r     s    zPrefixedSubAppResource.__len__c                 C   s   t | jj S rS   )r   r8  r9  rB   rZ   rM   rM   rN   r     s    zPrefixedSubAppResource.__iter__c                 C   s   dj | j| jdS )Nz,<PrefixedSubAppResource {prefix} -> {app!r}>)rA   rC   )r   r   r8  rZ   rM   rM   rN   r     s     zPrefixedSubAppResource.__repr__)rH   rI   rJ   rK   rX   rd   r   r]   r<   rf   r*   rn   ra   r   r   r   r4   r   r   r   rM   rM   r   rN   r7    s   r7  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 )
rE   r^   c                    s   dS )z1Return bool if the request satisfies the criteriaNrM   r`   rM   rM   rN   r}     s    zAbstractRuleMatching.matchrY   c                 C   s   dS re   rM   rZ   rM   rM   rN   rf     s    zAbstractRuleMatching.get_infoc                 C   s   dS )zReturn a strNrM   rZ   rM   rM   rN   r[     s    zAbstractRuleMatching.canonicalN)rH   rI   rJ   rl   rm   r*   ro   r}   r<   rf   rk   rK   r[   rM   rM   rM   rN   rE     s   rE   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rD   rR   c                    s   t    | || _d S rS   )r   rX   
validation_domain)rW   rD   r   rM   rN   rX     s    
zDomain.__init__rY   c                 C   s   | j S rS   rA  rZ   rM   rM   rN   r[     s    zDomain.canonicalc                    s   t |tstd|d }|s.tdnd|kr>tdtd| }|jd k	sXtt	 fdd|j
dD s~td	|jd
kr|jS |j d|j S )NzDomain must be strr9   zDomain cannot be emptyz://zScheme not supportedzhttp://c                 3   s   | ]} j |V  qd S rS   )re_partr   )r   xrZ   rM   rN   	<genexpr>+  s     z$Domain.validation.<locals>.<genexpr>zDomain not validP   :)r   rK   	TypeErrorrstripr   r~   r   Zraw_hostrz   allr   Zport)rW   rD   r   rM   rZ   rN   r@  !  s    


zDomain.validationr^   c                    s    |j tj}|sdS | |S r   )r   r   r   ZHOSTmatch_domain)rW   r_   hostrM   rM   rN   r}   1  s    zDomain.matchrL  rR   c                 C   s   |  | jkS rS   )r   rA  rW   rL  rM   rM   rN   rK  7  s    zDomain.match_domainc                 C   s
   d| j iS )NrD   rB  rZ   rM   rM   rN   rf   :  s    zDomain.get_info)rH   rI   rJ   r   r   rC  rK   rX   rk   r[   r@  r*   ro   r}   rK  r<   rf   r   rM   rM   r   rN   r>    s   
r>  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}(?<!-)Nr?  c                    s2   t  | | jdddd}t|| _d S )Nr9   z\.*z.*)r   rX   rA  r  r   r   _mask)rW   rD   maskr   rM   rN   rX   A  s    zMaskDomain.__init__rY   c                 C   s   | j jS rS   )rQ  r?   rZ   rM   rM   rN   r[   F  s    zMaskDomain.canonicalrM  c                 C   s   | j |d k	S rS   )rQ  r   rN  rM   rM   rN   rK  J  s    zMaskDomain.match_domain)rH   rI   rJ   r   r   rC  rK   rX   rk   r[   ro   rK  r   rM   rM   r   rN   rO  >  s
   
rO  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 )MatchedSubAppResourcer8   N)rF   rC   rR   c                 C   s    t |  d| _|| _|| _d S )Nr   )r0   rX   r   r8  _rule)rW   rF   rC   rM   rM   rN   rX   O  s    
zMatchedSubAppResource.__init__rY   c                 C   s   | j jS rS   )rT  r[   rZ   rM   rM   rN   r[   U  s    zMatchedSubAppResource.canonicalc                 C   s   | j | jdS )N)rC   rF   )r8  rT  rZ   rM   rM   rN   rf   Y  s    zMatchedSubAppResource.get_infor^   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 rS   )rT  r}   r   r8  r9  ra   r   r   rG   r'   r   r<  rM   rM   rN   ra   \  s    

zMatchedSubAppResource.resolvec                 C   s   dj | jdS )Nz"<MatchedSubAppResource -> {app!r}>)rC   )r   r8  rZ   rM   rM   rN   r   g  s    zMatchedSubAppResource.__repr__)rH   rI   rJ   rE   rX   rk   rK   r[   r<   rf   r*   rn   ra   r   rM   rM   rM   rN   rS  N  s   rS  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 )r5   zA route with resourceNr   )rs   rt   rr   rq   rR   c                   s   t  j||||d d S )Nrp   )r   rX   )rW   rs   rt   rr   rq   r   rM   rN   rX   n  s       zResourceRoute.__init__rY   c                 C   s   dj | j| j| jdS )Nz3<ResourceRoute [{method}] {resource} -> {handler!r})rs   rr   rt   )r   rs   r   rt   rZ   rM   rM   rN   r   z  s
      zResourceRoute.__repr__c                 C   s   | j d krd S | j jS rS   )r   rP   rZ   rM   rM   rN   rP     s    
zResourceRoute.namer   c                 O   s   | j dk	st| j j||S r   )r   rz   r]   r   rM   rM   rN   r]     s    zResourceRoute.url_forc                 C   s   | j d k	st| j  S rS   )r   rz   rf   rZ   rM   rM   rN   rf     s    zResourceRoute.get_info)rH   rI   rJ   __doc__rK   r   r   r   r    r0   r   r   rX   r   rk   rP   r   r]   r<   rf   r   rM   rM   r   rN   r5   k  s   r5   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 rS   )r   rX   r   r   r  _http_exceptionr   r   rM   rN   rX     s    zSystemRoute.__init__r   c                 O   s   t dd S )Nz).url_for() is not allowed for SystemRouter;  r   rM   rM   rN   r]     s    zSystemRoute.url_forrY   c                 C   s   d S rS   rM   rZ   rM   rM   rN   rP     s    zSystemRoute.namec                 C   s
   d| j iS )NrG   rV  rZ   rM   rM   rN   rf     s    zSystemRoute.get_infor^   c                    s
   | j d S rS   rW  r`   rM   rM   rN   r    s    zSystemRoute._handlec                 C   s   | j jS rS   )rV  r   rZ   rM   rM   rN   r     s    zSystemRoute.statusc                 C   s   | j jS rS   )rV  r   rZ   rM   rM   rN   r     s    zSystemRoute.reasonc                 C   s   dj | dS )Nz*<SystemRoute {self.status}: {self.reason}>rZ   )r   rZ   rM   rM   rN   r     s    zSystemRoute.__repr__)rH   rI   rJ   r$   rX   rK   r   r]   rk   r   rP   r<   rf   r*   r,   r  r   r   r   r   r   rM   rM   r   rN   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 )	r7   rY   c                    sJ   | j jtjkr|   t| | j j d }|d kr:|   | I d H }|S rS   )r_   rs   r   METH_ALL_raise_allowed_methodsgetattrr   )rW   rs   ZresprM   rM   rN   _iter  s    z
View._iterNc                 C   s   |    S rS   )r[  	__await__rZ   rM   rM   rN   r\    s    zView.__await__c                    s&    fddt jD }t jj|d S )Nc                    s   h | ]}t  | r|qS rM   )hasattrr   )r   r*  rZ   rM   rN   	<setcomp>  s      z.View._raise_allowed_methods.<locals>.<setcomp>)r   rX  r'   r_   rs   )rW   r   rM   rZ   rN   rY    s    zView._raise_allowed_methods)	rH   rI   rJ   r,   r[  r   r   r\  rY  rM   rM   rM   rN   r7     s   	r7   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)r:  rR   c                 C   s
   || _ d S rS   
_resources)rW   r:  rM   rM   rN   rX     s    zResourcesView.__init__rY   c                 C   s
   t | jS rS   )r   ra  rZ   rM   rM   rN   r     s    zResourcesView.__len__c                 c   s   | j E d H  d S rS   r`  rZ   rM   rM   rN   r     s    zResourcesView.__iter__rr   rR   c                 C   s
   || j kS rS   r`  rW   rr   rM   rM   rN   __contains__  s    zResourcesView.__contains__)rH   rI   rJ   r   r0   rX   r   r   r   r   objectro   rd  rM   rM   rM   rN   r_    s   r_  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)r:  c                 C   s*   g | _ |D ]}|D ]}| j | qq
d S rS   )r   r   )rW   r:  rr   r   rM   rM   rN   rX     s    zRoutesView.__init__rY   c                 C   s
   t | jS rS   r   rZ   rM   rM   rN   r     s    zRoutesView.__len__c                 c   s   | j E d H  d S rS   r   rZ   rM   rM   rN   r     s    zRoutesView.__iter__r   c                 C   s
   || j kS rS   rg  r   rM   rM   rN   rd    s    zRoutesView.__contains__N)rH   rI   rJ   r   r0   rX   r   r   r   r4   r   re  ro   rd  rM   rM   rM   rN   rf    s   rf  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 )Br.   z[.:-]NrY   c                    s   t    g | _i | _d S rS   )r   rX   ra  _named_resourcesrZ   r   rM   rN   rX     s    
zUrlDispatcher.__init__r^   c                    sd   |j }t }| jD ]0}||I d H \}}|d k	r:|  S ||O }q|rVtt||S tt S d S rS   )rs   r   ra  ra   r   r'   r(   )rW   r_   rs   r   rr   r   ZallowedrM   rM   rN   ra     s    

zUrlDispatcher.resolvec                 C   s
   t | jS rS   )r   rh  rZ   rM   rM   rN   r     s    zUrlDispatcher.__iter__c                 C   s
   t | jS rS   )r   rh  rZ   rM   rM   rN   r     s    zUrlDispatcher.__len__rb  c                 C   s
   || j kS rS   rh  rc  rM   rM   rN   rd    s    zUrlDispatcher.__contains__rQ   c                 C   s
   | j | S rS   ri  rV   rM   rM   rN   __getitem__   s    zUrlDispatcher.__getitem__c                 C   s
   t | jS rS   )r_  ra  rZ   rM   rM   rN   r:    s    zUrlDispatcher.resourcesc                 C   s
   t | jS rS   )rf  ra  rZ   rM   rM   rN   rB     s    zUrlDispatcher.routesc                 C   s
   t | jS rS   )r   rh  rZ   rM   rM   rN   named_resources	  s    zUrlDispatcher.named_resourcesc                 C   s   t |tstd|| jr&td|j}|d k	r| j|}|D ]4}t	|rbt
d|d| sDt
d|qD|| jk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   r0   rz   frozenr   rP   NAME_SPLIT_REr   keyword	iskeywordr~   isidentifierr   rh  ra  r   )rW   rr   rP   r   r   rM   rM   rN   register_resource  s>     


 
zUrlDispatcher.register_resourcerO   r   c                C   s   |r| dstd| jrD| jd }|j|krD||rDtt|S d|ks|d|ks|t|s|t	t
||d}| | |S t||d}| | |S )Nr;   z)path should be started with / or be emptyr   r   rO   )r   r~   ra  rP   rj   r   r1   r   searchr2   r   rq  r3   )rW   r=   rP   rr   rM   rM   rN   add_resource-  s    



zUrlDispatcher.add_resource)rP   rq   )rs   r=   rt   rP   rq   rR   c                C   s   | j ||d}|j|||dS )NrO   r   )rt  r   )rW   rs   r=   rt   rP   rq   rr   rM   rM   rN   r   =  s    	zUrlDispatcher.add_router   Fr   )	rA   r=   rP   rq   r   r  r  r  rR   c          
   
   C   sJ   | dst|dr$|dd }t||||||||d}	| |	 |	S )z^Add static files view.

        prefix - url prefix
        path - folder with files

        r;   Nrr  r   )r   rz   r   r6   rq  )
rW   rA   r=   rP   rq   r   r  r  r  rr   rM   rM   rN   
add_staticI  s    


zUrlDispatcher.add_static)r=   rt   r\   rR   c                 K   s   | j tj||f|S )z9
        Shortcut for add_route with method HEAD
        )r   r   	METH_HEADrW   r=   rt   r\   rM   rM   rN   add_headk  s    zUrlDispatcher.add_headc                 K   s   | j tj||f|S )z<
        Shortcut for add_route with method OPTIONS
        )r   r   ZMETH_OPTIONSrw  rM   rM   rN   add_optionsq  s    zUrlDispatcher.add_optionsT)rP   
allow_head)r=   rt   rP   rz  r\   rR   c                K   s6   | j ||d}|r$|jtj|f| |jtj|f|S )z
        Shortcut for add_route with method GET, if allow_head is true another
        route is added allowing head requests to the same endpoint
        rO   )rt  r   r   rv  ZMETH_GET)rW   r=   rt   rP   rz  r\   rr   rM   rM   rN   add_gety  s    zUrlDispatcher.add_getc                 K   s   | j tj||f|S )z9
        Shortcut for add_route with method POST
        )r   r   Z	METH_POSTrw  rM   rM   rN   add_post  s    zUrlDispatcher.add_postc                 K   s   | j tj||f|S )z8
        Shortcut for add_route with method PUT
        )r   r   ZMETH_PUTrw  rM   rM   rN   add_put  s    zUrlDispatcher.add_putc                 K   s   | j tj||f|S )z:
        Shortcut for add_route with method PATCH
        )r   r   Z
METH_PATCHrw  rM   rM   rN   	add_patch  s    zUrlDispatcher.add_patchc                 K   s   | j tj||f|S )z;
        Shortcut for add_route with method DELETE
        )r   r   ZMETH_DELETErw  rM   rM   rN   
add_delete  s    zUrlDispatcher.add_deletec                 K   s   | j tj||f|S )zP
        Shortcut for add_route with ANY methods for a class-based view
        )r   r   r   rw  rM   rM   rN   add_view  s    zUrlDispatcher.add_viewc                    s"   t    | jD ]}|  qd S rS   )r   rg   ra  rc  r   rM   rN   rg     s    

zUrlDispatcher.freeze)rB   rR   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)rW   rB   Zregistered_routesZ	route_defrM   rM   rN   
add_routes  s    zUrlDispatcher.add_routes)6rH   rI   rJ   r   r   rm  rX   r*   r   ra   r   rK   r   r   r   re  ro   rd  r0   rj  r_  r:  rf  rB   r   rk  rq  r   r1   rt  r   r   r   r    r   r4   r   r#   ru  r   rx  ry  r{  r|  r}  r~  r  r  rg   r   r-   r   r  r   rM   rM   r   rN   r.     s   
!"    	  	  r.   )r   rR   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   rM   rM   rN   r     s    r   c                 C   s   t j| ddjS r   )r   r   r=   r  rM   rM   rN   r     s    r   c                 C   s    t | }d| kr|dd}|S )Nr  r  )r   r  )r   rv   rM   rM   rN   r     s    r   )rrl   ru   r(  r&  r   rn  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typing_extensionsr   Zyarlr   r   Zyarl_versionr   r   r   r   r    Zhelpersr!   Zhttpr"   Ztypedefsr#   Zweb_exceptionsr$   r%   r&   r'   r(   Zweb_fileresponser)   Zweb_requestr*   Zweb_responser+   r,   Zweb_routedefr-   __all__Zweb_appr8   rK   ZBaseDictdictr   mapr   r   r  r   r|   r   r   r   r   r   rn   r<   r0   ABCr4   r/   r   ry   r1   r2   r3   r   r6   r7  rE   r>  rO  rS  r5   r   r7   r_  rf  r.   r   r   r   rM   rM   rM   rN   <module>   s   T


/PC<)L I,($ d