o
    ii                     @   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	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mZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z*m+Z, ddl-m.Z. dd	l m/Z/m0Z0m1Z1 dd
l2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8 ddl9m:Z:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@ ddlAmBZB ddlCmDZDmEZE ddlFmGZG dZHerddlImJZJ eeKeKf ZLneMZLejNdk rej	OdrePfn	ejNdk reQfndZReSeTeUe,Vddd ZWee$eUdf  eXd< e
YdZZee!eK  eXd< e
YdZ[ee!eK  eXd< e
\d Z]eeK eXd!< e	^ d"kZ_ee` eXd#< eeBgee eE  f Zae$e d$ e"eK f Zbejcej\d%d&ZdG d'd( d(e&d)d*ZeG d+d, d,e#ed- ZfG d.d- d-e jgZhG d/d$ d$eLe/ZiG d0d1 d1eiZjd2eBd3dfd4d5ZkG d6d7 d7efZlG d8d9 d9elZmG d:d; d;elZnG d<d= d=efZoG d>d? d?eoZpG d@dA dAeoZqG dBdC dCe jgZrG dDdE dEerZsG dFdG dGesZtG dHdI dIeqZuG dJdK dKehZvG dLdM dMehZwG dNdO dOe1ZxG dPdQ dQe#eef eef ZyG dRdS dSe#eeh eeh ZzG dTdU dUe0eeKeff Z{dVeKd3eKfdWdXZ|dVeKd3eKfdYdZZ}dVeKd3eKfd[d\Z~dS )]    N)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_SEPWindows
IS_WINDOWSr1   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prefixr6   routesr:   appdomainAbstractRuleMatchingrulehttp_exceptionN)	__name__
__module____qualname__str__annotations__r   r   r   r&   r?   r?   r?   a/var/www/scraper.webshop2u.hu/html/venv/lib/python3.10/site-packages/aiohttp/web_urldispatcher.pyrJ   j   s   
 rJ   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namer^   returnc                C   
   || _ d S N_nameselfr^   r?   r?   r[   __init__~      
zAbstractResource.__init__c                 C      | j S ra   rb   re   r?   r?   r[   r^         zAbstractResource.namec                 C      dS )zWExposes the resource's canonical path.

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

        Nr?   ri   r?   r?   r[   	canonical       zAbstractResource.canonicalkwargsc                 K   rk   )z2Construct url for resource with additional params.Nr?   )re   rn   r?   r?   r[   url_for   rm   zAbstractResource.url_forrequestc                       dS )zWResolve resource.

        Return (UrlMappingMatchInfo, allowed_methods) pair.
        Nr?   re   rp   r?   r?   r[   resolve       zAbstractResource.resolverO   c                 C   rk   )zWAdd a prefix to processed URLs.

        Required for subapplications support.
        Nr?   re   rO   r?   r?   r[   
add_prefix   rm   zAbstractResource.add_prefixc                 C   rk   z;Return a dict with additional info useful for introspectionNr?   ri   r?   r?   r[   get_info   rm   zAbstractResource.get_infoc                 C      d S ra   r?   ri   r?   r?   r[   freeze      zAbstractResource.freezerK   c                 C   rk   )z Perform a raw match against pathNr?   re   rK   r?   r?   r[   	raw_match   rm   zAbstractResource.raw_matchr_   N)rV   rW   rX   r   rY   rf   propertyr^   abcabstractmethodrl   r   ro   r,   _Resolvers   rv   rJ   rx   rz   boolr}   r?   r?   r?   r[   r2   }   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ee fddZdS )r6   Nexpect_handlerresourcemethodhandlerr   r   r_   c                   s  |d u rt }t|stjdk rt|sJ d|| }t|s,t	| dt
|s4J |t|sCtjdk rDt|rDn4t|rTtrMJ tdt n$t|tr_t|tr_ntdt t|dtdtf fd	d
}| |}|| _|| _|| _|| _d S )N)r;      zCoroutine is expected, got z is not allowed HTTP methodFz6Bare generators are deprecated, use @coroutine wrapperz-Bare functions are deprecated, use async onesrp   r_   c                    s0    | }t |r|I d H }t|tsJ |S ra   )asyncioiscoroutine
isinstancer.   )rp   resultold_handlerr?   r[   handler_wrapper   s   

z/AbstractRoute.__init__.<locals>.handler_wrapper)_default_expect_handlerinspectiscoroutinefunctionsysversion_infor   upperrC   match
ValueErrorcallableisgeneratorfunctionr   warningswarnDeprecationWarningr   type
issubclassr!   r   r,   r.   _method_handler_expect_handler	_resource)re   r   r   r   r   r   r?   r   r[   rf      sB   	




zAbstractRoute.__init__c                 C   rh   ra   )r   ri   r?   r?   r[   r      rj   zAbstractRoute.methodc                 C   rh   ra   )r   ri   r?   r?   r[   r      rj   zAbstractRoute.handlerc                 C   rk   )z8Optional route's name, always equals to resource's name.Nr?   ri   r?   r?   r[   r^      rm   zAbstractRoute.namec                 C   rh   ra   )r   ri   r?   r?   r[   r      rj   zAbstractRoute.resourcec                 C   rk   rw   r?   ri   r?   r?   r[   rx      rm   zAbstractRoute.get_infoargsrn   c                 O   rk   z/Construct url for route with additional params.Nr?   re   r   rn   r?   r?   r[   ro      rm   zAbstractRoute.url_forrp   c                    s   |  |I d H S ra   )r   rr   r?   r?   r[   handle_expect_header      z"AbstractRoute.handle_expect_header)rV   rW   rX   rY   r   r$   r   r!   r   _ExpectHandlerr2   rf   r   r   r   r   r   r^   r   rJ   rx   r   ro   r,   r.   r   r?   r?   r?   r[   r6      s8    
7c                       s   e Zd ZdZdeeef dedd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jd ddZd"ddZdef fddZ  ZS )#r1   )_route_apps_current_app_frozen
match_dictrouter_   Nc                    s(   t  | || _g | _d | _d| _d S NF)superrf   r   r   r   r   )re   r   r   	__class__r?   r[   rf     s
   
zUrlMappingMatchInfo.__init__c                 C      | j jS ra   )r   r   ri   r?   r?   r[   r        zUrlMappingMatchInfo.handlerc                 C   rh   ra   )r   ri   r?   r?   r[   r     rj   zUrlMappingMatchInfo.routec                 C   r   ra   )r   r   ri   r?   r?   r[   r     r   z"UrlMappingMatchInfo.expect_handlerc                 C   ry   ra   r?   ri   r?   r?   r[   rU        z"UrlMappingMatchInfo.http_exceptionc                 C   s
   | j  S ra   )r   rx   ri   r?   r?   r[   rx     rg   zUrlMappingMatchInfo.get_info)r:   .c                 C   
   t | jS ra   )tupler   ri   r?   r?   r[   apps  s   
zUrlMappingMatchInfo.appsrQ   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re   rQ   r?   r?   r[   add_app#  s
   
zUrlMappingMatchInfo.add_appc                 C   s   | j }|d us	J |S ra   )r   r   r?   r?   r[   current_app*  s   zUrlMappingMatchInfo.current_appc                 C   s*   t r|| jvrtd| j||| _d S )Nz1Expected one of the following apps {!r}, got {!r})r"   r   r   formatr   r   r?   r?   r[   r   0  s   

