a
    h                     @   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$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/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7 ddl8m9Z9m:Z:m;Z;m<Z<m=Z= ddl>m?Z? ddl@mAZA ddlBmCZCmDZD ddlEmFZF dZGerddlHmIZI eeJeJf ZKneLZKeMeNeOe+Pddd ZQee#eOdf  eRd< eSdZTee eJ  eRd< eSdZUee eJ  eRd< eVdZWeeJ eRd< eeAgeeeD  f ZXe#ed e!eJ f ZYG d d! d!e%d"d#ZZG d$d% d%e"ed& Z[G d'd& d&e j\Z]G d(d deKe.Z^G d)d* d*e^Z_eAdd+d,d-Z`G d.d/ d/e[ZaG d0d1 d1eaZbG d2d3 d3eaZcG d4d5 d5e[ZdG d6d7 d7edZeG d8d9 d9edZfG d:d; d;e j\ZgG d<d= d=egZhG d>d? d?ehZiG d@dA dAefZjG dBdC dCe]ZkG dDdE dEe]ZlG dFdG dGe0ZmG dHdI dIe"ee[ ee[ ZnG dJdK dKe"ee] ee] ZoG dLdM dMe/eeJe[f ZpeJeJdNdOdPZqeJeJdNdQdRZreJeJdNdSdTZsdS )U    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   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prefixr7   routesr;   appdomainAbstractRuleMatchingrulehttp_exceptionN)	__name__
__module____qualname__str__annotations__r   r   r   r'    rT   rT   ^/var/www/html/swiplay.fr/scambot/venv/lib/python3.9/site-packages/aiohttp/web_urldispatcher.pyrC   ^   s   
rC   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rX   returnc                C   s
   || _ d S N_nameselfrX   rT   rT   rU   __init__r   s    zAbstractResource.__init__rZ   c                 C   s   | j S r[   r\   r_   rT   rT   rU   rX   u   s    zAbstractResource.namec                 C   s   dS )zWExposes the resource's canonical path.

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

        NrT   rb   rT   rT   rU   	canonicaly   s    zAbstractResource.canonical)kwargsrZ   c                 K   s   dS )z2Construct url for resource with additional params.NrT   )r_   rd   rT   rT   rU   url_for   s    zAbstractResource.url_forrequestrZ   c                    s   dS )zWResolve resource.

        Return (UrlMappingMatchInfo, allowed_methods) pair.
        NrT   r_   rg   rT   rT   rU   resolve   s    zAbstractResource.resolverH   rZ   c                 C   s   dS )zWAdd a prefix to processed URLs.

        Required for subapplications support.
        NrT   r_   rH   rT   rT   rU   
add_prefix   s    zAbstractResource.add_prefixc                 C   s   dS z;Return a dict with additional info useful for introspectionNrT   rb   rT   rT   rU   get_info   s    zAbstractResource.get_infoc                 C   s   d S r[   rT   rb   rT   rT   rU   freeze   s    zAbstractResource.freezerD   rZ   c                 C   s   dS )z Perform a raw match against pathNrT   r_   rD   rT   rT   rU   	raw_match   s    zAbstractResource.raw_match)rO   rP   rQ   r   rR   r`   propertyrX   abcabstractmethodrc   r   re   r-   _Resolveri   rl   rC   rn   ro   boolrr   rT   rT   rT   rU   r3   q   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handlerry   rz   rZ   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 onesrf   c                    s.    | }t |r|I d H }t|ts*J |S r[   )asyncioiscoroutine
isinstancer/   )rg   resultZold_handlerrT   rU   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|   ry   rz   r   rT   r   rU   r`      s>    	


