o
    #`^h                     @   sr  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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 m0Z0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9 ddl:m;Z;m<Z<m=Z=m>Z>m?Z? ddl@mAZA ddlBmCZC ddlDmEZEmFZF ddlGmHZH dZIerddlJmKZK eeLeLf ZMneNZMe
jOdk re
jPQdreRfn	e
jOdk reSfndZTeUeVeWe-Xddd ZYee%eWdf  eZd< e	[dZ\ee"eL  eZd< e	[dZ]ee"eL  eZd < e	^d!Z_eeL eZd"< eeCgee!eF  f Z`e%e!d# e#eL f Zaejbej^d$d%ZcG d&d' d'e'd(d)ZdG d*d+ d+e$ed, ZeG d-d, d,e jfZgG d.d# d#eMe0ZhG d/d0 d0ehZid1eCd2dfd3d4ZjG d5d6 d6eeZkG d7d8 d8ekZlG d9d: d:ekZmG d;d< d<eeZnG d=d> d>enZoG d?d@ d@enZpG dAdB dBe jfZqG dCdD dDeqZrG dEdF dFerZsG dGdH dHepZtG dIdJ dJegZuG dKdL dLegZvG dMdN dNe2ZwG dOdP dPe$eee eee ZxG dQdR dRe$eeg eeg ZyG dSdT dTe1eeLeef ZzdUeLd2eLfdVdWZ{dUeLd2eLfdXdYZ|dUeLd2eLfdZd[Z}dS )\    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)   
   win32)r<       .   .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'   r@   r@   r@   W/home/air/shanriGPT/back/venv/lib/python3.10/site-packages/aiohttp/web_urldispatcher.pyrI   i   s   
 rI   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 )r3   Nnamer]   returnc                C   
   || _ d S N_nameselfr]   r@   r@   rZ   __init__}      
zAbstractResource.__init__c                 C      | j S r`   ra   rd   r@   r@   rZ   r]         zAbstractResource.namec                 C      dS )zWExposes the resource's canonical path.

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

        Nr@   rh   r@   r@   rZ   	canonical       zAbstractResource.canonicalkwargsc                 K   rj   )z2Construct url for resource with additional params.Nr@   )rd   rm   r@   r@   rZ   url_for   rl   zAbstractResource.url_forrequestc                       dS )zWResolve resource.

        Return (UrlMappingMatchInfo, allowed_methods) pair.
        Nr@   rd   ro   r@   r@   rZ   resolve       zAbstractResource.resolverN   c                 C   rj   )zWAdd a prefix to processed URLs.

        Required for subapplications support.
        Nr@   rd   rN   r@   r@   rZ   
add_prefix   rl   zAbstractResource.add_prefixc                 C   rj   z;Return a dict with additional info useful for introspectionNr@   rh   r@   r@   rZ   get_info   rl   zAbstractResource.get_infoc                 C      d S r`   r@   rh   r@   r@   rZ   freeze      zAbstractResource.freezerJ   c                 C   rj   )z Perform a raw match against pathNr@   rd   rJ   r@   r@   rZ   	raw_match   rl   zAbstractResource.raw_matchr^   N)rU   rV   rW   r   rX   re   propertyr]   abcabstractmethodrk   r   rn   r-   _Resolverr   ru   rI   rw   ry   boolr|   r@   r@   r@   rZ   r3   |   s$    
r3   r7   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ee fddZdS )r7   Nexpect_handlerresourcemethodhandlerr   r   r^   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 onesro   r^   c                    s0    | }t |r|I d H }t|tsJ |S r`   )asyncioiscoroutine
isinstancer/   )ro   resultold_handlerr@   rZ   handler_wrapper   s   

z/AbstractRoute.__init__.<locals>.handler_wrapper)_default_expect_handlerr   iscoroutinefunctionupperrD   match
ValueErrorcallableinspectisgeneratorfunctionwarningswarnDeprecationWarningr   type
issubclassr"   r   r-   r/   _method_handler_expect_handler	_resource)rd   r   r   r   r   r   r@   r   rZ   re      s>   	



zAbstractRoute.__init__c                 C   rg   r`   )r   rh   r@   r@   rZ   r      ri   zAbstractRoute.methodc                 C   rg   r`   )r   rh   r@   r@   rZ   r      ri   zAbstractRoute.handlerc                 C   rj   )z8Optional route's name, always equals to resource's name.Nr@   rh   r@   r@   rZ   r]      rl   zAbstractRoute.namec                 C   rg   r`   )r   rh   r@   r@   rZ   r      ri   zAbstractRoute.resourcec                 C   rj   rv   r@   rh   r@   r@   rZ   rw      rl   zAbstractRoute.get_infoargsrm   c                 O   rj   z/Construct url for route with additional params.Nr@   rd   r   rm   r@   r@   rZ   rn      rl   zAbstractRoute.url_forro   c                    s   |  |I d H S r`   )r   rq   r@   r@   rZ   handle_expect_header      z"AbstractRoute.handle_expect_header)rU   rV   rW   rX   r   r%   r   r"   r   _ExpectHandlerr3   re   r~   r   r   r   r   r]   r   rI   rw   r   rn   r-   r/   r   r@   r@   r@   rZ   r7      s8    
3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 )$r2   
match_dictroutec                    s(   t  | || _g | _d | _d| _d S NF)superre   _route_apps_current_app_frozen)rd   r   r   	__class__r@   rZ   re      s
   
zUrlMappingMatchInfo.__init__r^   c                 C      | j jS r`   )r   r   rh   r@   r@   rZ   r        zUrlMappingMatchInfo.handlerc                 C   rg   r`   )r   rh   r@   r@   rZ   r     ri   zUrlMappingMatchInfo.routec                 C   r   r`   )r   r   rh   r@   r@   rZ   r     r   z"UrlMappingMatchInfo.expect_handlerc                 C   rx   r`   r@   rh   r@   r@   rZ   rT        z"UrlMappingMatchInfo.http_exceptionc                 C   s
   | j  S r`   )r   rw   rh   r@   r@   rZ   rw     rf   zUrlMappingMatchInfo.get_info)r;   .c                 C   
   t | jS r`   )tupler   rh   r@   r@   rZ   apps  s   
