o
    n~b{                     @   s  U d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ d dl%m&Z&m'Z( dd	l)m*Z* dd
l m+Z+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZBmCZC ddlDmEZE dZFerddlGmHZH eeIeIf ZJneKZJeLeMeNe(Oddd ZPe3e!eNdf  eQd< eRdZSe3eeI  eQd< eRdZTe3eeI  eQd< eUdZVe3eI eQd< ee@ged f ZWe!ed eeI f ZXG d d! d!e6d"d#ZYG d$d% d%e ed& ZZG d'd& d&e j[Z\G d(d deJe+Z]G d)d* d*e]Z^d+e@d,dfd-d.Z_G d/d0 d0eZZ`G d1d2 d2e`ZaG d3d4 d4e`ZbG d5d6 d6eZZcG d7d8 d8ecZdG d9d: d:ecZeG d;d< d<e j[ZfG d=d> d>efZgG d?d@ d@egZhG dAdB dBeeZiG dCdD dDe\ZjG dEdF dFe\ZkG dGdH dHe-ZlG dIdJ dJe eeZ eeZ ZmG dKdL dLe ee\ ee\ ZnG dMdN dNe,eeIeZf ZodOeId,eIfdPdQZpdOeId,eIfdRdSZqdOeId,eIfdTdUZrdS )V    N)contextmanager)wraps)Path)MappingProxyType)TYPE_CHECKINGAny	AwaitableCallable	ContainerDict	GeneratorIterableIteratorListMappingOptionalPatternSetSizedTupleTypeUnioncast)URL__version__   )hdrs)AbstractMatchInfoAbstractRouterAbstractView)DEBUG)HttpVersion11)FinalHandlerPathLike	TypedDict)HTTPExceptionHTTPExpectationFailedHTTPForbiddenHTTPMethodNotAllowedHTTPNotFound)FileResponse)Request)ResponseStreamResponse)AbstractRouteDef)
UrlDispatcherUrlMappingMatchInfoAbstractResourceResourcePlainResourceDynamicResourceAbstractRouteResourceRouteStaticResourceView)Application.   .YARL_VERSIONz$^[0-9A-Za-z!#\$%&'\*\+\-\.\^_`\|~]+$HTTP_METHOD_REz*(\{[_a-zA-Z][^{}]*(?:\{[^{}]*\}[^{}]*)*\})ROUTE_RE/PATH_SEPr1   c                   @   sj   e Zd ZU eed< eed< ee ed< eed< eed< eedf ed< ded	< eed
< ded< eed< dS )	_InfoDictpath	formatterpattern	directoryprefixr6   routesr:   appdomainAbstractRuleMatchingrulehttp_exceptionN)	__name__
__module____qualname__str__annotations__r   r   r   r&    rS   rS   D/usr/local/lib/python3.10/dist-packages/aiohttp/web_urldispatcher.pyrB   [   s   
 rB   F)totalc                   @   s   e Zd Zdddee ddfddZedee fddZeej	defd	d
Z
ej	dedefddZej	dedefddZej	deddfddZej	defddZdddZej	dedefddZdS )r2   NnamerW   returnc                C   
   || _ d S N_nameselfrW   rS   rS   rT   __init__o      
zAbstractResource.__init__c                 C      | j S rZ   r[   r^   rS   rS   rT   rW   r      zAbstractResource.namec                 C      dS )zWExposes the resource's canonical path.

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

        NrS   rb   rS   rS   rT   	canonicalv       zAbstractResource.canonicalkwargsc                 K   rd   )z2Construct url for resource with additional params.NrS   )r^   rg   rS   rS   rT   url_for   rf   zAbstractResource.url_forrequestc                       dS )zWResolve resource.

        Return (UrlMappingMatchInfo, allowed_methods) pair.
        NrS   r^   ri   rS   rS   rT   resolve       zAbstractResource.resolverG   c                 C   rd   )zWAdd a prefix to processed URLs.

        Required for subapplications support.
        NrS   r^   rG   rS   rS   rT   
add_prefix   rf   zAbstractResource.add_prefixc                 C   rd   z;Return a dict with additional info useful for introspectionNrS   rb   rS   rS   rT   get_info   rf   zAbstractResource.get_infoc                 C      d S rZ   rS   rb   rS   rS   rT   freeze      zAbstractResource.freezerC   c                 C   rd   )z Perform a raw match against pathNrS   r^   rC   rS   rS   rT   	raw_match   rf   zAbstractResource.raw_matchrX   N)rN   rO   rP   r   rQ   r_   propertyrW   abcabstractmethodre   r   rh   r,   _Resolverl   ro   rB   rq   rs   boolrv   rS   rS   rS   rT   r2   n   s$    
r2   r6   c                   @   s   e Zd Zddddedeeee f dee	 dee
 ddf
dd	Zedefd
dZedefddZeejdee fddZedee
 fddZejdefddZejdededefddZdeddfddZdS )r6   Nexpect_handlerresourcemethodhandlerr~   r   rX   c                   s   |d u rt }t|sJ d|| }t|s"t| dt|s*J |t|r0n0t	|r<t