zAbstractRoute.__init__ra   c                 C   s   | j S r[   )r   rb   rT   rT   rU   r{      s    zAbstractRoute.methodc                 C   s   | j S r[   )r   rb   rT   rT   rU   r|      s    zAbstractRoute.handlerc                 C   s   dS )z8Optional route's name, always equals to resource's name.NrT   rb   rT   rT   rU   rX      s    zAbstractRoute.namec                 C   s   | j S r[   )r   rb   rT   rT   rU   rz      s    zAbstractRoute.resourcec                 C   s   dS rm   rT   rb   rT   rT   rU   rn      s    zAbstractRoute.get_infoargsrd   rZ   c                 O   s   dS z/Construct url for route with additional params.NrT   r_   r   rd   rT   rT   rU   re      s    zAbstractRoute.url_forrf   c                    s   |  |I d H S r[   )r   rh   rT   rT   rU   handle_expect_header   s    z"AbstractRoute.handle_expect_header)rO   rP   rQ   rR   r   r%   r   r"   r   _ExpectHandlerr3   r`   rs   r{   r|   rt   ru   rX   rz   rC   rn   r   re   r-   r/   r   rT   rT   rT   rU   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)superr`   _route_apps_current_app_frozen)r_   r   r   	__class__rT   rU   r`      s
    zUrlMappingMatchInfo.__init__ra   c                 C   s   | j jS r[   )r   r|   rb   rT   rT   rU   r|      s    zUrlMappingMatchInfo.handlerc                 C   s   | j S r[   )r   rb   rT   rT   rU   r      s    zUrlMappingMatchInfo.routec                 C   s   | j jS r[   )r   r   rb   rT   rT   rU   ry     s    z"UrlMappingMatchInfo.expect_handlerc                 C   s   d S r[   rT   rb   rT   rT   rU   rN     s    z"UrlMappingMatchInfo.http_exceptionc                 C   s
   | j  S r[   )r   rn   rb   rT   rT   rU   rn   	  s    zUrlMappingMatchInfo.get_info)r;   .c                 C   s
   t | jS r[   )tupler   rb   rT   rT   rU   apps  s    zUrlMappingMatchInfo.appsr;   N)rJ   rZ   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_   rJ   rT   rT   rU   add_app  s
    
zUrlMappingMatchInfo.add_appc                 C   s   | j }|d usJ |S r[   )r   r   rT   rT   rU   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_   rJ   prevrT   rT   rU   set_current_app  s    
z#UrlMappingMatchInfo.set_current_appc                 C   s
   d| _ d S )NT)r   rb   rT   rT   rU   ro   -  s    zUrlMappingMatchInfo.freezec                    s   dt    d| j dS )Nz<MatchInfo z: >)r   __repr__r   rb   r   rT   rU   r   0  s    zUrlMappingMatchInfo.__repr__)rO   rP   rQ   r   rR   r7   r`   rs   r%   r|   r   r   ry   r   r'   rN   rC   rn   r   r   r   r   r   r   r   ro   r   __classcell__rT   rT   r   rU   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rN   rZ   c                    s   || _ t i t| j  d S r[   )
_exceptionr   r`   SystemRouter_   rN   r   rT   rU   r`   5  s    zMatchInfoError.__init__ra   c                 C   s   | j S r[   )r   rb   rT   rT   rU   rN   9  s    zMatchInfoError.http_exceptionc                 C   s   d | jj| jjS )Nz<MatchInfoError {}: {}>)r   r   statusreasonrb   rT   rT   rU   r   =  s    zMatchInfoError.__repr__)
rO   rP   rQ   r'   r`   rs   rN   rR   r   r   rT   rT   r   rU   r   4  s   r   rf   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(   )rg   expectrT   rT   rU   r   C  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   NrW   rY   c                   s   t  j|d g | _d S )NrW   )r   r`   _routesr^   r   rT   rU   r`   R  s    zResource.__init__ry   r8   )r{   r|   ry   rZ   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|   ry   	route_objrT   rT   rU   	add_routeV  s    

zResource.add_router   rZ   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   rT   rT   rU   r   j  s    zResource.register_routerf   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_   rg   allowed_methodsr   r   Zroute_methodrT   rT   rU   ri   p  s    