zUrlMappingMatchInfo.appsrP   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rd   rP   r@   r@   rZ   add_app  s
   
zUrlMappingMatchInfo.add_appc                 C   s   | j }|d us	J |S r`   )r   r   r@   r@   rZ   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   )rd   rP   prevr@   r@   rZ   set_current_app(  s   
z#UrlMappingMatchInfo.set_current_appc                 C   s
   d| _ d S )NT)r   rh   r@   r@   rZ   ry   8  rf   zUrlMappingMatchInfo.freezec                    s   dt    d| j dS )Nz<MatchInfo z: >)r   __repr__r   rh   r   r@   rZ   r   ;  s   zUrlMappingMatchInfo.__repr__)rP   r;   r^   N)r^   r;   r}   )rU   rV   rW   r   rX   r7   re   r~   r%   r   r   r   r   r   r'   rT   rI   rw   r   r   r   r   r   r   r   ry   r   __classcell__r@   r@   r   rZ   r2      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 )
MatchInfoErrorrT   r^   Nc                    s   || _ t i t| j  d S r`   )
_exceptionr   re   SystemRouterd   rT   r   r@   rZ   re   @  s   zMatchInfoError.__init__c                 C   rg   r`   )r   rh   r@   r@   rZ   rT   D  ri   zMatchInfoError.http_exceptionc                 C   s   d | jj| jjS )Nz<MatchInfoError {}: {}>)r   r   statusreasonrh   r@   r@   rZ   r   H  s   zMatchInfoError.__repr__)
rU   rV   rW   r'   re   r~   rT   rX   r   r   r@   r@   r   rZ   r   ?  s
    r   ro   r^   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   EXPECTversionr$   lowerwriterwriter(   )ro   expectr@   r@   rZ   r   N  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d fddZ  ZS )r4   Nr\   r]   r^   c                   s   t  j|d g | _d S )Nr\   )r   re   _routesrc   r   r@   rZ   re   ]     
zResource.__init__r   r   r   r   r8   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)rd   r   r   r   	route_objr@   r@   rZ   	add_routea  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   r8   r   appendrd   r   r@   r@   rZ   r   u  s   zResource.register_routero   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 r`   )
set_matchrel_urlraw_pathr   r   addr   r   r2   )rd   ro   allowed_methodsr   r   route_methodr@   r@   rZ   rr   {  s   

zResource.resolverJ   c                 C   rx   r`   r@   r{   r@   r@   rZ   r     r   zResource._matchc                 C   r   r`   lenr   rh   r@   r@   rZ   __len__  rf   zResource.__len__c                 C   r   r`   )iterr   rh   r@   r@   rZ   __iter__  rf   zResource.__iter__)r   r8   r^   N)rU   rV   rW   r   rX   re   r   r   r"   r%   r   r   r   r-   r   rr   r   r   r   r   intr   r   r   r   r@   r@   r   rZ   r4   \  s$     	

 r4   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 )r5   Nr\   rJ   r]   r^   c                   s*   t  j|d |r|dsJ || _d S )Nr\   rF   )r   re   
startswith_path)rd   rJ   r]   r   r@   rZ   re     s   
zPlainResource.__init__c                 C   rg   r`   r   rh   r@   r@   rZ   rk     ri   zPlainResource.canonicalc                 C   s   | j sd| _ d S d S )NrF   r   rh   r@   r@   rZ   ry     s   
zPlainResource.freezerN   c                 C   s<   | dsJ |drJ t|dksJ || j | _d S NrF   r   )r   endswithr   r   rt   r@   r@   rZ   ru     s   zPlainResource.add_prefixc                 C   s   | j |kri S d S r`   r   r{   r@   r@   rZ   r     s   
zPlainResource._matchc                 C   
   | j |kS r`   r   r{   r@   r@   rZ   r|     rf   zPlainResource.raw_matchc                 C   
   d| j iS )NrJ   r   rh   r@   r@   rZ   rw     rf   zPlainResource.get_infoc                 C   s   t j| jddS NTrJ   encoded)r   buildr   rh   r@   r@   rZ   rn        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   )r]   r   rc   r@   r@   rZ   r     s   zPlainResource.__repr__r}   )rU   rV   rW   rX   r   re   r~   rk   ry   ru   r   r   r   r|   rI   rw   r   rn   r   r   r@   r@   r   rZ   r5     s    $