c                 C   s
   d| _ d S )NT)r   ri   r?   r?   r[   rz   ;  rg   zUrlMappingMatchInfo.freezec                    s   dt    d| j dS )Nz<MatchInfo z: >)r   __repr__r   ri   r   r?   r[   r   >  s   zUrlMappingMatchInfo.__repr__)rQ   r:   r_   N)r_   r:   r~   )rV   rW   rX   	__slots__r
   rY   r6   rf   r   r$   r   r   r   r   r   r&   rU   rJ   rx   r   r   r   r   setterrz   r   __classcell__r?   r?   r   r[   r1     s*    "


c                       sJ   e Zd 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 )MatchInfoError
_exceptionrU   r_   Nc                    s   || _ t i t| j  d S ra   )r   r   rf   SystemRoutere   rU   r   r?   r[   rf   F  s   zMatchInfoError.__init__c                 C   rh   ra   r   ri   r?   r?   r[   rU   J  rj   zMatchInfoError.http_exceptionc                 C   s   d | jj| jjS )Nz<MatchInfoError {}: {}>)r   r   statusreasonri   r?   r?   r[   r   N  s   zMatchInfoError.__repr__)rV   rW   rX   r   r&   rf   r   rU   rY   r   r   r?   r?   r   r[   r   B  s    r   rp   r_   c                    sX   | j tjd}| jtkr*| dkr#| jdI dH  d| j_	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