zResource.resolverp   c                 C   s   d S r[   rT   rq   rT   rT   rU   r     s    zResource._matchra   c                 C   s
   t | jS r[   lenr   rb   rT   rT   rU   __len__  s    zResource.__len__c                 C   s
   t | jS r[   )iterr   rb   rT   rT   rU   __iter__  s    zResource.__iter__)rO   rP   rQ   r   rR   r`   r   r   r"   r%   r   r   r   r-   rv   ri   rt   ru   r   r   intr   r   r   r   rT   rT   r   rU   r4   Q  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   NrW   rD   rX   rZ   c                   s*   t  j|d |r |ds J || _d S )NrW   rA   )r   r`   
startswith_path)r_   rD   rX   r   rT   rU   r`     s    zPlainResource.__init__ra   c                 C   s   | j S r[   r   rb   rT   rT   rU   rc     s    zPlainResource.canonicalc                 C   s   | j sd| _ d S )NrA   r   rb   rT   rT   rU   ro     s    zPlainResource.freezerj   c                 C   s<   | dsJ |drJ t|dks,J || j | _d S NrA   r   )r   endswithr   r   rk   rT   rT   rU   rl     s    zPlainResource.add_prefixrp   c                 C   s   | j |kri S d S d S r[   r   rq   rT   rT   rU   r     s    
zPlainResource._matchc                 C   s
   | j |kS r[   r   rq   rT   rT   rU   rr     s    zPlainResource.raw_matchc                 C   s
   d| j iS )NrD   r   rb   rT   rT   rU   rn     s    zPlainResource.get_infoc                 C   s   t j| jddS NTrD   encoded)r   buildr   rb   rT   rT   rU   re     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   )rX   r   r^   rT   rT   rU   r     s    zPlainResource.__repr__)rO   rP   rQ   rR   r   r`   rs   rc   ro   rl   r   r   rw   rr   rC   rn   r   re   r   r   rT   rT   r   rU   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[^{}/]+NrW   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 )NrW   r   z
(?P<{}>{})var{}z(?P<{var}>{re})zInvalid path 'z'['z']zBad pattern 'z': rA   )r   r`   r@   splitDYN	fullmatchr   groupGOODDYN_WITH_RE	groupdictr   _requote_pathreescapecompileerrorrF   r   rB   _pattern
_formatter)	r_   rD   rX   rF   rE   partr   Zcompiledexcr   rT   rU   r`     s6    ,zDynamicResource.__init__ra   c                 C   s   | j S r[   r   rb   rT   rT   rU   rc     s    zDynamicResource.canonicalrj   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   rF   r   rk   rT   rT   rU   rl     s
    zDynamicResource.add_prefixrp   c                 C   s2   | j |}|d u rd S dd |  D S d S )Nc                 S   s   i | ]\}}|t |qS rT   )_unquote_path).0keyvaluerT   rT   rU   
<dictcomp>  s   z*DynamicResource._match.<locals>.<dictcomp>)r   r   r   items)r_   rD   r   rT   rT   rU   r     s    
zDynamicResource._matchc                 C   s
   | j |kS r[   r   rq   rT   rT   rU   rr     s    zDynamicResource.raw_matchc                 C   s   | j | jdS )N)rE   rF   )r   r   rb   rT   rT   rU   rn     s    zDynamicResource.get_info)partsrZ   c                 K   s(   | j dd | D }tj|ddS )Nc                 S   s   i | ]\}}|t |qS rT   )_quote_path)r   kvrT   rT   rU   r         z+DynamicResource.url_for.<locals>.<dictcomp>Tr   )r   
format_mapr   r   r   )r_   r   urlrT   rT   rU   re     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}>)rX   rE   )rX   r   r   r^   rT   rT   rU   r     s    zDynamicResource.__repr__)rO   rP   rQ   r   r   r   r   r   rR   r   r`   rs   rc   rl   r   r   rw   rr   rC   rn   r   re   r   r   rT   rT   r   rU   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 )PrefixResourceNrW   )rH   rX   rZ   c                   sX   |r| dsJ ||dv s0|dr0J |t j|d t|| _| jd | _d S )NrA   )r   rA   rW   )r   r   r   r`   r   _prefix_prefix2)r_   rH   rX   r   rT   rU   r`     s
    
zPrefixResource.__init__ra   c                 C   s   | j S r[   )r  rb   rT   rT   rU   rc   
  s    zPrefixResource.canonicalrj   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  rk   rT   rT   rU   rl     s
    zPrefixResource.add_prefixc                 C   s   dS r   rT   rk   rT   rT   rU   rr     s    zPrefixResource.raw_match)rO   rP   rQ   rR   r   r`   rs   rc   rl   rw   rr   r   rT   rT   r   rU   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rX   ry   