r5   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 )r6   z#\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*)\}z.\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*):(?P<re>.+)\}z[^{}/]+Nr\   rJ   r]   r^   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 )Nr\   r   z
(?P<{}>{})var{}z(?P<{var}>{re})zInvalid path 'z'['z']zBad pattern 'z': rF   r@   )r   re   rE   splitDYN	fullmatchr   groupGOODDYN_WITH_RE	groupdictr   _requote_pathreescapecompileerrorrL   r   rG   _pattern
_formatter)	rd   rJ   r]   rL   rK   partr   compiledexcr   r@   rZ   re     s:   
zDynamicResource.__init__c                 C   rg   r`   r  rh   r@   r@   rZ   rk     ri   zDynamicResource.canonicalrN   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  rL   r  rt   r@   r@   rZ   ru     s
   zDynamicResource.add_prefixc                 C   s.   | j |}|d u rd S dd |  D S )Nc                 S      i | ]	\}}|t |qS r@   )_unquote_path).0keyvaluer@   r@   rZ   
<dictcomp>  s    z*DynamicResource._match.<locals>.<dictcomp>)r  r   r   items)rd   rJ   r   r@   r@   rZ   r     s   
zDynamicResource._matchc                 C   r   r`   r
  r{   r@   r@   rZ   r|     rf   zDynamicResource.raw_matchc                 C      | j | jdS )N)rK   rL   )r  r  rh   r@   r@   rZ   rw        zDynamicResource.get_infopartsc                 K   s(   | j dd | D }tj|ddS )Nc                 S   r  r@   )_quote_path)r  kvr@   r@   rZ   r    s    z+DynamicResource.url_for.<locals>.<dictcomp>Tr   )r  
format_mapr  r   r   )rd   r  urlr@   r@   rZ   rn     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}>)r]   rK   )r]   r   r  rc   r@   r@   rZ   r     s   zDynamicResource.__repr__)rU   rV   rW   r  r  r   r   r   rX   r   re   r~   rk   ru   r   r   r   r|   rI   rw   r   rn   r   r   r@   r@   r   rZ   r6     s    

$!	r6   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 )PrefixResourceNr\   rN   r]   r^   c                   sX   |r| dsJ ||dv s|drJ |t j|d t|| _| jd | _d S )NrF   )r   rF   r\   )r   r   r   re   r   _prefix_prefix2)rd   rN   r]   r   r@   rZ   re     s
   
