a
    Rf                     @   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ZieCdd1d2d3ZjG d4d5 d5eeZkG d6d7 d7ekZlG d8d9 d9ekZmG d:d; d;eeZnG d<d= d=enZoG d>d? d?enZpG d@dA dAe jfZqG dBdC dCeqZrG dDdE dEerZsG dFdG dGepZtG dHdI dIegZuG dJdK dKegZvG dLdM dMe2ZwG dNdO dOe$eee eee ZxG dPdQ dQe$eeg eeg ZyG dRdS dSe1eeLeef ZzeLeLdTdUdVZ{eLeLdTdWdXZ|eLeLdTdYdZ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@   R/var/www/ai-form-bot/venv/lib/python3.9/site-packages/aiohttp/web_urldispatcher.pyrI   i   s   
rI   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r]   returnc                C   s
   || _ d S N_nameselfr]   r@   r@   rZ   __init__}   s    zAbstractResource.__init__r_   c                 C   s   | j S r`   ra   rd   r@   r@   rZ   r]      s    zAbstractResource.namec                 C   s   dS )zWExposes the resource's canonical path.

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

        Nr@   rg   r@   r@   rZ   	canonical   s    zAbstractResource.canonical)kwargsr_   c                 K   s   dS )z2Construct url for resource with additional params.Nr@   )rd   ri   r@   r@   rZ   url_for   s    zAbstractResource.url_forrequestr_   c                    s   dS )zWResolve resource.

        Return (UrlMappingMatchInfo, allowed_methods) pair.
        Nr@   rd   rl   r@   r@   rZ   resolve   s    zAbstractResource.resolverN   r_   c                 C   s   dS )zWAdd a prefix to processed URLs.

        Required for subapplications support.
        Nr@   rd   rN   r@   r@   rZ   
add_prefix   s    zAbstractResource.add_prefixc                 C   s   dS z;Return a dict with additional info useful for introspectionNr@   rg   r@   r@   rZ   get_info   s    zAbstractResource.get_infoc                 C   s   d S r`   r@   rg   r@   r@   rZ   freeze   s    zAbstractResource.freezerJ   r_   c                 C   s   dS )z Perform a raw match against pathNr@   rd   rJ   r@   r@   rZ   	raw_match   s    zAbstractResource.raw_match)rU   rV   rW   r   rX   re   propertyr]   abcabstractmethodrh   r   rj   r-   _Resolvern   rq   rI   rs   rt   boolrw   r@   r@   r@   rZ   r3   |   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handlerr~   r   r_   c                   s   |d u rt }t|s$J d|| }t|sDt| dt|sTJ |t|r`n^t	|rxt
dt nFt|trt|trn0t
dt t|ttd fdd}| |}|| _|| _|| _|| _d S )NzCoroutine is expected, got z is not allowed HTTP methodz6Bare generators are deprecated, use @coroutine wrapperz-Bare functions are deprecated, use async onesrk   c                    s.    | }t |r|I d H }t|ts*J |S r`   )asyncioiscoroutine
isinstancer/   )rl   resultZ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__rf   c                 C   s   | j S r`   )r   rg   r@   r@   rZ   r      s    zAbstractRoute.methodc                 C   s   | j S r`   )r   rg   r@   r@   rZ   r      s    zAbstractRoute.handlerc                 C   s   dS )z8Optional route's name, always equals to resource's name.Nr@   rg   r@   r@   rZ   r]      s    zAbstractRoute.namec                 C   s   | j S r`   )r   rg   r@   r@   rZ   r      s    zAbstractRoute.resourcec                 C   s   dS rr   r@   rg   r@   r@   rZ   rs      s    zAbstractRoute.get_infoargsri   r_   c                 O   s   dS z/Construct url for route with additional params.Nr@   rd   r   ri   r@   r@   rZ   rj      s    zAbstractRoute.url_forrk   c                    s   |  |I d H S r`   )r   rm   r@   r@   rZ   handle_expect_header   s    z"AbstractRoute.handle_expect_header)rU   rV   rW   rX   r   r%   r   r"   r   _ExpectHandlerr3   re   rx   r   r   ry   rz   r]   r   rI   rs   r   rj   r-   r/   r   r@   r@   r@   rZ   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)superre   _route_apps_current_app_frozen)rd   r   r   	__class__r@   rZ   re      s
    zUrlMappingMatchInfo.__init__rf   c                 C   s   | j jS r`   )r   r   rg   r@   r@   rZ   r     s    zUrlMappingMatchInfo.handlerc                 C   s   | j S r`   )r   rg   r@   r@   rZ   r     s    zUrlMappingMatchInfo.routec                 C   s   | j jS r`   )r   r   rg   r@   r@   rZ   r~     s    z"UrlMappingMatchInfo.expect_handlerc                 C   s   d S r`   r@   rg   r@   r@   rZ   rT     s    z"UrlMappingMatchInfo.http_exceptionc                 C   s
   | j  S r`   )r   rs   rg   r@   r@   rZ   rs     s    zUrlMappingMatchInfo.get_info)r;   .c                 C   s
   t | jS r`   )tupler   rg   r@   r@   rZ   apps  s    zUrlMappingMatchInfo.appsr;   N)rP   r_   c                 C   s0   | j rtd| jd u r|| _| jd| d S )Nz-Cannot change apps stack after .freeze() callr   )r   RuntimeErrorr   r   insert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 || _n|| _0 d S )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   rg   r@   r@   rZ   rt   8  s    zUrlMappingMatchInfo.freezec                    s   dt    d| j dS )Nz<MatchInfo z: >)r   __repr__r   rg   r   r@   rZ   r   ;  s    zUrlMappingMatchInfo.__repr__)rU   rV   rW   r   rX   r7   re   rx   r%   r   r   r   r~   r   r'   rT   rI   rs   r   r   r   r   r   r   r   rt   r   __classcell__r@   r@   r   rZ   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rT   r_   c                    s   || _ t i t| j  d S r`   )