chunk_size
show_indexfollow_symlinksappend_version)	rH   rG   rX   ry   r	  r
  r  r  rZ   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 )
NrW   ~zNot a directoryzNo directory exists at 'r   GETr   HEAD)r  r  )r   r`   r   rR   r   osrD   
expanduserri   is_dirr   FileNotFoundError
_directory_show_index_chunk_size_follow_symlinksr   _append_versionr8   _handler   )
r_   rH   rG   rX   ry   r	  r
  r  r  r   r   rT   rU   r`     s.    (

zStaticResource.__init__)r  )filenamer  rZ   c             	   C   s   |d u r| j }t|d}tj| jdd}tdk rF||dd }n|| }|rz&| j	|
 }| jsv|| 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  rR   lstripr   r   r  r>   replacer  joinpathri   r  relative_tor   r  is_fileopenread_get_file_hashZ
with_queryVERSION_KEY)r_   r  r  r  filepathfZ
file_byteshrT   rT   rU   re   D  s*    
&
zStaticResource.url_for)
byte_arrayrZ   c                 C   s*   t  }||  t| }|dS )Nascii)hashlibsha256updatebase64urlsafe_b64encodedigestdecode)r,  mZb64rT   rT   rU   r'  h  s    
zStaticResource._get_file_hashra   c                 C   s   | j | j| jdS )N)rG   rH   rI   )r  r  r   rb   rT   rT   rU   rn   o  s    zStaticResource.get_info)r|   rZ   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|   rT   rT   rU   set_options_routev  s
    

z StaticResource.set_options_routerf   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_   rg   rD   r{   r   r   rT   rT   rU   ri   }  s    

zStaticResource.resolvec                 C   s
   t | jS r[   r   rb   rT   rT   rU   r     s    zStaticResource.__len__c                 C   s   t | j S r[   )r   r   valuesrb   rT   rT   rU   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"  ri   r  r#  r   r  r+   	ExceptionrJ   logger	exceptionr  r  r.   _directory_as_htmlPermissionErrorr$  r,   r  )r_   rg   r   r  r)  r   rT   rT   rU   r    s6    



zStaticResource._handle)r)  rZ   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>rA   z#<li><a href="{url}">{name}</a></li>)r  rX   z<ul>
{}
</ul>
z<body>
z
</body>z<head>
<title>z</title>
</head>z<html>
z
</html>)r  r#  r  as_posixiterdirsortedr  rX   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htmlrT   rT   rU   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}>)rX   rD   rG   )rX   r   r  r  r^   rT   rT   rU   r     s    
zStaticResource.__repr__)!rO   rP   rQ   r(  rR   r&   r   r   r   rw   r`   r   re   staticmethodbytesr'  rC   rn   r%   r7  r-   rv   ri   r   r   r7   r   r/   r  r   r?  r   r   rT   rT   r   rU   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)rH   rJ   rZ   c                    s0   t  | || _|j D ]}|| qd S r[   )r   r`   _approuter	resourcesrl   )r_   rH   rJ   rz   r   rT   rU   r`     s    zPrefixedSubAppResource.__init__rj   c                    s,   t  | | jj D ]}|| qd S r[   )r   rl   rP  rQ  rR  )r_   rH   rz   r   rT   rU   rl     s    z!PrefixedSubAppResource.add_prefixr   c                 O   s   t dd S )Nz3.url_for() is not supported by sub-application rootr   r   rT   rT   rU   re     s    zPrefixedSubAppResource.url_forra   c                 C   s   | j | jdS )N)rJ   rH   )rP  r  rb   rT   rT   rU   rn     s    zPrefixedSubAppResource.get_inforf   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   rP  rQ  ri   r   r   rN   r*   r   r_   rg   r:  methodsrT   rT   rU   ri     s    