zPrefixResource.__init__c                 C   rg   r`   )r  rh   r@   r@   rZ   rk     ri   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  rt   r@   r@   rZ   ru     s
   zPrefixResource.add_prefixc                 C   rj   r   r@   rt   r@   r@   rZ   r|      rz   zPrefixResource.raw_match)rU   rV   rW   rX   r   re   r~   rk   ru   r   r|   r   r@   r@   r   rZ   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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defd*d+Zdefd,d-Z   Z!S ).r9   r  N   Fr]   r   
chunk_size
show_indexfollow_symlinksappend_versionrN   rM   r]   r   r  r   r!  r"  r^   c          
   
      s   t  j||d zt| jdd}W n ty) }	 z	td| d|	d }	~	ww | s6td| d|| _|| _	|| _
|| _|| _|| _td| j| |dtd	| j| |dd
| _d S )Nr\   T)strictr   z' does not existz' is not a directoryGETr   HEAD)r$  r%  )r   re   r   
expanduserrr   FileNotFoundErrorr   is_dir
_directory_show_index_chunk_size_follow_symlinksr   _append_versionr8   _handler   )
rd   rN   rM   r]   r   r  r   r!  r"  r  r   r@   rZ   re   )  s,   

zStaticResource.__init__)r"  filenamec          
   	   C   s  |d u r| j }t|d}tj| jdd}tdk r#||dd }n|| }|r| j	|}z"| j
rFttj|}|| j | }n
| }|| j W n ttfy^   | Y S w | r|d}| }W d    n1 sww   Y  | |}	|| j|	i}|S |S )NrF   Tr   r      %%25rb)r-  rX   lstripr   r   r  rC   replacer)  joinpathr,  r   osrJ   normpathrelative_torr   r   r'  is_fileopenread_get_file_hash
with_queryVERSION_KEY)
rd   r/  r"  r  unresolved_pathnormalized_pathfilepathf
file_byteshr@   r@   rZ   rn   L  s8   


zStaticResource.url_for
byte_arrayc                 C   s*   t  }||  t| }|dS )Nascii)hashlibsha256updatebase64urlsafe_b64encodedigestdecode)rG  mb64r@   r@   rZ   r>  u  s   

zStaticResource._get_file_hashc                 C   s   | j | j| jdS )N)rM   rN   rO   )r)  r  r   rh   r@   r@   rZ   rw   |  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   r8   r   )rd   r   r@   r@   rZ   set_options_route  s
   

z StaticResource.set_options_routero   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   r2   )rd   ro   rJ   r   r   r   r@   r@   rZ   rr     s   

zStaticResource.resolvec                 C   r   r`   r   rh   r@   r@   rZ   r     rf   zStaticResource.__len__c                 C   s   t | j S r`   )r   r   valuesrh   r@   r@   rZ   r     r  zStaticResource.__iter__c                    sJ   |j d }t|}|jrt | j|}t }|d | j	|I d H S )Nr/  )

match_infor   anchorr)   r)  r7  r   get_running_looprun_in_executor_resolve_path_to_response)rd   ro   r   r/  rA  loopr@   r@   rZ   r.    s   

zStaticResource._handlerA  c              
   C   s   z"| j rttj|}|| j | }n
| }|| j W n tgt	R y6 } zt
 |d}~ww z| rL| jrIt| |ddW S t W n ty] } zt |d}~ww t|| jdS )zFTake the unresolved path and query the file system to form a response.Nz	text/html)r   content_type)r  )r,  r   r8  rJ   r9  r:  r)  rr   r   CIRCULAR_SYMLINK_ERRORr+   r(  r*  r.   _directory_as_htmlr)   PermissionErrorr,   r+  )rd   rA  rB  	file_pathr  r@   r@   rZ   rY    s4   
z(StaticResource._resolve_path_to_responsedir_pathc                 C   s   |  sJ || j }dt| }d| d}g }| }t|D ]0}|| j }t| j d| }	|  rD|j	 d}
n|j	}
|
d|	 dt|
 d q%dd	|}d
| d	| d}d| d}d| d	| d}|S )z"returns directory's index as html.z
Index of /z<h1>z</h1>rF   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  r]   r   r   join)rd   r`  relative_path_to_dirindex_ofh1
index_list	dir_index_filerel_pathquoted_file_url	file_nameulbodyhead_strhtmlr@   r@   rZ   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}>)r]   rJ   rM   )r]   r   r  r)  rc   r@   r@   rZ   r     s   
zStaticResource.__repr__)"rU   rV   rW   r@  rX   r&   r   r   r   r   re   r   rn   staticmethodbytesr>  rI   rw   r%   rS  r-   r   rr   r   r   r7   r   r/   r.  r   rY  r]  r   r   r@   r@   r   rZ   r9   &  s\    	
'
)# r9   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d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 )PrefixedSubAppResourcerN   rP   r;   r^   Nc                    s    t  | || _| | d S r`   )r   re   _app_add_prefix_to_resources)rd   rN   rP   r   r@   rZ   re     s   zPrefixedSubAppResource.__init__c                    s   t  | | | d S r`   )r   ru   rx  rt   r   r@   rZ   ru     s   z!PrefixedSubAppResource.add_prefixc                 C   s8   | j j}| D ]}|| || || qd S r`   )rw  router	resourcesunindex_resourceru   index_resource)rd   rN   ry  r   r@   r@   rZ   rx     s   