_exceptionr   re   SystemRouterd   rT   r   r@   rZ   re   @  s    zMatchInfoError.__init__rf   c                 C   s   | j S r`   )r   rg   r@   r@   rZ   rT   D  s    zMatchInfoError.http_exceptionc                 C   s   d | jj| jjS )Nz<MatchInfoError {}: {}>)r   r   statusreasonrg   r@   r@   rZ   r   H  s    zMatchInfoError.__repr__)
rU   rV   rW   r'   re   rx   rT   rX   r   r   r@   r@   r   rZ   r   ?  s   r   rk   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(   )rl   expectr@   r@   rZ   r   N  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   Nr\   r^   c                   s   t  j|d g | _d S )Nr\   )r   re   _routesrc   r   r@   rZ   re   ]  s    zResource.__init__r~   r8   )r   r   r~   r_   c                C   sP   | j D ]*}|j|ks |jtjkrtdj|dqt||| |d}| | |S )NzOAdded route will never be executed, method {route.method} is already registered)r   r   )r   r   r   METH_ANYr   r   r8   register_route)rd   r   r   r~   	route_objr@   r@   rZ   	add_routea  s    

zResource.add_router   r_   c                 C   s(   t |tsJ d|| j| d S )Nz)Instance of Route class is required, got )r   r8   r   appendrd   r   r@   r@   rZ   r   u  s    zResource.register_routerk   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   )rd   rl   allowed_methodsr   r   Zroute_methodr@   r@   rZ   rn   {  s    

zResource.resolveru   c                 C   s   d S r`   r@   rv   r@   r@   rZ   r     s    zResource._matchrf   c                 C   s
   t | jS r`   lenr   rg   r@   r@   rZ   __len__  s    zResource.__len__c                 C   s
   t | jS r`   )iterr   rg   r@   r@   rZ   __iter__  s    zResource.__iter__)rU   rV   rW   r   rX   re   r   r   r"   r%   r   r   r   r-   r{   rn   ry   rz   r   r   intr   r   r   r   r@   r@   r   rZ   r4   \  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   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__rf   c                 C   s   | j S r`   r   rg   r@   r@   rZ   rh     s    zPlainResource.canonicalc                 C   s   | j sd| _ d S )NrF   r   rg   r@   r@   rZ   rt     s    zPlainResource.freezero   c                 C   s<   | dsJ |drJ t|dks,J || j | _d S NrF   r   )r   endswithr   r   rp   r@   r@   rZ   rq     s    zPlainResource.add_prefixru   c                 C   s   | j |kri S d S d S r`   r   rv   r@   r@   rZ   r     s    