dt n$t|trGt|trGnt
dt t|dtdtf fdd}| |}|| _|| _|| _|| _d S )	NzCoroutine is expected, got z is not allowed HTTP methodz6Bare generators are deprecated, use @coroutine wrapperz-Bare functions are deprecated, use async onesri   rX   c                    s"    | }t |r|I d H S |S rZ   )asyncioiscoroutine)ri   resultZold_handlerrS   rT   handler_wrapper   s
   

z/AbstractRoute.__init__.<locals>.handler_wrapper)_default_expect_handlerr   iscoroutinefunctionupperr>   match
ValueErrorcallableinspectisgeneratorfunctionwarningswarnDeprecationWarning
isinstancetype
issubclassr   r   r,   r.   _method_handler_expect_handler	_resource)r^   r   r   r~   r   r   rS   r   rT   r_      s>   	



zAbstractRoute.__init__c                 C   ra   rZ   )r   rb   rS   rS   rT   r      rc   zAbstractRoute.methodc                 C   ra   rZ   )r   rb   rS   rS   rT   r      rc   zAbstractRoute.handlerc                 C   rd   )z8Optional route's name, always equals to resource's name.NrS   rb   rS   rS   rT   rW      rf   zAbstractRoute.namec                 C   ra   rZ   )r   rb   rS   rS   rT   r      rc   zAbstractRoute.resourcec                 C   rd   rp   rS   rb   rS   rS   rT   rq      rf   zAbstractRoute.get_infoargsrg   c                 O   rd   z/Construct url for route with additional params.NrS   r^   r   rg   rS   rS   rT   rh      rf   zAbstractRoute.url_forri   c                    s   |  |I d H  d S rZ   )r   rk   rS   rS   rT   handle_expect_header   s   z"AbstractRoute.handle_expect_header)rN   rO   rP   rQ   r   r#   r   r   r   _ExpectHandlerr2   r_   rx   r   r   ry   rz   rW   r   rB   rq   r   rh   r,   r   rS   rS   rS   rT   r6      s8    
2c                       s   e Zd Zdeeef def fddZedefddZ	edefdd	Z
edefd
dZedee fddZdefddZeded fddZd!ddZed"ddZeddded fddZd#ddZdef fdd Z  ZS )$r1   
match_dictroutec                    s(   t  | || _g | _d | _d| _d S NF)superr_   _route_apps_current_app_frozen)r^   r   r   	__class__rS   rT   r_      s
   
zUrlMappingMatchInfo.__init__rX   c                 C      | j jS rZ   )r   r   rb   rS   rS   rT   r         zUrlMappingMatchInfo.handlerc                 C   ra   rZ   )r   rb   rS   rS   rT   r      rc   zUrlMappingMatchInfo.routec                 C   r   rZ   )r   r   rb   rS   rS   rT   r~      r   z"UrlMappingMatchInfo.expect_handlerc                 C   rr   rZ   rS   rb   rS   rS   rT   rM        z"UrlMappingMatchInfo.http_exceptionc                 C   s
   | j  S rZ   )r   rq   rb   rS   rS   rT   rq     r`   zUrlMappingMatchInfo.get_info)r:   .c                 C   
   t | jS rZ   )tupler   rb   rS   rS   rT   apps  s   
zUrlMappingMatchInfo.appsrI   r:   Nc                 C   s0   | j rtd| jd u r|| _| jd| d S )Nz-Cannot change apps stack after .freeze() callr   )r   RuntimeErrorr   r   insertr^   rI   rS   rS   rT   add_app  s
   
zUrlMappingMatchInfo.add_appc                 C   s   | j }|d us	J |S rZ   )r   r   rS   rS   rT   current_app  s   zUrlMappingMatchInfo.current_app)NNNc                 c   sJ    t r|| jvrtd| j|| j}|| _z	d V  W || _d S || _w )Nz1Expected one of the following apps {!r}, got {!r})r    r   r   formatr   )r^   rI   prevrS   rS   rT   set_current_app  s   
z#UrlMappingMatchInfo.set_current_appc                 C   s
   d| _ d S )NT)r   rb   rS   rS   rT   rs   )  r`   zUrlMappingMatchInfo.freezec                    s   dt    d| j dS )Nz<MatchInfo z: >)r   __repr__r   rb   r   rS   rT   r   ,  s   zUrlMappingMatchInfo.__repr__)rI   r:   rX   N)rX   r:   rw   )rN   rO   rP   r   rQ   r6   r_   rx   r#   r   r   r   r~   r   r&   rM   rB   rq   r   r   r   r   r   r   r   rs   r   __classcell__rS   rS   r   rT   r1      s(    

c                       sF   e Zd Zdeddf fddZedefddZdefdd	Z  Z	S )
MatchInfoErrorrM   rX   Nc                    s   || _ t i t| j  d S rZ   )
_exceptionr   r_   SystemRouter^   rM   r   rS   rT   r_   1  s   zMatchInfoError.__init__c                 C   ra   rZ   )r   rb   rS   rS   rT   rM   5  rc   zMatchInfoError.http_exceptionc                 C   s   d | jj| jjS )Nz<MatchInfoError {}: {}>)r   r   statusreasonrb   rS   rS   rT   r   9  s   zMatchInfoError.__repr__)
rN   rO   rP   r&   r_   rx   rM   rQ   r   r   rS   rS   r   rT   r   0  s
    r   ri   rX   c                    sP   | j tjd}| jtkr&| dkr| jdI dH  dS t	d| ddS )zDefault handler for Expect header.

    Just send "100 Continue" to client.
    raise HTTPExpectationFailed if value of header is not "100-continue"
     z100-continues   HTTP/1.1 100 Continue