Nr   zUnknown Expect: %s)text)headersgetr   EXPECTversionr#   lowerwriterwriteoutput_sizer'   )rp   expectr?   r?   r[   r   T  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 )r3   Nr]   r^   r_   c                   s&   t  j|d i | _d | _t | _d S )Nr]   )r   rf   _routes
_any_routeset_allowed_methodsrd   r   r?   r[   rf   e  s   zResource.__init__r   r   r   r   r7   c                C   sD   | j || j }rtd|j dt||| |d}| | |S )Nz+Added route will never be executed, method z is already registeredr   )r   r   r   r   r   r7   register_route)re   r   r   r   r   	route_objr?   r?   r[   	add_routek  s   
zResource.add_router   c                 C   sH   t |tsJ d||jtjkr|| _| j|j || j|j< d S )Nz)Instance of Route class is required, got )	r   r7   r   r   METH_ANYr   r   addr   re   r   r?   r?   r[   r   }  s   zResource.register_routerp   c                    sR   |  |jj }d u rd t fS | j|j| j }r$t||| j	fS d | j	fS ra   )
_matchrel_url	path_safer   r   r   r   r   r1   r   )re   rp   r   r   r?   r?   r[   rs     s   

zResource.resolverK   c                 C   ry   ra   r?   r|   r?   r?   r[   r     r   zResource._matchc                 C   r   ra   lenr   ri   r?   r?   r[   __len__  rg   zResource.__len__c                 C      t | j S ra   iterr   valuesri   r?   r?   r[   __iter__     zResource.__iter__)r   r7   r_   N)rV   rW   rX   r   rY   rf   r   r   r!   r$   r   r   r   r,   r   rs   r   r   r
   r   intr   r   r   r   r?   r?   r   r[   r3   d  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   Nr]   rK   r^   r_   c                   s*   t  j|d |r|dsJ || _d S )Nr]   rE   )r   rf   
startswith_path)re   rK   r^   r   r?   r[   rf     s   
zPlainResource.__init__c                 C   rh   ra   r   ri   r?   r?   r[   rl     rj   zPlainResource.canonicalc                 C   s   | j sd| _ d S d S )NrE   r   ri   r?   r?   r[   rz     s   
zPlainResource.freezerO   c                 C   s<   | dsJ |drJ t|dksJ || j | _d S NrE   r   )r   endswithr   r   ru   r?   r?   r[   rv     s   zPlainResource.add_prefixc                 C   s   | j |kri S d S ra   r   r|   r?   r?   r[   r     s   
zPlainResource._matchc                 C   
   | j |kS ra   r   r|   r?   r?   r[   r}     rg   zPlainResource.raw_matchc                 C   
   d| j iS )NrK   r   ri   r?   r?   r[   rx     rg   zPlainResource.get_infoc                 C   s   t j| jddS )NTrK   encoded)r   buildr   ri   r?   r?   r[   ro        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   rd   r?   r?   r[   r     s   zPlainResource.__repr__r~   )rV   rW   rX   rY   r   rf   r   rl   rz   rv   r
   r   r   r}   rJ   rx   r   ro   r   r   r?   r?   r   r[   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[^{}/]+Nr]   rK   r^   r_   c          	   
      s^  t  j|d || _d}d}t|D ]d}| j|}|r5|d|d| j	7 }|d|d d 7 }q| j