zPlainResource._matchc                 C   s
   | j |kS r`   r   rv   r@   r@   rZ   rw     s    zPlainResource.raw_matchc                 C   s
   d| j iS )NrJ   r   rg   r@   r@   rZ   rs     s    zPlainResource.get_infoc                 C   s   t j| jddS NTrJ   encoded)r   buildr   rg   r@   r@   rZ   rj     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   )r]   r   rc   r@   r@   rZ   r     s    zPlainResource.__repr__)rU   rV   rW   rX   r   re   rx   rh   rt   rq   r   r   r|   rw   rI   rs   r   rj   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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[^{}/]+Nr\   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 )Nr\   r   z
(?P<{}>{})var{}z(?P<{var}>{re})zInvalid path 'z'['z']zBad pattern 'z': rF   )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     s6    ,zDynamicResource.__init__rf   c                 C   s   | j S r`   r   rg   r@   r@   rZ   rh     s    zDynamicResource.canonicalro   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   rp   r@   r@   rZ   rq     s
    zDynamicResource.add_prefixru   c                 C   s2   | j |}|d u rd S dd |  D S d S )Nc                 S   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   s
   | j |kS r`   r   rv   r@   r@   rZ   rw     s    zDynamicResource.raw_matchc                 C   s   | j | jdS )N)rK   rL   )r   r   rg   r@   r@   rZ   rs     s    zDynamicResource.get_info)partsr_   c                 K   s(   | j dd | D }tj|ddS )Nc                 S   s   i | ]\}}|t |qS r@   )_quote_path)r   kvr@   r@   rZ   r        z+DynamicResource.url_for.<locals>.<dictcomp>Tr   )r   
format_mapr  r   r   )rd   r  urlr@   r@   rZ   rj     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   rx   rh   rq   r   r   r|   rw   rI   rs   r   rj   r   r   r@   r@   r   rZ   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 )PrefixResourceNr\   )rN   r]   r_   c                   sX   |r| dsJ ||dv s0|dr0J |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__rf   c                 C   s   | j S r`   )r  rg   r@   r@   rZ   rh     s    zPrefixResource.canonicalro   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  rp   r@   r@   rZ   rq     s
    zPrefixResource.add_prefixc                 C   s   dS r   r@   rp   r@   r@   rZ   rw      s    zPrefixResource.raw_match)rU   rV   rW   rX   r   re   rx   rh   rq   r|   rw   r   r@   r@   r   rZ   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ed"d#d$Zedd%d&Z   Z!S )'r9   r  N   Fr]   r~   
chunk_size
show_indexfollow_symlinksappend_version)	rN   rM   r]   r~   r  r  r  r  r_   c          
   
      s   t  j||d zt| jdd}W n6 ty^ }	 ztd| d|	W Y d }	~	n
d }	~	0 0 | sxt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   
expanduserrn   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  )filenamer  r_   c          
   	   C   s  |d u r| j }t|d}tj| jdd}tdk rF||dd }n|| }|r| j	|}zD| j
rttj|}|| j | }n| }|| j W n ttfy   | Y S 0 | r|d}| }W d    n1 s0    Y  | |}	|| j|	i}|S |S )NrF   Tr   r      %%25rb)r  rX   lstripr   r   r  rC   replacer  joinpathr  r   osrJ   normpathrelative_torn   r   r  is_fileopenread_get_file_hashZ
with_queryVERSION_KEY)
rd   r  r  r	  unresolved_pathnormalized_pathfilepathfZ
file_byteshr@   r@   rZ   rj   L  s2    


&
zStaticResource.url_for)
byte_arrayr_   c                 C   s*   t  }||  t| }|dS )Nascii)hashlibsha256updatebase64urlsafe_b64encodedigestdecode)r5  mZb64r@   r@   rZ   r.  u  s    
zStaticResource._get_file_hashrf   c                 C   s   | j | j| jdS )N)rM   rN   rO   )r  r  r   rg   r@   r@   rZ   rs   |  s    zStaticResource.get_info)r   r_   c                 C   s.   d| j v rtdtd|| | jd| j d< d S )NOPTIONSzOPTIONS route was set alreadyr   )r   r   r8   r   )rd   r   r@   r@   rZ   set_options_route  s
    

z StaticResource.set_options_routerk   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   )rd   rl   rJ   r   r   r   r@   r@   rZ   rn     s    