NzUnknown Expect: %s)text)
headersgetr   ZEXPECTversionr!   lowerwriterwriter'   )ri   expectrS   rS   rT   r   ?  s   
r   c                	       s   e Zd Zdddee ddf fddZddded	eee e	f d
ee
 ddfddZdddZdedefddZejdedeeeef  fddZdefddZdee fddZ  ZS )r3   NrV   rW   rX   c                   s   t  j|d g | _d S )NrV   )r   r_   _routesr]   r   rS   rT   r_   N     
zResource.__init__r~   r   r   r~   r7   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   r7   register_route)r^   r   r   r~   	route_objrS   rS   rT   	add_routeR  s   

zResource.add_router   c                 C   s(   t |tsJ d|| j| d S )Nz)Instance of Route class is required, got )r   r7   r   appendr^   r   rS   rS   rT   r   f  s   zResource.register_routeri   c                    sp   t  }| |jj}|d u rd |fS | jD ]}|j}|| ||jks*|tjkr3t	|||f  S qd |fS rZ   )
set_matchrel_urlraw_pathr   r   addr   r   r1   )r^   ri   allowed_methodsr   r   Zroute_methodrS   rS   rT   rl   l  s   

zResource.resolverC   c                 C   rr   rZ   rS   ru   rS   rS   rT   r   |  r   zResource._matchc                 C   r   rZ   lenr   rb   rS   rS   rT   __len__  r`   zResource.__len__c                 C   r   rZ   )iterr   rb   rS   rS   rT   __iter__  r`   zResource.__iter__)r   r7   rX   N)rN   rO   rP   r   rQ   r_   r   r   r   r#   r   r   r   r,   r{   rl   ry   rz   r   r   intr   r   r6   r   r   rS   rS   r   rT   r3   M  s$     	

 r3   c                       s   e Zd Zdddedee ddf fddZedefdd	Zdd
dZdeddfddZ	dedee
eef  fddZdedefddZdefddZdefddZdefddZ  ZS )r4   NrV   rC   rW   rX   c                   s*   t  j|d |r|dsJ || _d S )NrV   r@   )r   r_   
startswith_path)r^   rC   rW   r   rS   rT   r_     s   
zPlainResource.__init__c                 C   ra   rZ   r   rb   rS   rS   rT   re     rc   zPlainResource.canonicalc                 C   s   | j sd| _ d S d S )Nr@   r   rb   rS   rS   rT   rs     s   
zPlainResource.freezerG   c                 C   s<   | dsJ |drJ t|dksJ || j | _d S Nr@   r   )r   endswithr   r   rn   rS   rS   rT   ro     s   zPlainResource.add_prefixc                 C   s   | j |kri S d S rZ   r   ru   rS   rS   rT   r     s   
zPlainResource._matchc                 C   
   | j |kS rZ   r   ru   rS   rS   rT   rv     r`   zPlainResource.raw_matchc                 C   
   d| j iS )NrC   r   rb   rS   rS   rT   rq     r`   zPlainResource.get_infoc                 C   s   t j| jddS NTrC   encoded)r   buildr   rb   rS   rS   rT   rh        zPlainResource.url_forc                 C   s0   | j d urd| j  d nd}d| d| j dS )N'' r   z<PlainResource  r   )rW   r   r]   rS   rS   rT   r     s   zPlainResource.__repr__rw   )rN   rO   rP   rQ   r   r_   rx   re   rs   ro   r   r   r|   rv   rB   rq   r   rh   r   r   rS   rS   r   rT   r4     s    $
r4   c                       s   e Zd ZedZedZdZdddede	e ddf fd	d
Z
edefddZdeddfddZdede	eeef  fddZdedefddZdefddZdedefddZdefddZ  ZS )r5   z#\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*)\}z.\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*):(?P<re>.+)\}z[^{}/]+NrV   rC   rW   rX   c          	   
      sX  t  j|d d}d}t|D ]d}| j|}|r2|d|d| j7 }|d|d d 7 }q| j	|}|rR|djdi |
 7 }|d|d d 7 }qd|v sZd|v retd| d	| d