z/PrefixedSubAppResource._add_prefix_to_resourcesr   rm   c                 O      t d)Nz3.url_for() is not supported by sub-application rootr   r   r@   r@   rZ   rn   	     zPrefixedSubAppResource.url_forc                 C   r  )N)rP   rN   )rw  r  rh   r@   r@   rZ   rw     r  zPrefixedSubAppResource.get_inforo   c                    sL   | j j|I d H }|| j  t|jtr|jj}||fS t }||fS r`   )	rw  ry  rr   r   r   rT   r*   r   r   rd   ro   rU  methodsr@   r@   rZ   rr     s   zPrefixedSubAppResource.resolvec                 C      t | jj S r`   )r   rw  ry  rO   rh   r@   r@   rZ   r     r   zPrefixedSubAppResource.__len__c                 C   r  r`   )r   rw  ry  rO   rh   r@   r@   rZ   r     r   zPrefixedSubAppResource.__iter__c                 C   s   dj | j| jdS )Nz,<PrefixedSubAppResource {prefix} -> {app!r}>)rN   rP   )r   r  rw  rh   r@   r@   rZ   r     s   zPrefixedSubAppResource.__repr__)rU   rV   rW   rX   re   ru   rx  r   rn   rI   rw   r-   r   rr   r   r   r   r7   r   r   r   r@   r@   r   rZ   rv    s    		rv  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 )
rR   ro   r^   c                    rp   )z1Return bool if the request satisfies the criteriaNr@   rq   r@   r@   rZ   r   %  rs   zAbstractRuleMatching.matchc                 C   rj   rv   r@   rh   r@   r@   rZ   rw   )  rl   zAbstractRuleMatching.get_infoc                 C   rj   )zReturn a strNr@   rh   r@   r@   rZ   rk   -  rl   zAbstractRuleMatching.canonicalN)rU   rV   rW   r   r   r-   r   r   rI   rw   r~   rX   rk   r@   r@   r@   rZ   rR   $  s    rR   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}(?<!-)rQ   r^   Nc                    s   t    | || _d S r`   )r   re   
validation_domain)rd   rQ   r   r@   rZ   re   6  s   
zDomain.__init__c                 C   rg   r`   r  rh   r@   r@   rZ   rk   :  ri   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 strrA   zDomain cannot be emptyz://zScheme not supportedzhttp://c                 3   s    | ]	} j |V  qd S r`   )re_partr   )r  xrh   r@   rZ   	<genexpr>H  s    z$Domain.validation.<locals>.<genexpr>zDomain not validP   :)r   rX   	TypeErrorrstripr   r   r   raw_hostallr   port)rd   rQ   r  r@   rh   rZ   r  >  s   

zDomain.validationro   c                    s"   |j tj}|sdS | |S r   )r   r   r   HOSTmatch_domain)rd   ro   hostr@   r@   rZ   r   N  s
   