zStaticResource.resolvec                 C   s
   t | jS r`   r   rg   r@   r@   rZ   r     s    zStaticResource.__len__c                 C   s   t | j S r`   )r   r   valuesrg   r@   r@   rZ   r     s    zStaticResource.__iter__c                    sH   |j d }t|}|jrt | j|}t }|d | j	|I d H S )Nr  )

match_infor   anchorr)   r  r'  r   Zget_running_loopZrun_in_executor_resolve_path_to_response)rd   rl   r   r  r0  loopr@   r@   rZ   r    s    
zStaticResource._handle)r0  r_   c              
   C   s   zD| j r.ttj|}|| j | }n| }|| j W n4 tgt	R yx } zt
 |W Y d}~n
d}~0 0 z,| r| jrt| |ddW S t W n, ty } zt |W Y d}~n
d}~0 0 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   r(  rJ   r)  r*  r  rn   r   CIRCULAR_SYMLINK_ERRORr+   r  r  r.   _directory_as_htmlr)   PermissionErrorr,   r  )rd   r0  r1  	file_pathr   r@   r@   rZ   rD    s(    

z(StaticResource._resolve_path_to_response)dir_pathr_   c                 C   s   |  sJ || j }dt| }d| d}g }| }t|D ]`}|| j }t| j d| }	|  r|j	 d}
n|j	}
|
d|	 dt|
 d qJdd	|}d
| d	| d}d| d}d| d	| d}|S )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   rK  Zrelative_path_to_dirZindex_ofZh1Z
index_listZ	dir_index_filerel_pathZquoted_file_url	file_nameZulbodyZhead_strhtmlr@   r@   rZ   rH    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   rj   staticmethodbytesr.  rI   rs   r%   r@  r-   r{   rn   r   r   r7   r   r/   r  r   rD  rH  r   r   r@   r@   r   rZ   r9   &  sF   ')# r9   c                       s   e Zd Zeddd fddZedd fddZedd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)rN   rP   r_   c                    s    t  | || _| | d S r`   )r   re   _app_add_prefix_to_resources)rd   rN   rP   r   r@   rZ   re     s    zPrefixedSubAppResource.__init__ro   c                    s   t  | | | d S r`   )r   rq   r[  rp   r   r@   rZ   rq     s    z!PrefixedSubAppResource.add_prefixc                 C   s8   | j j}| D ]"}|| || || qd S r`   )rZ  router	resourcesunindex_resourcerq   index_resource)rd   rN   r\  r   r@   r@   rZ   r[     s
    

z/PrefixedSubAppResource._add_prefix_to_resourcesr   c                 O   s   t dd S )Nz3.url_for() is not supported by sub-application rootr   r   r@   r@   rZ   rj   	  s    zPrefixedSubAppResource.url_forrf   c                 C   s   | j | jdS )N)rP   rN   )rZ  r  rg   r@   r@   rZ   rs     s    zPrefixedSubAppResource.get_infork   c                    sD   | j j|I d H }|| j  t|jtr6|jj}nt }||fS r`   )	rZ  r\  rn   r   r   rT   r*   r   r   rd   rl   rB  methodsr@   r@   rZ   rn     s    
zPrefixedSubAppResource.resolvec                 C   s   t | jj S r`   )r   rZ  r\  rO   rg   r@   r@   rZ   r     s    zPrefixedSubAppResource.__len__c                 C   s   t | jj S r`   )r   rZ  r\  rO   rg   r@   r@   rZ   r     s    zPrefixedSubAppResource.__iter__c                 C   s   dj | j| jdS )Nz,<PrefixedSubAppResource {prefix} -> {app!r}>)rN   rP   )r   r  rZ  rg   r@   r@   rZ   r     s    zPrefixedSubAppResource.__repr__)rU   rV   rW   rX   re   rq   r[  r   rj   rI   rs   r-   r{   rn   r   r   r   r7   r   r   r   r@   r@   r   rZ   rY    s   		rY  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 )
rR   rk   c                    s   dS )z1Return bool if the request satisfies the criteriaNr@   rm   r@   r@   rZ   r   %  s    zAbstractRuleMatching.matchrf   c                 C   s   dS rr   r@   rg   r@   r@   rZ   rs   )  s    zAbstractRuleMatching.get_infoc                 C   s   dS )zReturn a strNr@   rg   r@   r@   rZ   rh   -  s    zAbstractRuleMatching.canonicalN)rU   rV   rW   ry   rz   r-   r|   r   rI   rs   rx   rX   rh   r@   r@   r@   rZ   rR   $  s   rR   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rQ   r_   c                    s   t    | || _d S r`   )r   re   
validation_domain)rd   rQ   r   r@   rZ   re   6  s    
zDomain.__init__rf   c                 C   s   | j S r`   rf  rg   r@   r@   rZ   rh   :  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 strrA   zDomain cannot be emptyz://zScheme not supportedzhttp://c                 3   s   | ]} j |V  qd S r`   )re_partr   )r   xrg   r@   rZ   	<genexpr>H  r  z$Domain.validation.<locals>.<genexpr>zDomain not validP   :)r   rX   	TypeErrorrstripr   r   r   Zraw_hostallr   port)rd   rQ   r	  r@   rg   rZ   re  >  s    