t|}||7 }|t|7 }qzt|}W n tjy } ztd| d| d d }~ww |jtsJ |dsJ || _|| _d S )NrV   r   z
(?P<{}>{})var{}z(?P<{var}>{re})zInvalid path 'z'['z']zBad pattern 'z': r@   rS   )r   r_   r?   splitDYN	fullmatchr   groupGOODDYN_WITH_RE	groupdictr   _requote_pathreescapecompileerrorrE   r   rA   _pattern
_formatter)	r^   rC   rW   rE   rD   partr   compiledexcr   rS   rT   r_     s:   
zDynamicResource.__init__c                 C   ra   rZ   r   rb   rS   rS   rT   re     rc   zDynamicResource.canonicalrG   c                 C   sV   | dsJ |drJ t|dksJ tt|| jj | _|| j | _d S r   )	r   r   r   r   r   r   r   rE   r   rn   rS   rS   rT   ro     s
   zDynamicResource.add_prefixc                 C   s.   | j |}|d u rd S dd |  D S )Nc                 S      i | ]	\}}|t |qS rS   )_unquote_path).0keyvaluerS   rS   rT   
<dictcomp>  s    z*DynamicResource._match.<locals>.<dictcomp>)r   r   r   items)r^   rC   r   rS   rS   rT   r     s   
zDynamicResource._matchc                 C   r   rZ   r   ru   rS   rS   rT   rv     r`   zDynamicResource.raw_matchc                 C      | j | jdS )N)rD   rE   )r   r   rb   rS   rS   rT   rq        zDynamicResource.get_infopartsc                 K   s(   | j dd | D }tj|ddS )Nc                 S   r  rS   )_quote_path)r  kvrS   rS   rT   r    s    z+DynamicResource.url_for.<locals>.<dictcomp>Tr   )r   
format_mapr  r   r   )r^   r
  urlrS   rS   rT   rh     s   zDynamicResource.url_forc                 C   s,   | j d urd| j  d nd}dj|| jdS )Nr   r   r   z$<DynamicResource {name} {formatter}>)rW   rD   )rW   r   r   r]   rS   rS   rT   r     s   zDynamicResource.__repr__)rN   rO   rP   r   r   r   r   r   rQ   r   r_   rx   re   ro   r   r   r|   rv   rB   rq   r   rh   r   r   rS   rS   r   rT   r5     s    

$!	r5   c                       sj   e Zd Zdddedee ddf fddZedefdd	Zdeddfd
dZdede	fddZ
  ZS )PrefixResourceNrV   rG   rW   rX   c                   sX   |r| dsJ ||dv s|drJ |t j|d t|| _| jd | _d S )Nr@   )r   r@   rV   )r   r   r   r_   r   _prefix_prefix2)r^   rG   rW   r   rS   rT   r_     s
   
zPrefixResource.__init__c                 C   ra   rZ   )r  rb   rS   rS   rT   re     rc   zPrefixResource.canonicalc                 C   sH   | dsJ |drJ t|dksJ || j | _| jd | _d S r   )r   r   r   r  r  rn   rS   rS   rT   ro   
  s
   zPrefixResource.add_prefixc                 C   rd   r   rS   rn   rS   rS   rT   rv     rt   zPrefixResource.raw_match)rN   rO   rP   rQ   r   r_   rx   re   ro   r|   rv   r   rS   rS   r   rT   r    s    $r  c                       s   e Zd ZdZddddddddededee d	ee d
ede	de	de	ddf fddZ
dddeeef dee	 defddZededefddZdefddZdeddfddZdedefddZdefd d!Zdee fd"d#Zdedefd$d%Zd&edefd'd(Zdefd)d*Z   Z!S )+r8   r  N   FrW   r~   
chunk_size
show_indexfollow_symlinksappend_versionrG   rF   rW   r~   r  r  r  r  rX   c          
   
      s   t  j||d z#t|}t|drttjt|}| }|	 s*t
dW n tt
fyB }	 z	t
d| d|	d }	~	ww || _|| _|| _|| _|| _|| _td| j| |dtd| j| |dd	| _d S )
NrV   ~zNot a directoryzNo directory exists at 'r   GETr   HEAD)r  r  )r   r_   r   rQ   r   osrC   
expanduserrl   is_dirr   FileNotFoundError
_directory_show_index_chunk_size_follow_symlinksr   _append_versionr7   _handler   )
r^   rG   rF   rW   r~   r  r  r  r  r   r   rS   rT   r_     s4   

zStaticResource.__init__)r  filenamec             	   C   s   |d u r| j }t|trt|}|d}tj| jdd}tdk r*||	dd }n|| }|r}z| j
| }| jsB|| j
 W n ttfyP   | Y S w | r}|d}| }W d    n1 siw   Y  | |}|| j|i}|S |S )Nr@   Tr   r      %%25rb)r$  r   r   rQ   lstripr   r   r  r=   replacer   joinpathrl   r#  relative_tor   r  is_fileopenread_get_file_hashZ
with_queryVERSION_KEY)r^   r&  r  r  filepathfZ
file_byteshrS   rS   rT   rh   @  s4   



zStaticResource.url_for
byte_arrayc                 C   s*   t  }||  t| }|dS )Nascii)hashlibsha256updatebase64urlsafe_b64encodedigestdecode)r8  mZb64rS   rS   rT   r3  f  s   

zStaticResource._get_file_hashc                 C   s   | j | j| jdS )N)rF   rG   rH   )r   r  r   rb   rS   rS   rT   rq   m  s   zStaticResource.get_infor   c                 C   s.   d| j v r	tdtd|| | jd| j d< d S )NOPTIONSzOPTIONS route was set alreadyr   )r   r   r7   r   )r^   r   rS   rS   rT   set_options_routet  s
   

z StaticResource.set_options_routeri   c                    s|   |j j}|j}t| j}|| js|| jkrd t fS ||vr%d |fS dt|t	| jd d  i}t
|| j| |fS )Nr&  r   )r   r   r   r   r   r   r  r  r  r   r1   )r^   ri   rC   r   r   r   rS   rS   rT   rl   {  s   

zStaticResource.resolvec                 C   r   rZ   r   rb   rS   rS   rT   r     r`   zStaticResource.__len__c                 C   s   t | j S rZ   )r   r   valuesrb   rS   rS   rT   r     r	  zStaticResource.__iter__c              
      s   |j d }zt|}|jrt | j| }| js"|| j W n/ t	t