|}|rU|djdi | 7 }|d|d d 7 }qd|v s]d|v rht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': rE   r?   )r   rf   
_orig_pathrD   splitDYN	fullmatchr   groupGOODDYN_WITH_RE	groupdictr   _requote_pathreescapecompileerrorrM   r   rF   _pattern
_formatter)	re   rK   r^   rM   rL   partr   compiledexcr   r?   r[   rf     s<   
zDynamicResource.__init__c                 C   rh   ra   )r  ri   r?   r?   r[   rl     rj   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  rM   r  ru   r?   r?   r[   rv     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_safe).0keyvaluer?   r?   r[   
<dictcomp>  s    z*DynamicResource._match.<locals>.<dictcomp>)r  r  r  items)re   rK   r   r?   r?   r[   r     s   
zDynamicResource._matchc                 C   r   ra   )r   r|   r?   r?   r[   r}     rg   zDynamicResource.raw_matchc                 C      | j | jdS )N)rL   rM   )r  r  ri   r?   r?   r[   rx      r   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?   r[   r    s    z+DynamicResource.url_for.<locals>.<dictcomp>Tr   )r  
format_mapr  r   r   )re   r  urlr?   r?   r[   ro     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^   rL   )r^   r   r  rd   r?   r?   r[   r     s   zDynamicResource.__repr__)rV   rW   rX   r	  r  r  r  r  rY   r   rf   r   rl   rv   r
   r   r   r}   rJ   rx   r   ro   r   r   r?   r?   r   r[   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 )PrefixResourceNr]   rO   r^   r_   c                   sX   |r| dsJ ||dv s|drJ |t j|d t|| _| jd | _d S )NrE   )r   rE   r]   )r   r   r   rf   r  _prefix_prefix2)re   rO   r^   r   r?   r[   rf     s
   
zPrefixResource.__init__c                 C   rh   ra   )r!  ri   r?   r?   r[   rl     rj   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"  ru   r?   r?   r[   rv     s
   zPrefixResource.add_prefixc                 C   rk   r   r?   ru   r?   r?   r[   r}   !  r{   zPrefixResource.raw_match)rV   rW   rX   rY   r   rf   r   rl   rv   r   r}   r   r?   r?   r   r[   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 ).r8   r  N   Fr^   r   