zPrefixedSubAppResource.resolvec                 C   s   t | jj S r[   )r   rP  rQ  rI   rb   rT   rT   rU   r     s    zPrefixedSubAppResource.__len__c                 C   s   t | jj S r[   )r   rP  rQ  rI   rb   rT   rT   rU   r     s    zPrefixedSubAppResource.__iter__c                 C   s   dj | j| jdS )Nz,<PrefixedSubAppResource {prefix} -> {app!r}>)rH   rJ   )r   r  rP  rb   rT   rT   rU   r     s    zPrefixedSubAppResource.__repr__)rO   rP   rQ   rR   r`   rl   r   re   rC   rn   r-   rv   ri   r   r   r   r7   r   r   r   rT   rT   r   rU   rO    s   rO  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 )
rL   rf   c                    s   dS )z1Return bool if the request satisfies the criteriaNrT   rh   rT   rT   rU   r     s    zAbstractRuleMatching.matchra   c                 C   s   dS rm   rT   rb   rT   rT   rU   rn     s    zAbstractRuleMatching.get_infoc                 C   s   dS )zReturn a strNrT   rb   rT   rT   rU   rc     s    zAbstractRuleMatching.canonicalN)rO   rP   rQ   rt   ru   r-   rw   r   rC   rn   rs   rR   rc   rT   rT   rT   rU   rL     s   rL   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rK   rZ   c                    s   t    | || _d S r[   )r   r`   
validation_domain)r_   rK   r   rT   rU   r`     s    
zDomain.__init__ra   c                 C   s   | j S r[   rY  rb   rT   rT   rU   rc   #  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   xrb   rT   rU   	<genexpr>1  r  z$Domain.validation.<locals>.<genexpr>zDomain not validP   :)r   rR   	TypeErrorrstripr   r   r   Zraw_hostallr   port)r_   rK   r  rT   rb   rU   rX  '  s    


zDomain.validationrf   c                    s    |j tj}|sdS | |S r   )r   r   r   ZHOSTmatch_domain)r_   rg   hostrT   rT   rU   r   7  s    zDomain.matchre  rZ   c                 C   s   |  | jkS r[   )r   rY  r_   re  rT   rT   rU   rd  =  s    zDomain.match_domainc                 C   s
   d| j iS )NrK   rZ  rb   rT   rT   rU   rn   @  s    zDomain.get_info)rO   rP   rQ   r   r   r[  rR   r`   rs   rc   rX  r-   rw   r   rd  rC   rn   r   rT   rT   r   rU   rV    s   
