a
    nJhĜ                     @   s4  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ZbeBdd-d.d/ZcG d0d1 d1e^ZdG d2d3 d3edZeG d4d5 d5edZfG d6d7 d7e^ZgG d8d9 d9egZhG d:d; d;egZiG d<d= d=e j_ZjG d>d? d?ejZkG d@dA dAekZlG dBdC dCeiZmG dDdE dEe`ZnG dFdG dGe`ZoG dHdI dIe1ZpG dJdK dKe#ee^ ee^ ZqG dLdM dMe#ee` ee` ZrG dNdO dOe0eeKe^f ZseKeKdPdQdRZteKeKdPdSdTZueKeKdPdUdVZvdS )W    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   K/var/www/shaz/venv/lib/python3.9/site-packages/aiohttp/web_urldispatcher.pyrD   b   s   
rD   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 )r3   NnamerY   returnc                C   s
   || _ d S N_nameselfrY   rU   rU   rV   __init__v   s    zAbstractResource.__init__r[   c                 C   s   | j S r\   r]   r`   rU   rU   rV   rY   y   s    zAbstractResource.namec                 C   s   dS )zWExposes the resource's canonical path.

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

        NrU   rc   rU   rU   rV   	canonical}   s    zAbstractResource.canonical)kwargsr[   c                 K   s   dS )z2Construct url for resource with additional params.NrU   )r`   re   rU   rU   rV   url_for   s    zAbstractResource.url_forrequestr[   c                    s   dS )zWResolve resource.

        Return (UrlMappingMatchInfo, allowed_methods) pair.
        NrU   r`   rh   rU   rU   rV   resolve   s    zAbstractResource.resolverI   r[   c                 C   s   dS )zWAdd a prefix to processed URLs.

        Required for subapplications support.
        NrU   r`   rI   rU   rU   rV   