fy5 } zt |d }~w ty<     tyR } z|jj| t |d }~ww | rr| jroz
t| |ddW S  tyn   t w t | r}t|| jdS t)Nr&  z	text/html)r   content_type)r  )
match_infor   anchorr(   r   r.  rl   r#  r/  r   r  r*   	ExceptionrI   logger	exceptionr  r!  r-   _directory_as_htmlPermissionErrorr0  r+   r"  )r^   ri   r   r&  r5  r   rS   rS   rT   r%    sB   

zStaticResource._handler5  c                 C   s   |  sJ || j }d| }d| d}g }| }t|D ])}|| j }| jd | }	|  r?|j d}
n|j}
|dj	|	|
d q#d	d
|}d	| d| d
}d| d}d| d| d}|S )Nz
Index of /z<h1>z</h1>r@   z#<li><a href="{url}">{name}</a></li>)r  rW   z<ul>
{}
</ul>
z<body>
z
</body>z<head>
<title>z</title>
</head>z<html>
z
</html>)r  r/  r   as_posixiterdirsortedr  rW   r   r   join)r^   r5  Zrelative_path_to_dirZindex_ofh1Z
index_listZ	dir_index_filerel_pathfile_url	file_nameulbodyZhead_strhtmlrS   rS   rT   rK    s,   
z!StaticResource._directory_as_htmlc                 C   s0   | j d urd| j  d nd}dj|| j| jdS )Nr   r   z/<StaticResource {name} {path} -> {directory!r}>)rW   rC   rF   )rW   r   r  r   r]   rS   rS   rT   r     s   
zStaticResource.__repr__)"rN   rO   rP   r4  rQ   r$   r   r   r   r|   r_   r   r   r   rh   staticmethodbytesr3  rB   rq   r#   rC  r,   r{   rl   r   r   r6   r   r.   r%  rK  r   r   rS   rS   r   rT   r8     sZ    	
*

&&$r8   c                       s   e Zd Zdeddddf fddZdeddf fdd	Zd
ededefddZdefddZ	de
defddZdefddZdee fddZdefddZ  ZS )PrefixedSubAppResourcerG   rI   r:   rX   Nc                    s0   t  | || _|j D ]}|| qd S rZ   )r   r_   _approuter	resourcesro   )r^   rG   rI   r   r   rS   rT   r_     s
   zPrefixedSubAppResource.__init__c                    s,   t  | | jj D ]}|| qd S rZ   )r   ro   r]  r^  r_  )r^   rG   r   r   rS   rT   ro     s   z!PrefixedSubAppResource.add_prefixr   rg   c                 O      t d)Nz3.url_for() is not supported by sub-application rootr   r   rS   rS   rT   rh        zPrefixedSubAppResource.url_forc                 C   r  )N)rI   rG   )r]  r  rb   rS   rS   rT   rq     r	  zPrefixedSubAppResource.get_infori   c                    st   |j j| js|j j| jkrd t fS | jj|I d H }|	| j t
|jtr3|jj}||fS t }||fS rZ   )r  r   r   r  r  r   r]  r^  rl   r   r   rM   r)   r   r^   ri   rF  methodsrS   rS   rT   rl     s   
zPrefixedSubAppResource.resolvec                 C      t | jj S rZ   )r   r]  r^  rH   rb   rS   rS   rT   r     r   zPrefixedSubAppResource.__len__c                 C   re  rZ   )r   r]  r^  rH   rb   rS   rS   rT   r     r   zPrefixedSubAppResource.__iter__c                 C   s   dj | j| jdS )Nz,<PrefixedSubAppResource {prefix} -> {app!r}>)rG   rI   )r   r  r]  rb   rS   rS   rT   r     s   zPrefixedSubAppResource.__repr__)rN   rO   rP   rQ   r_   ro   r   rh   rB   rq   r,   r{   rl   r   r   r   r6   r   r   r   rS   rS   r   rT   r\    s    r\  c                   @   sP   e Zd ZejdedefddZejdefddZ	e
ejdefddZd	S )
rK   ri   rX   c                    rj   )z1Return bool if the request satisfies the criteriaNrS   rk   rS   rS   rT   r     rm   zAbstractRuleMatching.matchc                 C   rd   rp   rS   rb   rS   rS   rT   rq     rf   zAbstractRuleMatching.get_infoc                 C   rd   )zReturn a strNrS   rb   rS   rS   rT   re     rf   zAbstractRuleMatching.canonicalN)rN   rO   rP   ry   rz   r,   r|   r   rB   rq   rx   rQ   re   rS   rS   rS   rT   rK     s    rK   c                       s   e Zd ZedZdeddf fddZedefddZ	dedefd	d
Z
dedefddZdedefddZdefddZ  ZS )Domainz(?!-)[a-z\d-]{1,63}(?<!-)rJ   rX   Nc                    s   t    | || _d S rZ   )r   r_   
validation_domain)r^   rJ   r   rS   rT   r_     s   
zDomain.__init__c                 C   ra   rZ   rh  rb   rS   rS   rT   re   !  rc   zDomain.canonicalc                    s   t |ts	td|d }|stdd|v rtdtd| }|jd us+J t fdd|j	dD s>td	|j
d
krF|jS |j d|j
 S )NzDomain must be strr;   zDomain cannot be emptyz://zScheme not supportedzhttp://c                 3   s    | ]	} j |V  qd S rZ   )re_partr   )r  xrb   rS   rT   	<genexpr>/  s    z$Domain.validation.<locals>.<genexpr>zDomain not validP   :)r   rQ   	TypeErrorrstripr   r   r   Zraw_hostallr   port)r^   rJ   r  rS   rb   rT   rg  %  s   