chunk_size
show_indexfollow_symlinksappend_versionrO   rN   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
| _t| j| _d S )Nr]   T)strictr   z' does not existz' is not a directoryGETr   HEAD)r*  r+  )r   rf   r   
expanduserrs   FileNotFoundErrorr   is_dir
_directory_show_index_chunk_size_follow_symlinksr   _append_versionr7   _handler   r   r   )
re   rO   rN   r^   r   r%  r&  r'  r(  r  r   r?   r[   rf   *  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 )NrE   Tr   r      %%25rb)r3  rY   lstripr   r   r!  rB   replacer/  joinpathr2  r   osrK   normpathrelative_tors   r   r-  is_fileopenread_get_file_hash
with_queryVERSION_KEY)
re   r5  r(  r  unresolved_pathnormalized_pathfilepathf
file_byteshr?   r?   r[   ro   N  s8   


zStaticResource.url_for
byte_arrayc                 C   s*   t  }||  t| }|dS )Nascii)hashlibsha256updatebase64urlsafe_b64encodedigestdecode)rM  mb64r?   r?   r[   rD  w  s   

zStaticResource._get_file_hashc                 C   s   | j | j| jdS )N)rN   rO   rP   )r/  r!  r   ri   r?   r?   r[   rx   ~  s   zStaticResource.get_infor   c                 C   s:   d| j v r	tdtd|| | jd| j d< | jd d S )NOPTIONSzOPTIONS route was set alreadyr   )r   r   r7   r   r   r   )re   r   r?   r?   r[   set_options_route  s   

z StaticResource.set_options_routerp   c                    s   |j j}|j}tj|}tr|dd}|| j	s&|| j
kr&d t fS | j}||vr1d |fS dt|t| j
d d  i}t|| j| |fS )N\rE   r5  r   )r   r   r   r>  rK   r?  rH   r<  r   r"  r!  r   r   r  r   r1   r   )re   rp   rK   r   	norm_pathallowed_methodsr   r?   r?   r[   rs     s   
zStaticResource.resolvec                 C   r   ra   r   ri   r?   r?   r[   r     rg   zStaticResource.__len__c                 C   r   ra   r   ri   r?   r?   r[   r     r   zStaticResource.__iter__c                    s6   |j d }| j|}t }|d | j|I d H S )Nr5  )
match_infor/  r=  r   get_running_looprun_in_executor_resolve_path_to_response)re   rp   r5  rG  loopr?   r?   r[   r4    s   

zStaticResource._handlerG  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%  )r2  r   r>  rK   r?  r@  r/  rs   r   CIRCULAR_SYMLINK_ERRORr*   r.  r0  r-   _directory_as_htmlr(   PermissionErrorr+   r1  )re   rG  rH  	file_pathr  r?   r?   r[   r`    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>rE   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^   appendr   join)re   rg  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?   r[   rd    s(   z!StaticResource._directory_as_htmlc                 C   s0   | j d urd| j  d nd}dj|| j| jdS )Nr   r   z/<StaticResource {name} {path} -> {directory!r}>)r^   rK   rN   )r^   r   r!  r/  rd   r?   r?   r[   r     s   
zStaticResource.__repr__)"rV   rW   rX   rF  rY   r%   r   r   r   r   rf   r   ro   staticmethodbytesrD  rJ   rx   r$   rY  r,   r   rs   r   r   r6   r   r.   r4  r   r`  rd  r   r   r?   r?   r   r[   r8   '  s\    	
(
)# 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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 )PrefixedSubAppResourcerO   rQ   r:   r_   Nc                    s    t  | || _| | d S ra   )r   rf   _app_add_prefix_to_resources)re   rO   rQ   r   r?   r[   rf     s   zPrefixedSubAppResource.__init__c                    s   t  | | | d S ra   )r   rv   r  ru   r   r?   r[   rv     s   z!PrefixedSubAppResource.add_prefixc                 C   s8   | j j}| D ]}|| || || qd S ra   )r  router	resourcesunindex_resourcerv   index_resource)re   rO   r  r   r?   r?   r[   r    s   

z/PrefixedSubAppResource._add_prefix_to_resourcesr   rn   c                 O      t d)Nz3.url_for() is not supported by sub-application rootr   r   r?   r?   r[   ro   
     zPrefixedSubAppResource.url_forc                 C   r  )N)rQ   rO   )r  r!  ri   r?   r?   r[   rx     r   zPrefixedSubAppResource.get_inforp   c                    sL   | j j|I d H }|| j  t|jtr|jj}||fS t }||fS ra   )	r  r  rs   r   r   rU   r)   r\  r   re   rp   r]  methodsr?   r?   r[   rs     s   zPrefixedSubAppResource.resolvec                 C      t | jj S ra   )r   r  r  rP   ri   r?   r?   r[   r     r   zPrefixedSubAppResource.__len__c                 C   r  ra   )r   r  r  rP   ri   r?   r?   r[   r     r   zPrefixedSubAppResource.__iter__c                 C   s   dj | j| jdS )Nz,<PrefixedSubAppResource {prefix} -> {app!r}>)rO   rQ   )r   r!  r  ri   r?   r?   r[   r     s   zPrefixedSubAppResource.__repr__)rV   rW   rX   rY   rf   rv   r  r   ro   rJ   rx   r,   r   rs   r   r   r   r6   r   r   r   r?   r?   r   r[   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 )