add_prefix   s    zAbstractResource.add_prefixc                 C   s   dS z;Return a dict with additional info useful for introspectionNrU   rc   rU   rU   rV   get_info   s    zAbstractResource.get_infoc                 C   s   d S r\   rU   rc   rU   rU   rV   freeze   s    zAbstractResource.freezerE   r[   c                 C   s   dS )z Perform a raw match against pathNrU   r`   rE   rU   rU   rV   	raw_match   s    zAbstractResource.raw_match)rP   rQ   rR   r   rS   ra   propertyrY   abcabstractmethodrd   r   rf   r-   _Resolverj   rm   rD   ro   rp   boolrs   rU   rU   rU   rV   r3   u   s"   r3   r7   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ee dddZdS )r7   Nexpect_handlerresource)methodhandlerrz   r{   r[   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 onesrg   c                    s.    | }t |r|I d H }t|ts*J |S r\   )asyncioiscoroutine
isinstancer/   )rh   resultZ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}   rz   r{   r   rU   r   rV   ra      s>    	


zAbstractRoute.__init__rb   c                 C   s   | j S r\   )r   rc   rU   rU   rV   r|      s    zAbstractRoute.methodc                 C   s   | j S r\   )r   rc   rU   rU   rV   r}      s    zAbstractRoute.handlerc                 C   s   dS )z8Optional route's name, always equals to resource's name.NrU   rc   rU   rU   rV   rY      s    zAbstractRoute.namec                 C   s   | j S r\   )r   rc   rU   rU   rV   r{      s    zAbstractRoute.resourcec                 C   s   dS rn   rU   rc   rU   rU   rV   ro      s    zAbstractRoute.get_infoargsre   r[   c                 O   s   dS z/Construct url for route with additional params.NrU   r`   r   re   rU   rU   rV   rf      s    zAbstractRoute.url_forrg   c                    s   |  |I d H S r\   )r   ri   rU   rU   rV   handle_expect_header   s    z"AbstractRoute.handle_expect_header)rP   rQ   rR   rS   r   r%   r   r"   r   _ExpectHandlerr3   ra   rt   r|   r}   ru   rv   rY   r{   rD   ro   r   rf   r-   r/   r   rU   rU   rU   rV   r7      s.   3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 ) 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__rb   c                 C   s   | j jS r\   )r   r}   rc   rU   rU   rV   r}      s    zUrlMappingMatchInfo.handlerc                 C   s   | j S r\   )r   rc   rU   rU   rV   r     s    zUrlMappingMatchInfo.routec                 C   s   | j jS r\   )r   r   rc   rU   rU   rV   rz     s    z"UrlMappingMatchInfo.expect_handlerc                 C   s   d S r\   rU   rc   rU   rU   rV   rO   	  s    z"UrlMappingMatchInfo.http_exceptionc                 C   s
   | j  S r\   )r   ro   rc   rU   rU   rV   ro     s    zUrlMappingMatchInfo.get_info)r;   .c                 C   s
   t | jS r\   )tupler   rc   rU   rU   rV   apps  s    zUrlMappingMatchInfo.appsr;   N)rK   r[   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`   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 || _n|| _0 d S )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   rc   rU   rU   rV   rp   1  s    zUrlMappingMatchInfo.freezec                    s   dt    d| j dS )Nz<MatchInfo z: >)r   __repr__r   rc   r   rU   rV   r   4  s    zUrlMappingMatchInfo.__repr__)rP   rQ   rR   r   rS   r7   ra   rt   r%   r}   r   r   rz   r   r'   rO   rD   ro   r   r   r   r   r   r   r   rp   r   __classcell__rU   rU   r   rV   r2      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rO   r[   c                    s   || _ t i t| j  d S r\   )
_exceptionr   ra   SystemRouter`   rO   r   rU   rV   ra   9  s    zMatchInfoError.__init__rb   c                 C   s   | j S r\   )r   rc   rU   rU   rV   rO   =  s    zMatchInfoError.http_exceptionc                 C   s   d | jj| jjS )Nz<MatchInfoError {}: {}>)r   r   statusreasonrc   rU   rU   rV   r   A  s    zMatchInfoError.__repr__)
rP   rQ   rR   r'   ra   rt   rO   rS   r   r   rU   rU   r   rV   r   8  s   r   rg   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(   )rh   expectrU   rU   rV   r   G  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d dddZ  ZS )r4   NrX   rZ   c                   s   t  j|d g | _d S )NrX   )r   ra   _routesr_   r   rU   rV   ra   V  s    zResource.__init__rz   r8   )r|   r}   rz   r[   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}   rz   	route_objrU   rU   rV   	add_routeZ  s    