zDomain.matchr  c                 C   s   |  | jkS r`   )r   r  rd   r  r@   r@   rZ   r  T  r  zDomain.match_domainc                 C   r   )NrQ   r  rh   r@   r@   rZ   rw   W  rf   zDomain.get_info)rU   rV   rW   r  r  r  rX   re   r~   rk   r  r-   r   r   r  rI   rw   r   r@   r@   r   rZ   r  3  s    
r  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}(?<!-)rQ   r^   Nc                    s2   t  | | jdddd}t|| _d S )NrA   z\.*z.*)r   re   r  r6  r  r  _mask)rd   rQ   maskr   r@   rZ   re   ^  s   zMaskDomain.__init__c                 C   r   r`   )r  rL   rh   r@   r@   rZ   rk   c  r   zMaskDomain.canonicalr  c                 C   s   | j |d uS r`   )r  r   r  r@   r@   rZ   r  g  r   zMaskDomain.match_domain)rU   rV   rW   r  r  r  rX   re   r~   rk   r   r  r   r@   r@   r   rZ   r  [  s    
r  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 )MatchedSubAppResourcerS   rP   r;   r^   Nc                 C   s    t |  d| _|| _|| _d S )Nr   )r3   re   r  rw  _rule)rd   rS   rP   r@   r@   rZ   re   l  s   

zMatchedSubAppResource.__init__c                 C   r   r`   )r  rk   rh   r@   r@   rZ   rk   r  r   zMatchedSubAppResource.canonicalc                 C   r  )N)rP   rS   )rw  r  rh   r@   r@   rZ   rw   v  r  zMatchedSubAppResource.get_inforo   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 r`   )r  r   r   rw  ry  rr   r   r   rT   r*   r   r  r@   r@   rZ   rr   y  s   
zMatchedSubAppResource.resolvec                 C   s   dj | jdS )Nz"<MatchedSubAppResource -> {app!r}>)rP   )r   rw  rh   r@   r@   rZ   r     r  zMatchedSubAppResource.__repr__)rU   rV   rW   rR   re   r~   rX   rk   rI   rw   r-   r   rr   r   r@   r@   r@   rZ   r  k  s    r  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 )r8   zA route with resourceNr   r   r   r   r   r^   c                   s   t  j||||d d S )Nr   )r   re   )rd   r   r   r   r   r   r@   rZ   re     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   rh   r@   r@   rZ   r     s   zResourceRoute.__repr__c                 C   s   | j d u rd S | j jS r`   )r   r]   rh   r@   r@   rZ   r]     s   
zResourceRoute.namer   rm   c                 O   s    | j dusJ | j j|i |S r   )r   rn   r   r@   r@   rZ   rn     s   zResourceRoute.url_forc                 C   s   | j d usJ | j  S r`   )r   rw   rh   r@   r@   rZ   rw     r   zResourceRoute.get_info)rU   rV   rW   __doc__rX   r   r%   r   r"   r3   r   r   re   r   r~   r]   r   rn   rI   rw   r   r@   r@   r   rZ   r8     s&    r8   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   rT   r^   Nc                    s   t  tj| j || _d S r`   )r   re   r   r   r.  _http_exceptionr   r   r@   rZ   re     s   
zSystemRoute.__init__r   rm   c                 O   r}  )Nz).url_for() is not allowed for SystemRouter~  r   r@   r@   rZ   rn     r  zSystemRoute.url_forc                 C   rx   r`   r@   rh   r@   r@   rZ   r]     r   zSystemRoute.namec                 C   r   )NrT   r  rh   r@   r@   rZ   rw     rf   zSystemRoute.get_inforo   c                    s   | j r`   r  rq   r@   r@   rZ   r.    s   zSystemRoute._handlec                 C   r   r`   )r  r   rh   r@   r@   rZ   r     r   zSystemRoute.statusc                 C   r   r`   )r  r   rh   r@   r@   rZ   r     r   zSystemRoute.reasonc                 C   s   dj | dS )Nz*<SystemRoute {self.status}: {self.reason}>rh   )r   rh   r@   r@   rZ   r        zSystemRoute.__repr__)rU   rV   rW   r'   re   rX   r   rn   r~   r   r]   rI   rw   r-   r/   r.  r   r   r   r   r   r@   r@   r   rZ   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efddZ	dS )	r:   r^   c                    sZ   | j jtjvr|   t| | j j d }|d u r|   | I d H }t|ts+J |S r`   )	ro   r   r   METH_ALL_raise_allowed_methodsgetattrr   r   r/   )rd   r   retr@   r@   rZ   _iter  s   z
View._iterNc                 C   s   |    S r`   )r  	__await__rh   r@   r@   rZ   r    r  zView.__await__c                    s"    fddt jD }t jj|)Nc                    s   h | ]}t  | r|qS r@   )hasattrr   )r  rP  rh   r@   rZ   	<setcomp>  s    z.View._raise_allowed_methods.<locals>.<setcomp>)r   r  r*   ro   r   )rd   r   r@   rh   rZ   r    s   zView._raise_allowed_methods)
rU   rV   rW   r/   r  r   r   r  r   r  r@   r@   r@   rZ   r:     s    r:   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 )ResourcesViewrz  r^   Nc                 C   r_   r`   
_resources)rd   rz  r@   r@   rZ   re     rf   zResourcesView.__init__c                 C   r   r`   )r   r  rh   r@   r@   rZ   r     rf   zResourcesView.__len__c                 c       | j E d H  d S r`   r  rh   r@   r@   rZ   r     r   zResourcesView.__iter__r   c                 C   
   || j v S r`   r  rd   r   r@   r@   rZ   __contains__  rf   zResourcesView.__contains__)rU   rV   rW   r   r3   re   r   r   r   r   objectr   r  r@   r@   r@   rZ   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 )
RoutesViewrz  c                 C   s*   g | _ |D ]}|D ]}| j | q	qd S r`   )r   r   )rd   rz  r   r   r@   r@   rZ   re     s   zRoutesView.__init__r^   c                 C   r   r`   r   rh   r@   r@   rZ   r     rf   zRoutesView.__len__c                 c   r  r`   r   rh   r@   r@   rZ   r     r   zRoutesView.__iter__r   c                 C   r  r`   r  r   r@   r@   rZ   r    rf   zRoutesView.__contains__N)rU   rV   rW   r   r3   re   r   r   r   r7   r   r  r   r  r@   r@   r@   rZ   r    s
    r  c                       s  e Zd ZedZdN 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edefddZdedd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d0ed1ed2edefd3d4Z)d"ed'e"d5e*de&fd6d7Z+d"ed'e"d5e*de&fd8d9Z,dd:d;d"ed'e"dee d<ed5e*de&fd=d>Z-d"ed'e"d5e*de&fd?d@Z.d"ed'e"d5e*de&fdAdBZ/d"ed'e"d5e*de&fdCdDZ0d"ed'e"d5e*de&fdEdFZ1d"ed'e#e$ d5e*de&fdGdHZ2dN fdIdJZ3dKe4e5 de6e& fdLdMZ7  Z8S )Or1   z[.:-]r^   Nc                    s&   t    g | _i | _i | _g | _d S r`   )r   re   r  _named_resources_resource_index_matched_sub_app_resourcesrh   r   r@   rZ   re     s
   