zDomain.validationrk   c                    s    |j tj}|sdS | |S r   )r   r   r   ZHOSTmatch_domain)rd   rl   hostr@   r@   rZ   r   N  s    zDomain.matchrr  r_   c                 C   s   |  | jkS r`   )r   rf  rd   rr  r@   r@   rZ   rq  T  s    zDomain.match_domainc                 C   s
   d| j iS )NrQ   rg  rg   r@   r@   rZ   rs   W  s    zDomain.get_info)rU   rV   rW   r   r   rh  rX   re   rx   rh   re  r-   r|   r   rq  rI   rs   r   r@   r@   r   rZ   rc  3  s   
rc  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}(?<!-)Nrd  c                    s2   t  | | jdddd}t|| _d S )NrA   z\.*z.*)r   re   rf  r&  r   r   _mask)rd   rQ   maskr   r@   rZ   re   ^  s    zMaskDomain.__init__rf   c                 C   s   | j jS r`   )rw  rL   rg   r@   r@   rZ   rh   c  s    zMaskDomain.canonicalrs  c                 C   s   | j |d uS r`   )rw  r   rt  r@   r@   rZ   rq  g  s    zMaskDomain.match_domain)rU   rV   rW   r   r   rh  rX   re   rx   rh   r|   rq  r   r@   r@   r   rZ   ru  [  s
   
ru  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)rS   rP   r_   c                 C   s    t |  d| _|| _|| _d S )Nr   )r3   re   r  rZ  _rule)rd   rS   rP   r@   r@   rZ   re   l  s    
zMatchedSubAppResource.__init__rf   c                 C   s   | j jS r`   )rz  rh   rg   r@   r@   rZ   rh   r  s    zMatchedSubAppResource.canonicalc                 C   s   | j | jdS )N)rP   rS   )rZ  rz  rg   r@   r@   rZ   rs   v  s    zMatchedSubAppResource.get_infork   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`   )rz  r   r   rZ  r\  rn   r   r   rT   r*   r   ra  r@   r@   rZ   rn   y  s    

zMatchedSubAppResource.resolvec                 C   s   dj | jdS )Nz"<MatchedSubAppResource -> {app!r}>)rP   )r   rZ  rg   r@   r@   rZ   r     s    zMatchedSubAppResource.__repr__)rU   rV   rW   rR   re   rx   rX   rh   rI   rs   r-   r{   rn   r   r@   r@   r@   rZ   ry  k  s   ry  c                       s   e Zd ZdZddeeeee f e	e
e dd fddZeddd	Zee
e dd
dZeeedddZedddZ  ZS )r8   zA route with resourceNr   )r   r   r   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__rf   c                 C   s   dj | j| j| jdS )Nz3<ResourceRoute [{method}] {resource} -> {handler!r})r   r   r   )r   r   r   r   rg   r@   r@   rZ   r     s    zResourceRoute.__repr__c                 C   s   | j d u rd S | j jS r`   )r   r]   rg   r@   r@   rZ   r]     s    
zResourceRoute.namer   c                 O   s    | j dusJ | j j|i |S r   )r   rj   r   r@   r@   rZ   rj     s    zResourceRoute.url_forc                 C   s   | j d usJ | j  S r`   )r   rs   rg   r@   r@   rZ   rs     s    zResourceRoute.get_info)rU   rV   rW   __doc__rX   r   r%   r   r"   r3   r   r   re   r   rx   r]   r   rj   rI   rs   r   r@   r@   r   rZ   r8     s   r8   c                       s   e Zd Zedd fddZeeedddZee	e dd	d
Z
edddZeedddZeedddZeedddZedddZ  ZS )r   Nr   c                    s   t  tj| j || _d S r`   )r   re   r   r   r  _http_exceptionr   r   r@   rZ   re     s    zSystemRoute.__init__r   c                 O   s   t dd S )Nz).url_for() is not allowed for SystemRouter`  r   r@   r@   rZ   rj     s    zSystemRoute.url_forrf   c                 C   s   d S r`   r@   rg   r@   r@   rZ   r]     s    zSystemRoute.namec                 C   s
   d| j iS )NrT   r|  rg   r@   r@   rZ   rs     s    zSystemRoute.get_infork   c                    s
   | j d S r`   r}  rm   r@   r@   rZ   r    s    zSystemRoute._handlec                 C   s   | j jS r`   )r|  r   rg   r@   r@   rZ   r     s    zSystemRoute.statusc                 C   s   | j jS r`   )r|  r   rg   r@   r@   rZ   r     s    zSystemRoute.reasonc                 C   s   dj | dS )Nz*<SystemRoute {self.status}: {self.reason}>rg   )r   rg   r@   r@   rZ   r     s    zSystemRoute.__repr__)rU   rV   rW   r'   re   rX   r   rj   rx   r   r]   rI   rs   r-   r/   r  r   r   r   r   r   r@   r@   r   rZ   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:   rf   c                    sX   | j jtjvr|   t| | j j d }|d u r:|   | I d H }t|tsTJ |S r`   )	rl   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__rg   r@   r@   rZ   r    s    zView.__await__c                    s&    fddt jD }t jj|d S )Nc                    s   h | ]}t  | r|qS r@   )hasattrr   )r   r>  rg   r@   rZ   	<setcomp>  r  z.View._raise_allowed_methods.<locals>.<setcomp>)r   r~  r*   rl   r   )rd   r   r@   rg   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                   @   sP   e Zd Zee ddddZedddZee ddd	Z	e