zResource.add_router   r[   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_routerg   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 r\   )
set_matchrel_urlraw_pathr   r|   addr   r   r2   )r`   rh   allowed_methodsr   r   Zroute_methodrU   rU   rV   rj   t  s    

zResource.resolverq   c                 C   s   d S r\   rU   rr   rU   rU   rV   r     s    zResource._matchrb   c                 C   s
   t | jS r\   lenr   rc   rU   rU   rV   __len__  s    zResource.__len__c                 C   s
   t | jS r\   )iterr   rc   rU   rU   rV   __iter__  s    zResource.__iter__)rP   rQ   rR   r   rS   ra   r   r   r"   r%   r   r   r   r-   rw   rj   ru   rv   r   r   intr   r   r   r   rU   rU   r   rV   r4   U  s   	r4   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 )r5   NrX   rE   rY   r[   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__rb   c                 C   s   | j S r\   r   rc   rU   rU   rV   rd     s    zPlainResource.canonicalc                 C   s   | j sd| _ d S )NrA   r   rc   rU   rU   rV   rp     s    zPlainResource.freezerk   c                 C   s<   | dsJ |drJ t|dks,J || j | _d S NrA   r   )r   endswithr   r   rl   rU   rU   rV   rm     s    zPlainResource.add_prefixrq   c                 C   s   | j |kri S d S d S r\   r   rr   rU   rU   rV   r     s    
zPlainResource._matchc                 C   s
   | j |kS r\   r   rr   rU   rU   rV   rs     s    zPlainResource.raw_matchc                 C   s
   d| j iS )NrE   r   rc   rU   rU   rV   ro     s    zPlainResource.get_infoc                 C   s   t j| jddS NTrE   encoded)r   buildr   rc   rU   rU   rV   rf     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   )rY   r   r_   rU   rU   rV   r     s    zPlainResource.__repr__)rP   rQ   rR   rS   r   ra   rt   rd   rp   rm   r   r   rx   rs   rD   ro   r   rf   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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 )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   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 )NrX   r   z
(?P<{}>{})var{}z(?P<{var}>{re})zInvalid path 'z'['z']zBad pattern 'z': rA   )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     s6    ,zDynamicResource.__init__rb   c                 C   s   | j S r\   r   rc   rU   rU   rV   rd     s    zDynamicResource.canonicalrk   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   rl   rU   rU   rV   rm     s
    zDynamicResource.add_prefixrq   c                 C   s2   | j |}|d u rd S dd |  D S d S )Nc                 S   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   s
   | j |kS r\   r   rr   rU   rU   rV   rs     s    zDynamicResource.raw_matchc                 C   s   | j | jdS )N)rF   rG   )r   r   rc   rU   rU   rV   ro     s    zDynamicResource.get_info)partsr[   c                 K   s(   | j dd | D }tj|ddS )Nc                 S   s   i | ]\}}|t |qS rU   )_quote_path)r   kvrU   rU   rV   r         z+DynamicResource.url_for.<locals>.<dictcomp>Tr   )r   
format_mapr   r   r   )r`   r   urlrU   rU   rV   rf     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   rt   rd   rm   r   r   rx   rs   rD   ro   r   rf   r   r   rU   rU   r   rV   r6     s   

 !	r6   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 )PrefixResourceNrX   )rI   rY   r[   c                   sX   |r| dsJ ||dv s0|dr0J |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__rb   c                 C   s   | j S r\   )r  rc   rU   rU   rV   rd     s    zPrefixResource.canonicalrk   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  rl   rU   rU   rV   rm     s
    zPrefixResource.add_prefixc                 C   s   dS r   rU   rl   rU   rU   rV   rs     s    zPrefixResource.raw_match)rP   rQ   rR   rS   r   ra   rt   rd   rm   rx   rs   r   rU   rU   r   rV   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	 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 )$r9   r  N   FrY   rz   
chunk_size
show_indexfollow_symlinksappend_version)	rI   rH   rY   rz   r  r  r  r  r[   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 )
NrX   ~zNot a directoryzNo directory exists at 'r   GETr   HEAD)r  r  )r   ra   r   rS   r   osrE   
expanduserrj   is_dirr   FileNotFoundError
_directory_show_index_chunk_size_follow_symlinksr   _append_versionr8   _handler   )
r`   rI   rH   rY   rz   r  r  r  r  r   r   rU   rV   ra   "  s.    (

zStaticResource.__init__)r  )filenamer  r[   c          
   	   C   s  |d u r| j }t|d}tj| jdd}tdk rF||dd }n|| }|r| j	|}zD| j
rttj|}|| j | }n| }|| j W n ttfy   | Y S 0 | r|d}| }W d    n1 s0    Y  | |}	|| j|	i}|S |S )NrA   Tr   r      %%25rb)r  rS   lstripr   r   r  r>   replacer  joinpathr  r   r  rE   normpathrelative_torj   r   r  is_fileopenread_get_file_hashZ
with_queryVERSION_KEY)
r`   r  r  r  unresolved_pathnormalized_pathfilepathfZ
file_byteshrU   rU   rV   rf   H  s2    