zDomain.validationri   c                    s"   |j tj}|sdS | |S r   )r   r   r   ZHOSTmatch_domain)r^   ri   hostrS   rS   rT   r   5  s
   
zDomain.matchrt  c                 C   s   |  | jkS rZ   )r   rh  r^   rt  rS   rS   rT   rs  ;  r	  zDomain.match_domainc                 C   r   )NrJ   ri  rb   rS   rS   rT   rq   >  r`   zDomain.get_info)rN   rO   rP   r   r   rj  rQ   r_   rx   re   rg  r,   r|   r   rs  rB   rq   r   rS   rS   r   rT   rf    s    
rf  c                       sT   e Zd ZedZdeddf fddZedefddZ	d	ede
fd
dZ  ZS )
MaskDomainz(?!-)[a-z\d\*-]{1,63}(?<!-)rJ   rX   Nc                    s2   t  | | jdddd}t|| _d S )Nr;   z\.*z.*)r   r_   rh  r-  r   r   _mask)r^   rJ   maskr   rS   rT   r_   E  s   zMaskDomain.__init__c                 C   r   rZ   )rx  rE   rb   rS   rS   rT   re   J  r   zMaskDomain.canonicalrt  c                 C   s   | j |d uS rZ   )rx  r   ru  rS   rS   rT   rs  N  r   zMaskDomain.match_domain)rN   rO   rP   r   r   rj  rQ   r_   rx   re   r|   rs  r   rS   rS   r   rT   rv  B  s    
rv  c                   @   sb   e Zd ZdeddddfddZedefdd	Zdefd
dZ	de
defddZdefddZdS )MatchedSubAppResourcerL   rI   r:   rX   Nc                 C   s    t |  d| _|| _|| _d S )Nr   )r2   r_   r  r]  _rule)r^   rL   rI   rS   rS   rT   r_   S  s   

zMatchedSubAppResource.__init__c                 C   r   rZ   )r{  re   rb   rS   rS   rT   re   Y  r   zMatchedSubAppResource.canonicalc                 C   r  )N)rI   rL   )r]  r{  rb   rS   rS   rT   rq   ]  r	  zMatchedSubAppResource.get_infori   c                    sh   | j |I d H sd t fS | jj|I d H }|| j t|jt	r-|jj
}||fS t }||fS rZ   )r{  r   r   r]  r^  rl   r   r   rM   r)   r   rc  rS   rS   rT   rl   `  s   
zMatchedSubAppResource.resolvec                 C   s   dj | jdS )Nz"<MatchedSubAppResource -> {app!r}>)rI   )r   r]  rb   rS   rS   rT   r   k  r	  zMatchedSubAppResource.__repr__)rN   rO   rP   rK   r_   rx   rQ   re   rB   rq   r,   r{   rl   r   rS   rS   rS   rT   rz  R  s    rz  c                       s   e Zd ZdZdddedeeee f de	de
e ddf
 fd	d