zUrlDispatcher.__init__ro   c           	         s   | j }t }|jj}|r<||dD ]}||I d H \}}|d ur'|  S ||O }q|dkr1n|dd p9d}|s| jD ]}||I d H \}}|d urS|  S ||O }q?|rbtt	|j
|S tt S )Nr@   rF   r   )r  r   r   r   r   rr   
rpartitionr  r   r*   r   r+   )	rd   ro   resource_indexr   url_part	candidater   allowedr   r@   r@   rZ   rr     s,   



zUrlDispatcher.resolvec                 C   r   r`   )r   r  rh   r@   r@   rZ   r   1  rf   zUrlDispatcher.__iter__c                 C   r   r`   )r   r  rh   r@   r@   rZ   r   4  rf   zUrlDispatcher.__len__r   c                 C   r  r`   r  r  r@   r@   rZ   r  7  rf   zUrlDispatcher.__contains__r]   c                 C   s
   | j | S r`   r  rc   r@   r@   rZ   __getitem__:  rf   zUrlDispatcher.__getitem__c                 C   r   r`   )r  r  rh   r@   r@   rZ   rz  =  rf   zUrlDispatcher.resourcesc                 C   r   r`   )r  r  rh   r@   r@   rZ   rO   @  rf   zUrlDispatcher.routesc                 C   r   r`   )r   r  rh   r@   r@   rZ   named_resourcesC  rf   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| t |tre| j| d S | | 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   r]   NAME_SPLIT_REr   keyword	iskeywordr   isidentifierr   r  r  r   r  r  r|  )rd   r   r]   r  r  r@   r@   rZ   register_resourceF  s>   




zUrlDispatcher.register_resourcec                 C   s4   d|j  }v r|dd dd }|dpdS )z9Return a key to index the resource in the resource index.r   r   rF   )rk   	partitionr  r  )rd   r   	index_keyr@   r@   rZ   _get_resource_index_keym  s   z%UrlDispatcher._get_resource_index_keyc                 C   s"   |  |}| j|g | dS )z%Add a resource to the resource index.N)r  r  
setdefaultr   rd   r   resource_keyr@   r@   rZ   r|  x  s   
zUrlDispatcher.index_resourcec                 C   s   |  |}| j| | dS )z*Remove a resource from the resource index.N)r  r  remover  r@   r@   rZ   r{    s   
zUrlDispatcher.unindex_resourcer\   rJ   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 )NrF   z)path should be started with / or be emptyr   r   r\   )r   r   r  r]   r|   r   r4   rE   searchr5   r   r  r6   )rd   rJ   r]   r   r@   r@   rZ   add_resource  s   



zUrlDispatcher.add_resource)r]   r   r   r   r   c                C   s   | j ||d}|j|||dS )Nr\   r   )r  r   )rd   r   rJ   r   r]   r   r   r@   r@   rZ   r     s   	zUrlDispatcher.add_router  Fr  rN   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

        rF   Nr  r  )r   r   r9   r  )
rd   rN   rJ   r]   r   r  r   r!  r"  r   r@   r@   rZ   
add_static  s   


zUrlDispatcher.add_staticrm   c                 K      | j tj||fi |S )z(Shortcut for add_route with method HEAD.)r   r   	METH_HEADrd   rJ   r   rm   r@   r@   rZ   add_head     zUrlDispatcher.add_headc                 K   r  )z+Shortcut for add_route with method OPTIONS.)r   r   METH_OPTIONSr  r@   r@   rZ   add_options  r  zUrlDispatcher.add_optionsT)r]   
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.
        r\   )r  r   r   r  METH_GET)rd   rJ   r   r]   r  rm   r   r@   r@   rZ   add_get  s   zUrlDispatcher.add_getc                 K   r  )z(Shortcut for add_route with method POST.)r   r   	METH_POSTr  r@   r@   rZ   add_post  r  zUrlDispatcher.add_postc                 K   r  )z'Shortcut for add_route with method PUT.)r   r   METH_PUTr  r@   r@   rZ   add_put  r  zUrlDispatcher.add_putc                 K   r  )z)Shortcut for add_route with method PATCH.)r   r   
METH_PATCHr  r@   r@   rZ   	add_patch  r  zUrlDispatcher.add_patchc                 K   r  )z*Shortcut for add_route with method DELETE.)r   r   METH_DELETEr  r@   r@   rZ   
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  r@   r@   rZ   add_view  s   zUrlDispatcher.add_viewc                    s"   t    | jD ]}|  qd S r`   )r   ry   r  r  r   r@   rZ   ry     s   