ed
ddZdS )ResourcesViewN)r]  r_   c                 C   s
   || _ d S r`   
_resources)rd   r]  r@   r@   rZ   re     s    zResourcesView.__init__rf   c                 C   s
   t | jS r`   )r   r  rg   r@   r@   rZ   r     s    zResourcesView.__len__c                 c   s   | j E d H  d S r`   r  rg   r@   r@   rZ   r     s    zResourcesView.__iter__r   r_   c                 C   s
   || j v S r`   r  rd   r   r@   r@   rZ   __contains__  s    zResourcesView.__contains__)rU   rV   rW   r   r3   re   r   r   r   r   objectr|   r  r@   r@   r@   rZ   r    s   r  c                   @   sN   e Zd Zee dddZedddZee	 dddZ
eed	d
dZdS )
RoutesView)r]  c                 C   s*   g | _ |D ]}|D ]}| j | qq
d S r`   )r   r   )rd   r]  r   r   r@   r@   rZ   re     s    zRoutesView.__init__rf   c                 C   s
   t | jS r`   r   rg   r@   r@   rZ   r     s    zRoutesView.__len__c                 c   s   | j E d H  d S r`   r   rg   r@   r@   rZ   r     s    zRoutesView.__iter__r   c                 C   s
   || j v S r`   r  r   r@   r@   rZ   r    s    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                       sR  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eedddZed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/d0d1Z+ee"e*e&d/d2d3Z,dd4d5ee"ee ee*e&d6d7d8Z-ee"e*e&d/d9d:Z.ee"e*e&d/d;d<Z/ee"e*e&d/d=d>Z0ee"e*e&d/d?d@Z1ee#e$ e*e&d/dAdBZ2dd fdCdDZ3e4e5 e6e& dEdFdGZ7  Z8S )Hr1   z[.:-]Nrf   c                    s&   t    g | _i | _i | _g | _d S r`   )r   re   r  _named_resources_resource_index_matched_sub_app_resourcesrg   r   r@   rZ   re     s
    