&
zStaticResource.url_for)
byte_arrayr[   c                 C   s*   t  }||  t| }|dS )Nascii)hashlibsha256updatebase64urlsafe_b64encodedigestdecode)r1  mZb64rU   rU   rV   r*  q  s    
zStaticResource._get_file_hashrb   c                 C   s   | j | j| jdS )N)rH   rI   rJ   )r  r  r   rc   rU   rU   rV   ro   x  s    zStaticResource.get_info)r}   r[   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_routerg   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   r|   r   r   r   r  r  r   r   r2   )r`   rh   rE   r|   r   r   rU   rU   rV   rj     s    

zStaticResource.resolvec                 C   s
   t | jS r\   r   rc   rU   rU   rV   r     s    zStaticResource.__len__c                 C   s   t | j S r\   )r   r   valuesrc   rU   rU   rV   r     s    zStaticResource.__iter__c              
      sV  |j d }zdt|}|jr t | j|}| jrXttj	|}|
| j | }n| }|
| j W nz ttfy } zt |W Y d }~nTd }~0  ty    Y n: ty } z"|jj| t |W Y d }~n
d }~0 0 | r6| jr.zt| |ddW S  ty*   t Y n0 nt n| rNt|| jdS td S )Nr  z	text/html)r   content_type)r  )
match_infor   anchorr)   r  r$  r  r  rE   r%  r&  rj   r   r  r+   	ExceptionrK   logger	exceptionr  r  r.   _directory_as_htmlPermissionErrorr'  r,   r  )r`   rh   r   r  r,  r-  r.  r   rU   rU   rV   r    s>    




zStaticResource._handle)r.  r[   c                 C   s   |  sJ || j }dt| }d| d}g }| }t|D ]`}|| j }t| j d| }	|  r|j	 d}
n|j	}
|
d|	 dt|
 d qJd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  r&  r  as_posixhtml_escapeiterdirsortedr   r  rY   r   r   join)r`   r.  Zrelative_path_to_dirZindex_ofZh1Z
index_listZ	dir_index_filerel_pathZquoted_file_url	file_nameZulbodyZhead_strhtmlrU   rU   rV   rD    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   rx   ra   r   rf   staticmethodbytesr*  rD   ro   r%   r<  r-   rw   rj   r   r   r7   r   r/   r  r   rD  r   r   rU   rU   r   rV   r9     sD   *)+"r9   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)rI   rK   r[   c                    s0   t  | || _|j D ]}|| qd S r\   )r   ra   _approuter	resourcesrm   )r`   rI   rK   r{   r   rU   rV   ra     s    zPrefixedSubAppResource.__init__rk   c                    s,   t  | | jj D ]}|| qd S r\   )r   rm   rT  rU  rV  )r`   rI   r{   r   rU   rV   rm     s    z!PrefixedSubAppResource.add_prefixr   c                 O   s   t dd S )Nz3.url_for() is not supported by sub-application rootr   r   rU   rU   rV   rf     s    zPrefixedSubAppResource.url_forrb   c                 C   s   | j | jdS )N)rK   rI   )rT  r  rc   rU   rU   rV   ro     s    zPrefixedSubAppResource.get_inforg   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 r\   )r  r   r   r  r  r   rT  rU  rj   r   r   rO   r*   r   r`   rh   r?  methodsrU   rU   rV   rj     s    

zPrefixedSubAppResource.resolvec                 C   s   t | jj S r\   )r   rT  rU  rJ   rc   rU   rU   rV   r     s    zPrefixedSubAppResource.__len__c                 C   s   t | jj S r\   )r   rT  rU  rJ   rc   rU   rU   rV   r     s    zPrefixedSubAppResource.__iter__c                 C   s   dj | j| jdS )Nz,<PrefixedSubAppResource {prefix} -> {app!r}>)rI   rK   )r   r  rT  rc   rU   rU   rV   r     s    zPrefixedSubAppResource.__repr__)rP   rQ   rR   rS   ra   rm   r   rf   rD   ro   r-   rw   rj   r   r   r   r7   r   r   r   rU   rU   r   rV   rS    s   rS  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 )
rM   rg   c                    s   dS )z1Return bool if the request satisfies the criteriaNrU   ri   rU   rU   rV   r     s    zAbstractRuleMatching.matchrb   c                 C   s   dS rn   rU   rc   rU   rU   rV   ro     s    zAbstractRuleMatching.get_infoc                 C   s   dS )zReturn a strNrU   rc   rU   rU   rV   rd   "  s    zAbstractRuleMatching.canonicalN)rP   rQ   rR   ru   rv   r-   rx   r   rD   ro   rt   rS   rd   rU   rU   rU   rV   rM     s   rM   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rL   r[   c                    s   t    | || _d S r\   )r   ra   
validation_domain)r`   rL   r   rU   rV   ra   +  s    
zDomain.__init__rb   c                 C   s   | j S r\   r]  rc   rU   rU   rV   rd   /  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 r\   )re_partr   )r   xrc   rU   rV   	<genexpr>=  r  z$Domain.validation.<locals>.<genexpr>zDomain not validP   :)r   rS   	TypeErrorrstripr   r   r   Zraw_hostallr   port)r`   rL   r  rU   rc   rV   r\  3  s    