ZdefddZede
e fddZdededefddZdefddZ  ZS )r7   zA route with resourceNr   r   r   r   r~   rX   c                   s   t  j||||d d S )Nr}   )r   r_   )r^   r   r   r   r~   r   rS   rT   r_   r  s   
zResourceRoute.__init__c                 C   s   dj | j| j| jdS )Nz3<ResourceRoute [{method}] {resource} -> {handler!r})r   r   r   )r   r   r   r   rb   rS   rS   rT   r   ~  s   zResourceRoute.__repr__c                 C   s   | j d u rd S | j jS rZ   )r   rW   rb   rS   rS   rT   rW     s   
zResourceRoute.namer   rg   c                 O   s    | j dusJ | j j|i |S r   )r   rh   r   rS   rS   rT   rh     s   zResourceRoute.url_forc                 C   s   | j d usJ | j  S rZ   )r   rq   rb   rS   rS   rT   rq     r   zResourceRoute.get_info)rN   rO   rP   __doc__rQ   r   r#   r   r   r2   r   r   r_   r   rx   rW   r   rh   rB   rq   r   rS   rS   r   rT   r7   o  s&    r7   c                       s   e Zd Zdeddf fddZdededefdd	Zede	e fd
dZ
defddZdedefddZedefddZedefddZdefddZ  ZS )r   rM   rX   Nc                    s   t  tj| j || _d S rZ   )r   r_   r   r   r%  _http_exceptionr   r   rS   rT   r_     s   
zSystemRoute.__init__r   rg   c                 O   r`  )Nz).url_for() is not allowed for SystemRoutera  r   rS   rS   rT   rh     rb  zSystemRoute.url_forc                 C   rr   rZ   rS   rb   rS   rS   rT   rW     r   zSystemRoute.namec                 C   r   )NrM   r}  rb   rS   rS   rT   rq     r`   zSystemRoute.get_infori   c                    s   | j rZ   r~  rk   rS   rS   rT   r%    s   zSystemRoute._handlec                 C   r   rZ   )r}  r   rb   rS   rS   rT   r     r   zSystemRoute.statusc                 C   r   rZ   )r}  r   rb   rS   rS   rT   r     r   zSystemRoute.reasonc                 C   s   dj | dS )Nz*<SystemRoute {self.status}: {self.reason}>rb   )r   rb   rS   rS   rT   r        zSystemRoute.__repr__)rN   rO   rP   r&   r_   rQ   r   rh   rx   r   rW   rB   rq   r,   r.   r%  r   r   r   r   r   rS   rS   r   rT   r     s    r   c                   @   s<   e Zd ZdefddZdeedef fddZd	ddZdS )
r9   rX   c                    sL   | j jtjvr|   t| | j j d }|d u r|   | I d H }|S rZ   )ri   r   r   METH_ALL_raise_allowed_methodsgetattrr   )r^   r   resprS   rS   rT   _iter  s   z
View._iterNc                 C   s   |    S rZ   )r  	__await__rb   rS   rS   rT   r    r  zView.__await__c                    s"    fddt jD }t jj|)Nc                    s   h | ]}t  | r|qS rS   )hasattrr   )r  rA  rb   rS   rT   	<setcomp>  s    z.View._raise_allowed_methods.<locals>.<setcomp>)r   r  r)   ri   r   )r^   r   rS   rb   rT   r    s   zView._raise_allowed_methodsrw   )	rN   rO   rP   r.   r  r   r   r  r  rS   rS   rS   rT   r9     s    r9   c                   @   sT   e Zd Zdee ddfddZdefddZdee fdd	Z	d
e
defddZdS )ResourcesViewr_  rX   Nc                 C   rY   rZ   
_resources)r^   r_  rS   rS   rT   r_     r`   zResourcesView.__init__c                 C   r   rZ   )r   r  rb   rS   rS   rT   r     r`   zResourcesView.__len__c                 c       | j E d H  d S rZ   r  rb   rS   rS   rT   r        zResourcesView.__iter__r   c                 C   
   || j v S rZ   r  r^   r   rS   rS   rT   __contains__  r`   zResourcesView.__contains__)rN   rO   rP   r   r2   r_   r   r   r   r   objectr|   r  rS   rS   rS   rT   r    s
    r  c                   @   sP   e Zd Zdee fddZdefddZdee	 fddZ
d	edefd
dZdS )
RoutesViewr_  c                 C   s*   g | _ |D ]}|D ]}| j | q	qd S rZ   )r   r   )r^   r_  r   r   rS   rS   rT   r_     s   zRoutesView.__init__rX   c                 C   r   rZ   r   rb   rS   rS   rT   r     r`   zRoutesView.__len__c                 c   r  rZ   r   rb   rS   rS   rT   r     r  zRoutesView.__iter__r   c                 C   r  rZ   r  r   rS   rS   rT   r    r`   zRoutesView.__contains__N)rN   rO   rP   r   r2   r_   r   r   r   r6   r   r  r|   r  rS   rS   rS   rT   r    s
    r  c                       sv  e Zd ZedZdH fddZdedefddZ	de
e fd	d
ZdefddZdedefddZdedefddZdefddZdefddZdeeef fddZdeddfddZdddedee defddZdddd eded!eee e! f dee d"ee" de#fd#d$Z$ddd%d&d&d&d'd(ede%dee d"ee" d)ed*ed+ed,edefd-d.Z&ded!ed/e'de#fd0d1Z(ded!ed/e'de#fd2d3Z)dd4d5ded!edee d6ed/e'de#fd7d8Z*ded!ed/e'de#fd9d:Z+ded!ed/e'de#fd;d<Z,ded!ed/e'de#fd=d>Z-ded!ed/e'de#fd?d@Z.ded!e e! d/e'de#fdAdBZ/dH fdCdDZ0dEe1e2 de3e# fdFdGZ4  Z5S )Ir0   z[.:-]rX   Nc                    s   t    g | _i | _d S rZ   )r   r_   r  _named_resourcesrb   r   rS   rT   r_     s   

zUrlDispatcher.__init__ri   c                    sb   |j }t }| jD ]}||I d H \}}|d ur|  S ||O }q
|r,tt||S tt S rZ   )r   r   r  rl   r   r)   r*   )r^   ri   r   r   r   r   allowedrS   rS   rT   rl     s   


zUrlDispatcher.resolvec                 C   r   rZ   )r   r  rb   rS   rS   rT   r     r`   zUrlDispatcher.__iter__c                 C   r   rZ   )r   r  rb   rS   rS   rT   r      r`   zUrlDispatcher.__len__r   c                 C   r  rZ   r  r  rS   rS   rT   r    r`   zUrlDispatcher.__contains__rW   c                 C   s
   | j | S rZ   r  r]   rS   rS   rT   __getitem__  r`   zUrlDispatcher.__getitem__c                 C   r   rZ   )r  r  rb   rS   rS   rT   r_  	  r`   zUrlDispatcher.resourcesc                 C   r   rZ   )r  r  rb   rS   rS   rT   rH     r`   zUrlDispatcher.routesc                 C   r   rZ   )r   r  rb   rS   rS   rT   named_resources  r`   zUrlDispatcher.named_resourcesc                 C   s   t |tsJ d|| jrtd|j}|d urR| j|}|D ]}t|r1t	d|d|
 s<t	d|q"|| jv rMt	d|| j| || j|< | j| d S )Nz4Instance of AbstractResource class is required, got z.Cannot register a resource into frozen router.zIncorrect route name z/, python keywords cannot be used for route namezoIncorrect route name {!r}, the name should be a sequence of python identifiers separated by dash, dot or columnz'Duplicate {!r}, already handled by {!r})r   r2   frozenr   rW   NAME_SPLIT_REr   keyword	iskeywordr   isidentifierr   r  r  r   )r^   r   rW   r
  r   rS   rS   rT   register_resource  s8   