zUrlDispatcher.__init__rk   c           	         s   | j }t }|jj}|rt||dD ]0}||I d H \}}|d urL|  S ||O }q$|dkr`qt|dd ppd}q| jD ]0}||I d H \}}|d ur|  S ||O }qz|rtt	|j
|S tt S )Nr@   rF   r   )r  r   r   r   r   rn   
rpartitionr  r   r*   r   r+   )	rd   rl   Zresource_indexr   Zurl_part	candidater   allowedr   r@   r@   rZ   rn     s(    



zUrlDispatcher.resolvec                 C   s
   t | jS r`   )r   r  rg   r@   r@   rZ   r   1  s    zUrlDispatcher.__iter__c                 C   s
   t | jS r`   )r   r  rg   r@   r@   rZ   r   4  s    zUrlDispatcher.__len__r  c                 C   s
   || j v S r`   r  r  r@   r@   rZ   r  7  s    zUrlDispatcher.__contains__r^   c                 C   s
   | j | S r`   r  rc   r@   r@   rZ   __getitem__:  s    zUrlDispatcher.__getitem__c                 C   s
   t | jS r`   )r  r  rg   r@   r@   rZ   r]  =  s    zUrlDispatcher.resourcesc                 C   s
   t | jS r`   )r  r  rg   r@   r@   rZ   rO   @  s    zUrlDispatcher.routesc                 C   s
   t | jS r`   )r   r  rg   r@   r@   rZ   named_resourcesC  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| t |tr| j| n
| | 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   ry  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p2dS )z9Return a key to index the resource in the resource index.r   r   rF   )rh   	partitionr  rn  )rd   r   Z	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   Z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\   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 )NrF   z)path should be started with / or be emptyr   r   r\   )r   r   r  r]   rw   r   r4   rE   searchr5   r   r  r6   )rd   rJ   r]   r   r@   r@   rZ   add_resource  s    



zUrlDispatcher.add_resource)r]   r~   )r   rJ   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   rJ   r]   r~   r  r  r  r  r_   c          
   
   C   sJ   | dsJ |dr$|dd }t||||||||d}	| |	 |	S )z^Add static files view.

        prefix - url prefix
        path - folder with files

        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_static)rJ   r   ri   r_   c                 K   s   | j tj||fi |S )z(Shortcut for add_route with method HEAD.)r   r   	METH_HEADrd   rJ   r   ri   r@   r@   rZ   add_head  s    zUrlDispatcher.add_headc                 K   s   | j tj||fi |S )z+Shortcut for add_route with method OPTIONS.)r   r   ZMETH_OPTIONSr  r@   r@   rZ   add_options  s    zUrlDispatcher.add_optionsT)r]   
allow_head)rJ   r   r]   r  ri   r_   c                K   s>   | j ||d}|r(|jtj|fi | |jtj|fi |S )zShortcut for add_route with method GET.

        If allow_head is true, another
        route is added allowing head requests to the same endpoint.
        r\   )r  r   r   r  ZMETH_GET)rd   rJ   r   r]   r  ri   r   r@   r@   rZ   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  r@   r@   rZ   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  r@   r@   rZ   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  r@   r@   rZ   	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  r@   r@   rZ   
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  r@   r@   rZ   add_view  s    zUrlDispatcher.add_viewc                    s"   t    | jD ]}|  qd S r`   )r   rt   r  r  r   r@   rZ   rt     s    

zUrlDispatcher.freeze)rO   r_   c                 C   s"   g }|D ]}| ||  q|S )zAppend routes to route table.

        Parameter should be a sequence of RouteDef objects.

        Returns a list of registered AbstractRoute instances.
        )extendregister)rd   rO   Zregistered_routesZ	route_defr@   r@   rZ   
add_routes  s    zUrlDispatcher.add_routes)9rU   rV   rW   r   r   r  re   r-   r2   rn   r   rX   r   r   r   r  r|   r  r3   r  r  r]  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  rt   r   r0   r   r  r   r@   r@   r   rZ   r1     s~   
)'"	
r1   )r   r_   c                 C   s$   t dk r| dd} tj| ddjS )Nr   r"  r#  Fr   )rC   r&  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     s    r   c                 C   s    t | }d| v r|dd}|S )Nr"  r#  )r  r&  )r   r   r@   r@   rZ   r     s    r   )~ry   r   r:  	functoolsr7  rV  r   r  r(  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   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;   rX   ZBaseDictdictversion_infoplatformr   OSErrorr   rG  r   mapr   r   rC   rY   r   rD   rE   r   rG   r   r{   partialrN  rI   r3   ABCr7   r2   r   r   r4   r5   r6   r
  r9   rY  rR   rc  ru  ry  r8   r   r:   r  r  r1   r  r   r   r@   r@   r@   rZ   <module>   s   
`

0/QC<)L Q.($  