zDomain.validationrg   c                    s    |j tj}|sdS | |S r   )r   r   r   ZHOSTmatch_domain)r`   rh   hostrU   rU   rV   r   C  s    zDomain.matchri  r[   c                 C   s   |  | jkS r\   )r   r]  r`   ri  rU   rU   rV   rh  I  s    zDomain.match_domainc                 C   s
   d| j iS )NrL   r^  rc   rU   rU   rV   ro   L  s    zDomain.get_info)rP   rQ   rR   r   r   r_  rS   ra   rt   rd   r\  r-   rx   r   rh  rD   ro   r   rU   rU   r   rV   rZ  (  s   
rZ  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 )Nr<   z\.*z.*)r   ra   r]  r#  r   r   _mask)r`   rL   maskr   rU   rV   ra   S  s    zMaskDomain.__init__rb   c                 C   s   | j jS r\   )rn  rG   rc   rU   rU   rV   rd   X  s    zMaskDomain.canonicalrj  c                 C   s   | j |d uS r\   )rn  r   rk  rU   rU   rV   rh  \  s    zMaskDomain.match_domain)rP   rQ   rR   r   r   r_  rS   ra   rt   rd   rx   rh  r   rU   rU   r   rV   rl  P  s
   
rl  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)rN   rK   r[   c                 C   s    t |  d| _|| _|| _d S )Nr   )r3   ra   r  rT  _rule)r`   rN   rK   rU   rU   rV   ra   a  s    
zMatchedSubAppResource.__init__rb   c                 C   s   | j jS r\   )rq  rd   rc   rU   rU   rV   rd   g  s    zMatchedSubAppResource.canonicalc                 C   s   | j | jdS )N)rK   rN   )rT  rq  rc   rU   rU   rV   ro   k  s    zMatchedSubAppResource.get_inforg   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 r\   )rq  r   r   rT  rU  rj   r   r   rO   r*   r   rX  rU   rU   rV   rj   n  s    

zMatchedSubAppResource.resolvec                 C   s   dj | jdS )Nz"<MatchedSubAppResource -> {app!r}>)rK   )r   rT  rc   rU   rU   rV   r   y  s    zMatchedSubAppResource.__repr__)rP   rQ   rR   rM   ra   rt   rS   rd   rD   ro   r-   rw   rj   r   rU   rU   rU   rV   rp  `  s   rp  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 )r8   zA route with resourceNr   )r|   r}   r{   rz   r[   c                   s   t  j||||d d S )Nry   )r   ra   )r`   r|   r}   r{   rz   r   rU   rV   ra     s    zResourceRoute.__init__rb   c                 C   s   dj | j| j| jdS )Nz3<ResourceRoute [{method}] {resource} -> {handler!r})r|   r{   r}   )r   r|   r   r}   rc   rU   rU   rV   r     s    zResourceRoute.__repr__c                 C   s   | j d u rd S | j jS r\   )r   rY   rc   rU   rU   rV   rY     s    
zResourceRoute.namer   c                 O   s    | j dusJ | j j|i |S r   )r   rf   r   rU   rU   rV   rf     s    zResourceRoute.url_forc                 C   s   | j d usJ | j  S r\   )r   ro   rc   rU   rU   rV   ro     s    zResourceRoute.get_info)rP   rQ   rR   __doc__rS   r   r%   r   r"   r3   r   r   ra   r   rt   rY   r   rf   rD   ro   r   rU   rU   r   rV   r8   }  s   r8   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 r\   )r   ra   r   r   r  _http_exceptionr   r   rU   rV   ra     s    zSystemRoute.__init__r   c                 O   s   t dd S )Nz).url_for() is not allowed for SystemRouterW  r   rU   rU   rV   rf     s    zSystemRoute.url_forrb   c                 C   s   d S r\   rU   rc   rU   rU   rV   rY     s    zSystemRoute.namec                 C   s
   d| j iS )NrO   rs  rc   rU   rU   rV   ro     s    zSystemRoute.get_inforg   c                    s
   | j d S r\   rt  ri   rU   rU   rV   r    s    zSystemRoute._handlec                 C   s   | j jS r\   )rs  r   rc   rU   rU   rV   r     s    zSystemRoute.statusc                 C   s   | j jS r\   )rs  r   rc   rU   rU   rV   r     s    zSystemRoute.reasonc                 C   s   dj | dS )Nz*<SystemRoute {self.status}: {self.reason}>rc   )r   rc   rU   rU   rV   r     s    zSystemRoute.__repr__)rP   rQ   rR   r'   ra   rS   r   rf   rt   r   rY   rD   ro   r-   r/   r  r   r   r   r   r   rU   rU   r   rV   r     s   r   c                   @   s@   e Zd ZedddZeedef dddZedddZ	dS )	r:   rb   c                    sX   | j jtjvr|   t| | j j d }|d u r:|   | I d H }t|tsTJ |S r\   )	rh   r|   r   METH_ALL_raise_allowed_methodsgetattrr   r   r/   )r`   r|   retrU   rU   rV   _iter  s    z