rV  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}(?<!-)NrW  c                    s2   t  | | jdddd}t|| _d S )Nr<   z\.*z.*)r   r`   rY  r!  r   r   _mask)r_   rK   maskr   rT   rU   r`   G  s    zMaskDomain.__init__ra   c                 C   s   | j jS r[   )rj  rF   rb   rT   rT   rU   rc   L  s    zMaskDomain.canonicalrf  c                 C   s   | j |d uS r[   )rj  r   rg  rT   rT   rU   rd  P  s    zMaskDomain.match_domain)rO   rP   rQ   r   r   r[  rR   r`   rs   rc   rw   rd  r   rT   rT   r   rU   rh  D  s
   
rh  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)rM   rJ   rZ   c                 C   s    t |  d| _|| _|| _d S )Nr   )r3   r`   r  rP  _rule)r_   rM   rJ   rT   rT   rU   r`   U  s    
zMatchedSubAppResource.__init__ra   c                 C   s   | j jS r[   )rm  rc   rb   rT   rT   rU   rc   [  s    zMatchedSubAppResource.canonicalc                 C   s   | j | jdS )N)rJ   rM   )rP  rm  rb   rT   rT   rU   rn   _  s    zMatchedSubAppResource.get_inforf   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[   )rm  r   r   rP  rQ  ri   r   r   rN   r*   r   rT  rT   rT   rU   ri   b  s    

zMatchedSubAppResource.resolvec                 C   s   dj | jdS )Nz"<MatchedSubAppResource -> {app!r}>)rJ   )r   rP  rb   rT   rT   rU   r   m  s    zMatchedSubAppResource.__repr__)rO   rP   rQ   rL   r`   rs   rR   rc   rC   rn   r-   rv   ri   r   rT   rT   rT   rU   rl  T  s   rl  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|   rz   ry   rZ   c                   s   t  j||||d d S )Nrx   )r   r`   )r_   r{   r|   rz   ry   r   rT   rU   r`   t  s    zResourceRoute.__init__ra   c                 C   s   dj | j| j| jdS )Nz3<ResourceRoute [{method}] {resource} -> {handler!r})r{   rz   r|   )r   r{   r   r|   rb   rT   rT   rU   r     s    zResourceRoute.__repr__c                 C   s   | j d u rd S | j jS r[   )r   rX   rb   rT   rT   rU   rX     s    
zResourceRoute.namer   c                 O   s    | j dusJ | j j|i |S r   )r   re   r   rT   rT   rU   re     s    zResourceRoute.url_forc                 C   s   | j d usJ | j  S r[   )r   rn   rb   rT   rT   rU   rn     s    zResourceRoute.get_info)rO   rP   rQ   __doc__rR   r   r%   r   r"   r3   r   r   r`   r   rs   rX   r   re   rC   rn   r   rT   rT   r   rU   r8   q  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   r`   r   r   r  _http_exceptionr   r   rT   rU   r`     s    zSystemRoute.__init__r   c                 O   s   t dd S )Nz).url_for() is not allowed for SystemRouterS  r   rT   rT   rU   re     s    zSystemRoute.url_forra   c                 C   s   d S r[   rT   rb   rT   rT   rU   rX     s    zSystemRoute.namec                 C   s
   d| j iS )NrN   ro  rb   rT   rT   rU   rn     s    zSystemRoute.get_inforf   c                    s
   | j d S r[   rp  rh   rT   rT   rU   r    s    zSystemRoute._handlec                 C   s   | j jS r[   )ro  r   rb   rT   rT   rU   r     s    zSystemRoute.statusc                 C   s   | j jS r[   )ro  r   rb   rT   rT   rU   r     s    zSystemRoute.reasonc                 C   s   dj | dS )Nz*<SystemRoute {self.status}: {self.reason}>rb   )r   rb   rT   rT   rU   r     s    zSystemRoute.__repr__)rO   rP   rQ   r'   r`   rR   r   re   rs   r   rX   rC   rn   r-   r/   r  r   r   r   r   r   rT   rT   r   rU   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:   ra   c                    sX   | j jtjvr|   t| | j j d }|d u r:|   | I d H }t|tsTJ |S r[   )	rg   r{   r   METH_ALL_raise_allowed_methodsgetattrr   r   r/   )r_   r{   retrT   rT   rU   _iter  s    z
View._iterNc                 C   s   |    S r[   )ru  	__await__rb   rT   rT   rU   rv    s    zView.__await__c                    s&    fddt jD }t jj|d S )Nc                    s   h | ]}t  | r|qS rT   )hasattrr   )r   r5  rb   rT   rU   	<setcomp>  r  z.View._raise_allowed_methods.<locals>.<setcomp>)r   rq  r*   rg   r{   )r_   r   rT   rb   rU   rr    s    zView._raise_allowed_methods)
rO   rP   rQ   r/   ru  r   r   rv  r   rr  rT   rT   rT   rU   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)rR  rZ   c                 C   s
   || _ d S r[   
_resources)r_   rR  rT   rT   rU   r`     s    zResourcesView.__init__ra   c                 C   s
   t | jS r[   )r   r{  rb   rT   rT   rU   r     s    zResourcesView.__len__c                 c   s   | j E d H  d S r[   rz  rb   rT   rT   rU   r     s    zResourcesView.__iter__rz   rZ   c                 C   s
   || j v S r[   rz  r_   rz   rT   rT   rU   __contains__  s    zResourcesView.__contains__)rO   rP   rQ   r   r3   r`   r   r   r   r   objectrw   r~  rT   rT   rT   rU   ry    s   ry  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)rR  c                 C   s*   g | _ |D ]}|D ]}| j | qq
d S r[   )r   r   )r_   rR  rz   r   rT   rT   rU   r`     s    zRoutesView.__init__ra   c                 C   s
   t | jS r[   r   rb   rT   rT   rU   r     s    zRoutesView.__len__c                 c   s   | j E d H  d S r[   r   rb   rT   rT   rU   r     s    zRoutesView.__iter__r   c                 C   s
   || j v S r[   r  r   rT   rT   rU   r~    s    zRoutesView.__contains__N)rO   rP   rQ   r   r3   r`   r   r   r   r7   r   r  rw   r~  rT   rT   rT   rU   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[.:-]Nra   c                    s   t    g | _i | _d S r[   )r   r`   r{  _named_resourcesrb   r   rT   rU   r`     s    