zUrlDispatcher.freezerO   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)rd   rO   registered_routes	route_defr@   r@   rZ   
add_routes  s   zUrlDispatcher.add_routesr}   )9rU   rV   rW   r  r  r  re   r-   r2   rr   r   rX   r   r   r   r  r   r  r3   r  r  rz  r  rO   r   r  r  r  r|  r{  r   r4   r  r   r%   r   r"   r   r7   r   r&   r  r   r  r  r  r  r  r  r  r  ry   r   r0   r   r  r   r@   r@   r   rZ   r1     s    
)' 
	

"	

"r1   r  c                 C   s$   t dk r
| dd} tj| ddjS )Nr0  r2  r3  Fr   )rC   r6  r   r   r   r  r@   r@   rZ   r    s   r  c                 C   s   t j| ddjS r   )r   r   rJ   r  r@   r@   rZ   r    r   r  c                 C   s    t | }d| v r|dd}|S )Nr2  r3  )r  r6  )r  r   r@   r@   rZ   r     s   r   )~r   r   rL  	functoolsrI  rs  r   r  r8  r  sysr   
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   yarlr   r   yarl_versionr   r   r    r!   r"   helpersr#   httpr$   typedefsr%   r&   web_exceptionsr'   r(   r)   r*   r+   web_fileresponser,   web_requestr-   web_responser.   r/   web_routedefr0   __all__web_appr;   rX   BaseDictdictversion_infoplatformr   OSErrorr   r\  r   mapr   r   rC   rY   r  rD   rE   r  rG   r   r   partialrc  rI   r3   ABCr7   r2   r   r   r4   r5   r6   r  r9   rv  rR   r  r  r  r8   r   r:   r  r  r1   r  r  r   r@   r@   r@   rZ   <module>   s   
 `0/QC<)L Q.($  