View._iterNc                 C   s   |    S r\   )ry  	__await__rc   rU   rU   rV   rz    s    zView.__await__c                    s&    fddt jD }t jj|d S )Nc                    s   h | ]}t  | r|qS rU   )hasattrr   )r   r:  rc   rU   rV   	<setcomp>  r  z.View._raise_allowed_methods.<locals>.<setcomp>)r   ru  r*   rh   r|   )r`   r   rU   rc   rV   rv    s    zView._raise_allowed_methods)
rP   rQ   rR   r/   ry  r   r   rz  r   rv  rU   rU   rU   rV   r:     s   r:   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)rV  r[   c                 C   s
   || _ d S r\   
_resources)r`   rV  rU   rU   rV   ra     s    zResourcesView.__init__rb   c                 C   s
   t | jS r\   )r   r  rc   rU   rU   rV   r     s    zResourcesView.__len__c                 c   s   | j E d H  d S r\   r~  rc   rU   rU   rV   r     s    zResourcesView.__iter__r{   r[   c                 C   s
   || j v S r\   r~  r`   r{   rU   rU   rV   __contains__  s    zResourcesView.__contains__)rP   rQ   rR   r   r3   ra   r   r   r   r   objectrx   r  rU   rU   rU   rV   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)rV  c                 C   s*   g | _ |D ]}|D ]}| j | qq
d S r\   )r   r   )r`   rV  r{   r   rU   rU   rV   ra     s    zRoutesView.__init__rb   c                 C   s
   t | jS r\   r   rc   rU   rU   rV   r     s    zRoutesView.__len__c                 c   s   | j E d H  d S r\   r   rc   rU   rU   rV   r     s    zRoutesView.__iter__r   c                 C   s
   || j v S r\   r  r   rU   rU   rV   r    s    zRoutesView.__contains__N)rP   rQ   rR   r   r3   ra   r   r   r   r7   r   r  rx   r  rU   rU   rU   rV   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 )Br1   z[.:-]Nrb   c                    s   t    g | _i | _d S r\   )r   ra   r  _named_resourcesrc   r   rU   rV   ra     s    