zUrlDispatcher.register_resourcerV   rC   c                C   s   |r| dstd| jr"| jd }|j|kr"||r"tt|S d|v s>d|v s>t|s>t	t
||d}| | |S t||d}| | |S )Nr@   z)path should be started with / or be emptyr   r   rV   )r   r   r  rW   rv   r   r3   r?   searchr4   r   r  r5   )r^   rC   rW   r   rS   rS   rT   add_resource3  s   



zUrlDispatcher.add_resource)rW   r~   r   r   r~   c                C   s   | j ||d}|j|||dS )NrV   r   )r  r   )r^   r   rC   r   rW   r~   r   rS   rS   rT   r   C  s   	zUrlDispatcher.add_router  Fr  rG   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

        r@   Nr  r  )r   r   r8   r  )
r^   rG   rC   rW   r~   r  r  r  r  r   rS   rS   rT   
add_staticO  s   


zUrlDispatcher.add_staticrg   c                 K      | j tj||fi |S )z(Shortcut for add_route with method HEAD.)r   r   	METH_HEADr^   rC   r   rg   rS   rS   rT   add_headq     zUrlDispatcher.add_headc                 K   r  )z+Shortcut for add_route with method OPTIONS.)r   r   ZMETH_OPTIONSr  rS   rS   rT   add_optionsu  r  zUrlDispatcher.add_optionsT)rW   
allow_headr  c                K   s>   | j ||d}|r|jtj|fi | |jtj|fi |S )zShortcut for add_route with method GET.

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

        Parameter should be a sequence of RouteDef objects.

        Returns a list of registered AbstractRoute instances.
        )extendregister)r^   rH   Zregistered_routesZ	route_defrS   rS   rT   
add_routes  s   zUrlDispatcher.add_routesrw   )6rN   rO   rP   r   r   r  r_   r,   r1   rl   r   rQ   r   r   r   r  r|   r  r2   r  r  r_  r  rH   r   r  r  r   r3   r  r   r#   r   r   r   r6   r   r$   r  r   r  r  r  r  r  r  r  r  rs   r   r/   r   r  r   rS   rS   r   rT   r0     s    
 !
	

"	

"r0   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  rS   rS   rT   r    s   r  c                 C   s   t j| ddjS r   )r   r   rC   r  rS   rS   rT   r    r   r  c                 C   s    t | }d| v r|dd}|S )Nr)  r*  )r  r-  )r  r   rS   rS   rT   r     s   r   )sry   r   r=  r:  r   r  r  r   r   
contextlibr   	functoolsr   pathlibr   typesr   typingr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zyarlr   r   Zyarl_versionr   r   r   r   r   helpersr    httpr!   Ztypedefsr"   r#   r$   r%   Zweb_exceptionsr&   r'   r(   r)   r*   Zweb_fileresponser+   Zweb_requestr,   Zweb_responser-   r.   Zweb_routedefr/   __all__Zweb_appr:   rQ   ZBaseDictdictr   mapr   r   r=   rR   r   r>   r?   r   rA   r   r{   rB   r2   ABCr6   r1   r   r   r3   r4   r5   r  r8   r\  rK   rf  rv  rz  r7   r   r9   r  r  r0   r  r  r   rS   rS   rS   rT   <module>   s   
 T0/PC<)L I,($ Q