zUrlDispatcher.__init__rf   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{  ri   r   r*   r+   )r_   rg   r{   r   rz   r   allowedrT   rT   rU   ri     s    

zUrlDispatcher.resolvec                 C   s
   t | jS r[   )r   r  rb   rT   rT   rU   r     s    zUrlDispatcher.__iter__c                 C   s
   t | jS r[   )r   r  rb   rT   rT   rU   r     s    zUrlDispatcher.__len__r|  c                 C   s
   || j v S r[   r  r}  rT   rT   rU   r~    s    zUrlDispatcher.__contains__rY   c                 C   s
   | j | S r[   r  r^   rT   rT   rU   __getitem__  s    zUrlDispatcher.__getitem__c                 C   s
   t | jS r[   )ry  r{  rb   rT   rT   rU   rR    s    zUrlDispatcher.resourcesc                 C   s
   t | jS r[   )r  r{  rb   rT   rT   rU   rI     s    zUrlDispatcher.routesc                 C   s
   t | jS r[   )r   r  rb   rT   rT   rU   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   rX   NAME_SPLIT_REr   keyword	iskeywordr   isidentifierr   r  r{  r   )r_   rz   rX   r   r   rT   rT   rU   register_resource  s:    




zUrlDispatcher.register_resourcerW   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   rW   )r   r   r{  rX   rr   r   r4   r@   searchr5   r   r  r6   )r_   rD   rX   rz   rT   rT   rU   add_resource5  s    



zUrlDispatcher.add_resource)rX   ry   )r{   rD   r|   rX   ry   rZ   c                C   s   | j ||d}|j|||dS )NrW   r   )r  r   )r_   r{   rD   r|   rX   ry   rz   rT   rT   rU   r   E  s    	zUrlDispatcher.add_router  Fr  )	rH   rD   rX   ry   r	  r
  r  r  rZ   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_   rH   rD   rX   ry   r	  r
  r  r  rz   rT   rT   rU   
add_staticQ  s    


zUrlDispatcher.add_static)rD   r|   rd   rZ   c                 K   s   | j tj||fi |S )z(Shortcut for add_route with method HEAD.)r   r   	METH_HEADr_   rD   r|   rd   rT   rT   rU   add_heads  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  rT   rT   rU   add_optionsw  s    zUrlDispatcher.add_optionsT)rX   
allow_head)rD   r|   rX   r  rd   rZ   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.
        rW   )r  r   r   r  ZMETH_GET)r_   rD   r|   rX   r  rd   rz   rT   rT   rU   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  rT   rT   rU   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  rT   rT   rU   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  rT   rT   rU   	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  rT   rT   rU   
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  rT   rT   rU   add_view  s    zUrlDispatcher.add_viewc                    s"   t    | jD ]}|  qd S r[   )r   ro   r{  r}  r   rT   rU   ro     s    

zUrlDispatcher.freeze)rI   rZ   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_   rI   Zregistered_routesZ	route_defrT   rT   rU   
add_routes  s    zUrlDispatcher.add_routes)6rO   rP   rQ   r   r   r  r`   r-   r2   ri   r   rR   r   r   r   r  rw   r~  r3   r  ry  rR  r  rI   r   r  r  r   r4   r  r   r%   r   r"   r   r7   r   r&   r  r   r  r  r  r  r  r  r  r  ro   r   r0   r   r  r   rT   rT   r   rU   r1     sx   
!"	
r1   )r   rZ   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   rT   rT   rU   r     s    r   c                 C   s   t j| ddjS r   )r   r   rD   r  rT   rT   rU   r     s    r   c                 C   s    t | }d| v r|dd}|S )Nr  r  )r   r!  )r   r   rT   rT   rU   r     s    r   )trt   r}   r1  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   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;   rR   ZBaseDictdictr   mapr   r   r>   rS   r   r?   r@   r   rB   r   rv   rC   r3   ABCr7   r2   r   r   r4   r5   r6   r  r9   rO  rL   rV  rh  rl  r8   r   r:   ry  r  r1   r   r   r   rT   rT   rT   rU   <module>   s   
`0/QC<)L G,($ Q