zUrlDispatcher.__init__rg   c                    sd   |j }t }| jD ]0}||I d H \}}|d ur:|  S ||O }q|rVtt||S tt S d S r\   )r|   r   r  rj   r   r*   r+   )r`   rh   r|   r   r{   r   allowedrU   rU   rV   rj     s    

zUrlDispatcher.resolvec                 C   s
   t | jS r\   )r   r  rc   rU   rU   rV   r     s    zUrlDispatcher.__iter__c                 C   s
   t | jS r\   )r   r  rc   rU   rU   rV   r     s    zUrlDispatcher.__len__r  c                 C   s
   || j v S r\   r  r  rU   rU   rV   r    s    zUrlDispatcher.__contains__rZ   c                 C   s
   | j | S r\   r  r_   rU   rU   rV   __getitem__  s    zUrlDispatcher.__getitem__c                 C   s
   t | jS r\   )r}  r  rc   rU   rU   rV   rV    s    zUrlDispatcher.resourcesc                 C   s
   t | jS r\   )r  r  rc   rU   rU   rV   rJ     s    zUrlDispatcher.routesc                 C   s
   t | jS r\   )r   r  rc   rU   rU   rV   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   r3   frozenr   rY   NAME_SPLIT_REr   keyword	iskeywordr   isidentifierr   r  r  r   )r`   r{   rY   r   r   rU   rU   rV   register_resource   s:    




zUrlDispatcher.register_resourcerX   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 )NrA   z)path should be started with / or be emptyr   r   rX   )r   r   r  rY   rs   r   r4   r@   searchr5   r   r  r6   )r`   rE   rY   r{   rU   rU   rV   add_resourceA  s    



zUrlDispatcher.add_resource)rY   rz   )r|   rE   r}   rY   rz   r[   c                C   s   | j ||d}|j|||dS )NrX   r   )r  r   )r`   r|   rE   r}   rY   rz   r{   rU   rU   rV   r   Q  s    	zUrlDispatcher.add_router	  Fr
  )	rI   rE   rY   rz   r  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   rz   r  r  r  r  r{   rU   rU   rV   
add_static]  s    


zUrlDispatcher.add_static)rE   r}   re   r[   c                 K   s   | j tj||fi |S )z(Shortcut for add_route with method HEAD.)r   r   	METH_HEADr`   rE   r}   re   rU   rU   rV   add_head  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  rU   rU   rV   add_options  s    zUrlDispatcher.add_optionsT)rY   
allow_head)rE   r}   rY   r  re   r[   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  ZMETH_GET)r`   rE   r}   rY   r  re   r{   rU   rU   rV   add_get  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  rU   rU   rV   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  rU   rU   rV   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  rU   rU   rV   	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  rU   rU   rV   
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  rU   rU   rV   add_view  s    zUrlDispatcher.add_viewc                    s"   t    | jD ]}|  qd S r\   )r   rp   r  r  r   rU   rV   rp     s    

zUrlDispatcher.freeze)rJ   r[   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   Zregistered_routesZ	route_defrU   rU   rV   
add_routes  s    zUrlDispatcher.add_routes)6rP   rQ   rR   r   r   r  ra   r-   r2   rj   r   rS   r   r   r   r  rx   r  r3   r  r}  rV  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  rp   r   r0   r   r  r   rU   rU   r   rV   r1     sx   
!"	
r1   )r   r[   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   rU   rU   rV   r     s    r   c                 C   s   t j| ddjS r   )r   r   rE   r  rU   rU   rV   r     s    r   c                 C   s    t | }d| v r|dd}|S )Nr  r   )r   r#  )r   r   rU   rU   rV   r     s    r   )wru   r~   r6  	functoolsr3  rP  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   Zyarlr   r   Zyarl_versionr   r   r    r!   r"   Zhelpersr#   httpr$   Ztypedefsr%   r&   Zweb_exceptionsr'   r(   r)   r*   r+   Zweb_fileresponser,   Zweb_requestr-   Zweb_responser.   r/   Zweb_routedefr0   __all__Zweb_appr;   rS   ZBaseDictdictr   mapr   r   r>   rT   r   r?   r@   r   rB   r   rw   partialrH  rD   r3   ABCr7   r2   r   r   r4   r5   r6   r  r9   rS  rM   rZ  rl  rp  r8   r   r:   r}  r  r1   r   r   r   rU   rU   rU   rV   <module>   s   
`0/QC<)L O,($ Q