rS   rp   r_   c                    rq   )z1Return bool if the request satisfies the criteriaNr?   rr   r?   r?   r[   r   &  rt   zAbstractRuleMatching.matchc                 C   rk   rw   r?   ri   r?   r?   r[   rx   *  rm   zAbstractRuleMatching.get_infoc                 C   rk   )zReturn a strNr?   ri   r?   r?   r[   rl   .  rm   zAbstractRuleMatching.canonicalN)rV   rW   rX   r   r   r,   r   r   rJ   rx   r   rY   rl   r?   r?   r?   r[   rS   %  s    rS   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}(?<!-)rR   r_   Nc                    s   t    | || _d S ra   )r   rf   
validation_domain)re   rR   r   r?   r[   rf   7  s   
zDomain.__init__c                 C   rh   ra   r  ri   r?   r?   r[   rl   ;  rj   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 ra   )re_partr  )r  xri   r?   r[   	<genexpr>I  s    z$Domain.validation.<locals>.<genexpr>zDomain not validP   :)r   rY   	TypeErrorrstripr   r   r   raw_hostallr  port)re   rR   r  r?   ri   r[   r  ?  s   

zDomain.validationrp   c                    s"   |j tj}|sdS | |S r   )r   r   r   HOSTmatch_domain)re   rp   hostr?   r?   r[   r   O  s
   
zDomain.matchr  c                 C   s   |  | jkS ra   )r   r  re   r  r?   r?   r[   r  U  r   zDomain.match_domainc                 C   r   )NrR   r  ri   r?   r?   r[   rx   X  rg   zDomain.get_info)rV   rW   rX   r	  r  r  rY   rf   r   rl   r  r,   r   r   r  rJ   rx   r   r?   r?   r   r[   r  4  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}(?<!-)rR   r_   Nc                    s2   t  | | jdddd}t|| _d S )Nr@   z\.*z.*)r   rf   r  r<  r	  r  _mask)re   rR   maskr   r?   r[   rf   _  s   zMaskDomain.__init__c                 C   r   ra   )r  rM   ri   r?   r?   r[   rl   d  r   zMaskDomain.canonicalr  c                 C   s   | j |d uS ra   )r  r  r  r?   r?   r[   r  h  r   zMaskDomain.match_domain)rV   rW   rX   r	  r  r  rY   rf   r   rl   r   r  r   r?   r?   r   r[   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 )MatchedSubAppResourcerT   rQ   r:   r_   Nc                 C   s    t |  d| _|| _|| _d S )Nr   )r2   rf   r!  r  _rule)re   rT   rQ   r?   r?   r[   rf   m  s   

zMatchedSubAppResource.__init__c                 C   r   ra   )r  rl   ri   r?   r?   r[   rl   s  r   zMatchedSubAppResource.canonicalc                 C   r  )N)rQ   rT   )r  r  ri   r?   r?   r[   rx   w  r   zMatchedSubAppResource.get_inforp   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 ra   )r  r   r   r  r  rs   r   r   rU   r)   r\  r  r?   r?   r[   rs   z  s   
zMatchedSubAppResource.resolvec                 C   s   d| j dS )Nz<MatchedSubAppResource -> r   )r  ri   r?   r?   r[   r     r   zMatchedSubAppResource.__repr__)rV   rW   rX   rS   rf   r   rY   rl   rJ   rx   r,   r   rs   r   r?   r?   r?   r[   r  l  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 )r7   zA route with resourceNr   r   r   r   r   r_   c                   s   t  j||||d d S )Nr   )r   rf   )re   r   r   r   r   r   r?   r[   rf     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   ri   r?   r?   r[   r     s   zResourceRoute.__repr__c                 C   s   | j d u rd S | j jS ra   )r   r^   ri   r?   r?   r[   r^     s   
zResourceRoute.namer   rn   c                 O   s    | j dusJ | j j|i |S r   )r   ro   r   r?   r?   r[   ro     s   zResourceRoute.url_forc                 C   s   | j d usJ | j  S ra   )r   rx   ri   r?   r?   r[   rx     s   
zResourceRoute.get_info)rV   rW   rX   __doc__rY   r   r$   r   r!   r2   r   r   rf   r   r   r^   r   ro   rJ   rx   r   r?   r?   r   r[   r7     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   rU   r_   Nc                    s   t  tj| j || _d S ra   )r   rf   r   r   r4  _http_exceptionr   r   r?   r[   rf     s   
zSystemRoute.__init__r   rn   c                 O   r  )Nz).url_for() is not allowed for SystemRouter  r   r?   r?   r[   ro     r  zSystemRoute.url_forc                 C   ry   ra   r?   ri   r?   r?   r[   r^     r   zSystemRoute.namec                 C   r   )NrU   r  ri   r?   r?   r[   rx     rg   zSystemRoute.get_inforp   c                    s   | j ra   r  rr   r?   r?   r[   r4    s   zSystemRoute._handlec                 C   r   ra   )r  r   ri   r?   r?   r[   r     r   zSystemRoute.statusc                 C   r   ra   )r  r   ri   r?   r?   r[   r     r   zSystemRoute.reasonc                 C   s   dj | dS )Nz*<SystemRoute {self.status}: {self.reason}>ri   )r   ri   r?   r?   r[   r        zSystemRoute.__repr__)rV   rW   rX   r&   rf   rY   r   ro   r   r   r^   rJ   rx   r,   r.   r4  r   r   r   r   r   r?   r?   r   r[   r     s    r   c                   @   s@   e Zd ZdefddZdeddef fddZdefddZdS )	r9   r_   c                    sZ   | j jtjvr|   t| | j j d }|d u r|   | I d H }t|ts+J |S ra   )	rp   r   r   METH_ALL_raise_allowed_methodsgetattrr   r   r.   )re   r   retr?   r?   r[   _iter  s   z
View._iterNc                 C   s   |    S ra   )r  	__await__ri   r?   r?   r[   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  rV  ri   r?   r[   	<setcomp>  s    z.View._raise_allowed_methods.<locals>.<setcomp>)r   r  r)   rp   r   )re   r\  r?   ri   r[   r    s   zView._raise_allowed_methods)	rV   rW   rX   r.   r  r   r  r   r  r?   r?   r?   r[   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  r_   Nc                 C   r`   ra   
_resources)re   r  r?   r?   r[   rf     rg   zResourcesView.__init__c                 C   r   ra   )r   r  ri   r?   r?   r[   r     rg   zResourcesView.__len__c                 c       | j E d H  d S ra   r  ri   r?   r?   r[   r     r   zResourcesView.__iter__r   c                 C   
   || j v S ra   r  re   r   r?   r?   r[   __contains__  rg   zResourcesView.__contains__)rV   rW   rX   r   r2   rf   r   r   r   r   objectr   r  r?   r?   r?   r[   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 ra   )r   rm  )re   r  r   r   r?   r?   r[   rf     s   zRoutesView.__init__r_   c                 C   r   ra   r   ri   r?   r?   r[   r     rg   zRoutesView.__len__c                 c   r  ra   r   ri   r?   r?   r[   r     r   zRoutesView.__iter__r   c                 C   r  ra   r  r   r?   r?   r[   r    rg   zRoutesView.__contains__N)rV   rW   rX   r   r2   rf   r   r   r   r6   r   r  r   r  r?   r?   r?   r[   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 )Or0   z[.:-]r_   Nc                    s&   t    g | _i | _i | _g | _d S ra   )r   rf   r  _named_resources_resource_index_matched_sub_app_resourcesri   r   r?   r[   rf     s
   

zUrlDispatcher.__init__rp   c           	         s   | j }t }| jD ]}||I d H \}}|d ur|  S ||O }q
|jj}|rX||dD ]}||I d H \}}|d urC|  S ||O }q/|dkrMn|dd pUd}|s)|rbtt	|j
|S tt S )Nr?   rE   r   )r  r   r  rs   r   r   r   
rpartitionr   r)   r   r*   )	re   rp   resource_indexr\  r   r   allowedurl_part	candidater?   r?   r[   rs   	  s,   




zUrlDispatcher.resolvec                 C   r   ra   )r   r  ri   r?   r?   r[   r   2  rg   zUrlDispatcher.__iter__c                 C   r   ra   )r   r  ri   r?   r?   r[   r   5  rg   zUrlDispatcher.__len__r   c                 C   r  ra   r  r  r?   r?   r[   r  8  rg   zUrlDispatcher.__contains__r^   c                 C   s
   | j | S ra   r  rd   r?   r?   r[   __getitem__;  rg   zUrlDispatcher.__getitem__c                 C   r   ra   )r  r  ri   r?   r?   r[   r  >  rg   zUrlDispatcher.resourcesc                 C   r   ra   )r  r  ri   r?   r?   r[   rP   A  rg   zUrlDispatcher.routesc                 C   r   ra   )r   r  ri   r?   r?   r[   named_resourcesD  rg   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   r2   frozenr   r^   NAME_SPLIT_REr  keyword	iskeywordr   isidentifierr   r  r  rm  r  r  r  )re   r   r^   r  r  r?   r?   r[   register_resourceG  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   rE   )rl   	partitionr  r  )re   r   	index_keyr?   r?   r[   _get_resource_index_keyn  s   z%UrlDispatcher._get_resource_index_keyc                 C   s"   |  |}| j|g | dS )z%Add a resource to the resource index.N)r  r  
setdefaultrm  re   r   resource_keyr?   r?   r[   r  y  s   
zUrlDispatcher.index_resourcec                 C   s   |  |}| j| | dS )z*Remove a resource from the resource index.N)r  r  remover  r?   r?   r[   r    s   
zUrlDispatcher.unindex_resourcer]   rK   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	||d}| 
| |S t||d}| 
| |S )NrE   z)path should be started with / or be emptyr   r   r]   )r   r   r  r^   r}   r   r3   rD   searchr4   r  r5   )re   rK   r^   r   r?   r?   r[   add_resource  s   



zUrlDispatcher.add_resource)r^   r   r   r   r   c                C   s   | j ||d}|j|||dS )Nr]   r   )r  r   )re   r   rK   r   r^   r   r   r?   r?   r[   r     s   	zUrlDispatcher.add_router#  Fr$  rO   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

        rE   Nr  r$  )r   r   r8   r  )
re   rO   rK   r^   r   r%  r&  r'  r(  r   r?   r?   r[   
add_static  s   


zUrlDispatcher.add_staticrn   c                 K      | j tj||fi |S )z(Shortcut for add_route with method HEAD.)r   r   	METH_HEADre   rK   r   rn   r?   r?   r[   add_head     zUrlDispatcher.add_headc                 K   r  )z+Shortcut for add_route with method OPTIONS.)r   r   METH_OPTIONSr  r?   r?   r[   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)re   rK   r   r^   r  rn   r   r?   r?   r[   add_get  s   zUrlDispatcher.add_getc                 K   r  )z(Shortcut for add_route with method POST.)r   r   	METH_POSTr  r?   r?   r[   add_post  r  zUrlDispatcher.add_postc                 K   r  )z'Shortcut for add_route with method PUT.)r   r   METH_PUTr  r?   r?   r[   add_put  r  zUrlDispatcher.add_putc                 K   r  )z)Shortcut for add_route with method PATCH.)r   r   
METH_PATCHr  r?   r?   r[   	add_patch  r  zUrlDispatcher.add_patchc                 K   r  )z*Shortcut for add_route with method DELETE.)r   r   METH_DELETEr  r?   r?   r[   
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?   r[   add_view  s   zUrlDispatcher.add_viewc                    s"   t    | jD ]}|  qd S ra   )r   rz   r  r  r   r?   r[   rz     s   


zUrlDispatcher.freezerP   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)re   rP   registered_routes	route_defr?   r?   r[   
add_routes  s   zUrlDispatcher.add_routesr~   )9rV   rW   rX   r	  r  r  rf   r,   r1   rs   r   rY   r   r   r   r  r   r  r2   r  r  r  r  rP   r   r  r  r  r  r  r   r3   r  r   r$   r   r!   r   r6   r   r%   r  r   r  r  r  r  r  r  r  r  rz   r   r/   r   r  r   r?   r?   r   r[   r0     s    
)' 
	

"	

"r0   r  c                 C   s$   t dk r
| dd} tj| ddjS )Nr6  r8  r9  Fr   )rB   r<  r   r   raw_pathr  r?   r?   r[   r    s   r  c                 C   s    d| vr| S |  dd ddS )Nr8  z%2FrE   r9  )r<  r  r?   r?   r[   r    s   r  c                 C   s    t | }d| v r|dd}|S )Nr8  r9  )r  r<  )r  r   r?   r?   r[   r    s   r  )r   r   rR  	functoolsrO  r{  r   r  r>  platformr	  r   r   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_routedefr/   __all__web_appr:   rY   BaseDictdictr   r   OSErrorr   rc  r   mapr   r  rB   rZ   r  rC   rD   r
  rF   systemrH   r   r   r   partialrj  rJ   r2   ABCr6   r1   r   r   r3   r4   r5   r   r8   r~  rS   r  r  r  r7   r   r9   r  r  r0   r  r  r  r?   r?   r?   r[   <module>   s   
 `0/UA6(L Q.($  