a
     ÑOc;š  ã                   @   s  U d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ d dl%m&Z&m'Z( dd	l)m*Z* dd
l m+Z+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZBmCZC ddlDmEZE dZFe�r¢ddlGmHZH eeIeIf ZJneKZJeLeMeNe( Od¡dd… ƒƒZPe3e!eNdf  eQd< e Rd¡ZSe3eeI  eQd< e Rd¡ZTe3eeI  eQd< e Ud¡ZVe3eI eQd< ee@ged f ZWe!ed eeI f ZXG d d!„ d!e6d"d#�ZYG d$d%„ d%e ed& ƒZZG d'd&„ d&e j[ƒZ\G d(d„ deJe+ƒZ]G d)d*„ d*e]ƒZ^e@dd+œd,d-„Z_G d.d/„ d/eZƒZ`G d0d1„ d1e`ƒZaG d2d3„ d3e`ƒZbG d4d5„ d5eZƒZcG d6d7„ d7ecƒZdG d8d9„ d9ecƒZeG d:d;„ d;e j[ƒZfG d<d=„ d=efƒZgG d>d?„ d?egƒZhG d@dA„ dAeeƒZiG dBdC„ dCe\ƒZjG dDdE„ dEe\ƒZkG dFdG„ dGe-ƒZlG dHdI„ dIe eeZ eeZ ƒZmG dJdK„ dKe ee\ ee\ ƒZnG dLdM„ dMe,eeIeZf ƒZoeIeIdNœdOdP„ZpeIeIdNœdQdR„ZqeIeIdNœdSdT„ZrdS )Ué    N)Úcontextmanager)Úwraps)ÚPath)ÚMappingProxyType)ÚTYPE_CHECKINGÚAnyÚ	AwaitableÚCallableÚ	ContainerÚDictÚ	GeneratorÚIterableÚIteratorÚListÚMappingÚOptionalÚPatternÚSetÚSizedÚTupleÚTypeÚUnionÚcast)ÚURLÚ__version__é   )Úhdrs)ÚAbstractMatchInfoÚAbstractRouterÚAbstractView)ÚDEBUG)ÚHttpVersion11)ÚFinalÚHandlerÚPathLikeÚ	TypedDict)ÚHTTPExceptionÚHTTPExpectationFailedÚHTTPForbiddenÚHTTPMethodNotAllowedÚHTTPNotFound)ÚFileResponse)ÚRequest)ÚResponseÚStreamResponse)ÚAbstractRouteDef)
ÚUrlDispatcherÚUrlMappingMatchInfoÚAbstractResourceÚResourceÚPlainResourceÚDynamicResourceÚAbstractRouteÚResourceRouteÚStaticResourceÚView)ÚApplicationÚ.é   .ÚYARL_VERSIONz$^[0-9A-Za-z!#\$%&'\*\+\-\.\^_`\|~]+$ÚHTTP_METHOD_REz*(\{[_a-zA-Z][^{}]*(?:\{[^{}]*\}[^{}]*)*\})ÚROUTE_REú/ÚPATH_SEPr1   c                   @   sj   e Zd ZU eed< eed< ee ed< eed< eed< eedf ed< ded	< eed
< ded< eed< dS )Ú	_InfoDictÚpathÚ	formatterÚpatternÚ	directoryÚprefixr6   Úroutesr:   ÚappÚdomainÚAbstractRuleMatchingÚruleÚhttp_exceptionN)	Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__r   r   r   r&   © rS   rS   úP/var/www/html/gsl.tools/lib/python3.9/site-packages/aiohttp/web_urldispatcher.pyrB   [   s   
rB   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 )r2   N©Úname©rW   Úreturnc                C   s
   || _ d S ©N©Ú_name©ÚselfrW   rS   rS   rT   Ú__init__o   s    zAbstractResource.__init__©rY   c                 C   s   | j S rZ   r[   ©r^   rS   rS   rT   rW   r   s    zAbstractResource.namec                 C   s   dS )zWExposes the resource's canonical path.

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

        NrS   ra   rS   rS   rT   Ú	canonicalv   s    zAbstractResource.canonical)ÚkwargsrY   c                 K   s   dS )z2Construct url for resource with additional params.NrS   )r^   rc   rS   rS   rT   Úurl_for   s    zAbstractResource.url_for©ÚrequestrY   c                 Ã   s   dS )zWResolve resource.

        Return (UrlMappingMatchInfo, allowed_methods) pair.
        NrS   ©r^   rf   rS   rS   rT   Úresolveƒ   s    zAbstractResource.resolve©rG   rY   c                 C   s   dS )zWAdd a prefix to processed URLs.

        Required for subapplications support.
        NrS   ©r^   rG   rS   rS   rT   Ú
add_prefixŠ   s    zAbstractResource.add_prefixc                 C   s   dS ©z;Return a dict with additional info useful for introspectionNrS   ra   rS   rS   rT   Úget_info‘   s    zAbstractResource.get_infoc                 C   s   d S rZ   rS   ra   rS   rS   rT   Úfreeze•   s    zAbstractResource.freeze©rC   rY   c                 C   s   dS )z Perform a raw match against pathNrS   ©r^   rC   rS   rS   rT   Ú	raw_match˜   s    zAbstractResource.raw_match)rN   rO   rP   r   rQ   r_   ÚpropertyrW   ÚabcÚabstractmethodrb   r   rd   r,   Ú_Resolverh   rk   rB   rm   rn   Úboolrq   rS   rS   rS   rT   r2   n   s"   r2   r6   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ddœdd„ZdS )r6   N©Úexpect_handlerÚresource)ÚmethodÚhandlerrx   ry   rY   c                   sÚ   |d u rt }t |¡s$J d|›�ƒ‚| ¡ }t |¡sDt|› d�ƒ‚t|ƒsTJ |ƒ‚t |¡r`n^t 	|¡rxt
 dt¡ nFt|tƒrŽt|tƒrŽn0t
 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 onesre   c                 “   s    ˆ | ƒ}t  |¡r|I d H S |S rZ   )ÚasyncioÚiscoroutine)rf   Úresult©Zold_handlerrS   rT   Úhandler_wrapperÁ   s    

z/AbstractRoute.__init__.<locals>.handler_wrapper)Ú_default_expect_handlerr|   ÚiscoroutinefunctionÚupperr>   ÚmatchÚ
ValueErrorÚcallableÚinspectÚisgeneratorfunctionÚwarningsÚwarnÚDeprecationWarningÚ
isinstanceÚtypeÚ
issubclassr   r   r,   r.   Ú_methodÚ_handlerÚ_expect_handlerÚ	_resource)r^   rz   r{   rx   ry   r€   rS   r   rT   r_   ž   s>    	ÿþ


þÿzAbstractRoute.__init__r`   c                 C   s   | j S rZ   )r�   ra   rS   rS   rT   rz   Ð   s    zAbstractRoute.methodc                 C   s   | j S rZ   )r�   ra   rS   rS   rT   r{   Ô   s    zAbstractRoute.handlerc                 C   s   dS )z8Optional route's name, always equals to resource's name.NrS   ra   rS   rS   rT   rW   Ø   s    zAbstractRoute.namec                 C   s   | j S rZ   )r’   ra   rS   rS   rT   ry   Ý   s    zAbstractRoute.resourcec                 C   s   dS rl   rS   ra   rS   rS   rT   rm   á   s    zAbstractRoute.get_info©Úargsrc   rY   c                 O   s   dS ©z/Construct url for route with additional params.NrS   ©r^   r”   rc   rS   rS   rT   rd   å   s    zAbstractRoute.url_forre   c                 Ã   s   |   |¡I d H  d S rZ   )r‘   rg   rS   rS   rT   Úhandle_expect_headeré   s    z"AbstractRoute.handle_expect_header)rN   rO   rP   rQ   r   r#   r   r   r   Ú_ExpectHandlerr2   r_   rr   rz   r{   rs   rt   rW   ry   rB   rm   r   rd   r,   r—   rS   rS   rS   rT   r6   �   s.   úù2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 ) r1   )Ú
match_dictÚroutec                    s(   t ƒ  |¡ || _g | _d | _d| _d S ©NF)Úsuperr_   Ú_routeÚ_appsÚ_current_appÚ_frozen)r^   r™   rš   ©Ú	__class__rS   rT   r_   î   s
    zUrlMappingMatchInfo.__init__r`   c                 C   s   | j jS rZ   )r�   r{   ra   rS   rS   rT   r{   õ   s    zUrlMappingMatchInfo.handlerc                 C   s   | j S rZ   )r�   ra   rS   rS   rT   rš   ù   s    zUrlMappingMatchInfo.routec                 C   s   | j jS rZ   )r�   r—   ra   rS   rS   rT   rx   ý   s    z"UrlMappingMatchInfo.expect_handlerc                 C   s   d S rZ   rS   ra   rS   rS   rT   rM     s    z"UrlMappingMatchInfo.http_exceptionc                 C   s
   | j  ¡ S rZ   )r�   rm   ra   rS   rS   rT   rm     s    zUrlMappingMatchInfo.get_info)r:   .c                 C   s
   t | jƒS rZ   )Útuplerž   ra   rS   rS   rT   Úapps  s    zUrlMappingMatchInfo.appsr:   N)rI   rY   c                 C   s0   | j rtdƒ‚| jd u r|| _| j d|¡ d S )Nz-Cannot change apps stack after .freeze() callr   )r    ÚRuntimeErrorrŸ   rž   Úinsert©r^   rI   rS   rS   rT   Úadd_app  s
    
zUrlMappingMatchInfo.add_appc                 C   s   | j }|d usJ ‚|S rZ   )rŸ   r§   rS   rS   rT   Úcurrent_app  s    zUrlMappingMatchInfo.current_app)NNNc                 c   sJ   t r || jvr td | j|¡ƒ‚| j}|| _zd V  W || _n|| _0 d S )Nz1Expected one of the following apps {!r}, got {!r})r    rž   r¥   ÚformatrŸ   )r^   rI   ÚprevrS   rS   rT   Úset_current_app  s    
ÿÿz#UrlMappingMatchInfo.set_current_appc                 C   s
   d| _ d S )NT)r    ra   rS   rS   rT   rn   )  s    zUrlMappingMatchInfo.freezec                    s   dt ƒ  ¡ › d| j› d�S )Nz<MatchInfo z: ú>)rœ   Ú__repr__r�   ra   r¡   rS   rT   r®   ,  s    zUrlMappingMatchInfo.__repr__)rN   rO   rP   r   rQ   r6   r_   rr   r#   r{   rš   r˜   rx   r   r&   rM   rB   rm   r   r¤   r¨   r©   r   r   r¬   rn   r®   Ú__classcell__rS   rS   r¡   rT   r1   í   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©rM   rY   c                    s   || _ tƒ  i t| j ƒ¡ d S rZ   )Ú
_exceptionrœ   r_   ÚSystemRoute©r^   rM   r¡   rS   rT   r_   1  s    zMatchInfoError.__init__r`   c                 C   s   | j S rZ   )r²   ra   rS   rS   rT   rM   5  s    zMatchInfoError.http_exceptionc                 C   s   d  | jj| jj¡S )Nz<MatchInfoError {}: {}>)rª   r²   ÚstatusÚreasonra   rS   rS   rT   r®   9  s    ÿzMatchInfoError.__repr__)
rN   rO   rP   r&   r_   rr   rM   rQ   r®   r¯   rS   rS   r¡   rT   r°   0  s   r°   re   c                 Ã   sL   | j  tjd¡}| jtkrH| ¡ dkr:| j d¡I dH  nt	d| d�‚dS )z™Default 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'   )rf   ÚexpectrS   rS   rT   r�   ?  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e dœdd„Z‡  ZS )r3   NrV   rX   c                   s   t ƒ j|d� g | _d S )NrV   )rœ   r_   Ú_routesr]   r¡   rS   rT   r_   N  s    zResource.__init__©rx   r7   )rz   r{   rx   rY   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À   rz   r   ÚMETH_ANYr¥   rª   r7   Úregister_route)r^   rz   r{   rx   Ú	route_objrS   rS   rT   Ú	add_routeR  s    
þÿ
zResource.add_route©rš   rY   c                 C   s(   t |tƒsJ d|›�ƒ‚| j |¡ d S )Nz)Instance of Route class is required, got )rŒ   r7   rÀ   Úappend©r^   rš   rS   rS   rT   rÃ   f  s    ÿþzResource.register_routere   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 rZ   )
ÚsetÚ_matchÚrel_urlÚraw_pathrÀ   rz   Úaddr   rÂ   r1   )r^   rf   Úallowed_methodsr™   rÄ   Zroute_methodrS   rS   rT   rh   l  s    

zResource.resolvero   c                 C   s   d S rZ   rS   rp   rS   rS   rT   rÊ   |  s    zResource._matchr`   c                 C   s
   t | jƒS rZ   ©ÚlenrÀ   ra   rS   rS   rT   Ú__len__€  s    zResource.__len__c                 C   s
   t | jƒS rZ   )ÚiterrÀ   ra   rS   rS   rT   Ú__iter__ƒ  s    zResource.__iter__)rN   rO   rP   r   rQ   r_   r   r   r   r#   r˜   rÅ   rÃ   r,   ru   rh   rs   rt   r   rÊ   ÚintrÑ   r   r6   rÓ   r¯   rS   rS   r¡   rT   r3   M  s   	ûúr3   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 )r4   NrV   ©rC   rW   rY   c                   s*   t ƒ j|d� |r | d¡s J ‚|| _d S )NrV   r@   )rœ   r_   Ú
startswithÚ_path)r^   rC   rW   r¡   rS   rT   r_   Š  s    zPlainResource.__init__r`   c                 C   s   | j S rZ   ©r×   ra   rS   rS   rT   rb   �  s    zPlainResource.canonicalc                 C   s   | j sd| _ d S )Nr@   rØ   ra   rS   rS   rT   rn   “  s    zPlainResource.freezeri   c                 C   s<   |  d¡sJ ‚| d¡rJ ‚t|ƒdks,J ‚|| j | _d S ©Nr@   r   )rÖ   ÚendswithrÐ   r×   rj   rS   rS   rT   rk   —  s    zPlainResource.add_prefixro   c                 C   s   | j |kri S d S d S rZ   rØ   rp   rS   rS   rT   rÊ   �  s    
zPlainResource._matchc                 C   s
   | j |kS rZ   rØ   rp   rS   rS   rT   rq   ¤  s    zPlainResource.raw_matchc                 C   s
   d| j iS )NrC   rØ   ra   rS   rS   rT   rm   §  s    zPlainResource.get_infoc                 C   s   t j| jdd�S ©NT©rC   Úencoded)r   Úbuildr×   ra   rS   rS   rT   rd   ª  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­   )rW   r×   r]   rS   rS   rT   r®   ­  s    zPlainResource.__repr__)rN   rO   rP   rQ   r   r_   rr   rb   rn   rk   r   rÊ   rv   rq   rB   rm   r   rd   r®   r¯   rS   rS   r¡   rT   r4   ‰  s    r4   c                       sÂ   e Zd Ze d¡Ze d¡ZdZddœ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 )r5   z#\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*)\}z.\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*):(?P<re>.+)\}z[^{}/]+NrV   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 s´d|v rÊt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 )NrV   r·   z
(?P<{}>{})ÚvarÚ{Ú}z(?P<{var}>{re})zInvalid path 'z'['z']zBad pattern 'z': r@   )rœ   r_   r?   ÚsplitÚDYNÚ	fullmatchrª   ÚgroupÚGOODÚDYN_WITH_REÚ	groupdictr…   Ú_requote_pathÚreÚescapeÚcompileÚerrorrE   rÖ   rA   Ú_patternÚ
_formatter)	r^   rC   rW   rE   rD   Úpartr„   ZcompiledÚexcr¡   rS   rT   r_   ¸  s6    ,zDynamicResource.__init__r`   c                 C   s   | j S rZ   ©rò   ra   rS   rS   rT   rb   Ù  s    zDynamicResource.canonicalri   c                 C   sV   |  d¡sJ ‚| d¡rJ ‚t|ƒdks,J ‚t t |¡| jj ¡| _|| j | _d S rÙ   )	rÖ   rÚ   rÐ   rí   rï   rî   rñ   rE   rò   rj   rS   rS   rT   rk   Ý  s
    zDynamicResource.add_prefixro   c                 C   s2   | j  |¡}|d u rd S dd„ | ¡  ¡ D ƒS d S )Nc                 S   s   i | ]\}}|t |ƒ“qS rS   )Ú_unquote_path)Ú.0ÚkeyÚvaluerS   rS   rT   Ú
<dictcomp>é  s   z*DynamicResource._match.<locals>.<dictcomp>)rñ   rç   rë   Úitems)r^   rC   r„   rS   rS   rT   rÊ   ä  s    
ÿzDynamicResource._matchc                 C   s
   | j |kS rZ   rõ   rp   rS   rS   rT   rq   í  s    zDynamicResource.raw_matchc                 C   s   | j | jdœS )N)rD   rE   )rò   rñ   ra   rS   rS   rT   rm   ð  s    zDynamicResource.get_info)ÚpartsrY   c                 K   s(   | j  dd„ | ¡ D ƒ¡}tj|dd�S )Nc                 S   s   i | ]\}}|t |ƒ“qS rS   )Ú_quote_path)r÷   ÚkÚvrS   rS   rT   rú   ô  ó    z+DynamicResource.url_for.<locals>.<dictcomp>TrÜ   )rò   Ú
format_maprû   r   rÞ   )r^   rü   ÚurlrS   rS   rT   rd   ó  s    zDynamicResource.url_forc                 C   s,   | j d urd| j  d nd}dj|| jd�S )Nrß   rà   r·   z$<DynamicResource {name} {formatter}>)rW   rD   )rW   rª   rò   r]   rS   rS   rT   r®   ÷  s    ÿzDynamicResource.__repr__)rN   rO   rP   rí   rï   ræ   rê   ré   rQ   r   r_   rr   rb   rk   r   rÊ   rv   rq   rB   rm   r   rd   r®   r¯   rS   rS   r¡   rT   r5   ²  s   

 !	r5   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 )ÚPrefixResourceNrV   )rG   rW   rY   c                   sX   |r|  d¡sJ |ƒ‚|dv s0| d¡r0J |ƒ‚tƒ j|d� t|ƒ| _| jd | _d S )Nr@   )r·   r@   rV   )rÖ   rÚ   rœ   r_   rì   Ú_prefixÚ_prefix2)r^   rG   rW   r¡   rS   rT   r_   ÿ  s
    
zPrefixResource.__init__r`   c                 C   s   | j S rZ   )r  ra   rS   rS   rT   rb     s    zPrefixResource.canonicalri   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  rj   rS   rS   rT   rk   
  s
    zPrefixResource.add_prefixc                 C   s   dS r›   rS   rj   rS   rS   rT   rq     s    zPrefixResource.raw_match)rN   rO   rP   rQ   r   r_   rr   rb   rk   rv   rq   r¯   rS   rS   r¡   rT   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f ee	 ed
œdd„Zeeedœdd„ƒZedœdd„Zeddœdd„Zeedœdd„Zedœdd„Zee dœdd„Zeedœdd„Zeedœd d!„Zedœd"d#„Z ‡  Z!S )$r8   rÿ   Né   F©rW   rx   Ú
chunk_sizeÚ
show_indexÚfollow_symlinksÚappend_version)	rG   rF   rW   rx   r  r	  r
  r  rY   c          
   
      sâ   t ƒ j||d� zFt|ƒ}t|ƒ d¡r<ttj t|ƒ¡ƒ}| ¡ }| 	¡ sTt
dƒ‚W n: tt
fy� }	 zt
d|› d�ƒ|	‚W Y d }	~	n
d }	~	0 0 || _|| _|| _|| _|| _|| _td| j| |d�td| j| |d�d	œ| _d S )
NrV   ú~zNot a directoryzNo directory exists at 'rß   ÚGETrÁ   ÚHEAD)r  r  )rœ   r_   r   rQ   rÖ   ÚosrC   Ú
expanduserrh   Úis_dirr…   ÚFileNotFoundErrorÚ
_directoryÚ_show_indexÚ_chunk_sizeÚ_follow_symlinksr‘   Ú_append_versionr7   Ú_handlerÀ   )
r^   rG   rF   rW   rx   r  r	  r
  r  rð   r¡   rS   rT   r_     s.    (
ÿ
ÿüzStaticResource.__init__)r  )Úfilenamer  rY   c             	   C   sþ   |d u r| j }t|tƒr t|ƒ}| d¡}tj| jdd�}tdk rT|| 	dd¡ }n|| }|rúz&| j
 |¡ ¡ }| js„| | j
¡ W n ttfy    | Y S 0 | ¡ rú| d¡�}| ¡ }W d   ƒ n1 sÒ0    Y  |  |¡}| | j|i¡}|S |S )Nr@   TrÜ   ©r   é   ú%ú%25Úrb)r  rŒ   r   rQ   Úlstripr   rÞ   r  r=   Úreplacer  Újoinpathrh   r  Úrelative_tor…   r  Úis_fileÚopenÚreadÚ_get_file_hashZ
with_queryÚVERSION_KEY)r^   r  r  r  ÚfilepathÚfZ
file_bytesÚhrS   rS   rT   rd   @  s.    


&
zStaticResource.url_for)Ú
byte_arrayrY   c                 C   s*   t  ¡ }| | ¡ t | ¡ ¡}| d¡S )NÚascii)ÚhashlibÚsha256ÚupdateÚbase64Úurlsafe_b64encodeÚdigestÚdecode)r+  ÚmZb64rS   rS   rT   r&  f  s    
zStaticResource._get_file_hashr`   c                 C   s   | j | j| jdœS )N)rF   rG   rH   )r  r  rÀ   ra   rS   rS   rT   rm   m  s    ýzStaticResource.get_info)r{   rY   c                 C   s.   d| j v rtdƒ‚td|| | jd�| j d< d S )NÚOPTIONSzOPTIONS route was set alreadyrÁ   )rÀ   r¥   r7   r‘   )r^   r{   rS   rS   rT   Úset_options_routet  s
    

ÿz StaticResource.set_options_routere   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Ì   rz   rÉ   rÀ   rÖ   r  r  rö   rÐ   r1   )r^   rf   rC   rz   rÎ   r™   rS   rS   rT   rh   {  s    

zStaticResource.resolvec                 C   s
   t | jƒS rZ   rÏ   ra   rS   rS   rT   rÑ   ˆ  s    zStaticResource.__len__c                 C   s   t | j ¡ ƒS rZ   )rÒ   rÀ   Úvaluesra   rS   rS   rT   rÓ   ‹  s    zStaticResource.__iter__c              
   Ã   s,  |j d }z:t|ƒ}|jr tƒ ‚| j |¡ ¡ }| jsB| | j¡ W nz t	t
fyt } ztƒ |‚W Y d }~nTd }~0  ty†   ‚ Y n: ty¾ } z"|jj |¡ tƒ |‚W Y d }~n
d }~0 0 | ¡ �r| j�rzt|  |¡dd�W S  t�y    tƒ ‚Y n0 ntƒ ‚n| ¡ �r$t|| jd�S t‚d S )Nr  z	text/html)r¸   Úcontent_type)r  )Ú
match_infor   Úanchorr(   r  r!  rh   r  r"  r…   r  r*   Ú	ExceptionrI   ÚloggerÚ	exceptionr  r  r-   Ú_directory_as_htmlÚPermissionErrorr#  r+   r  )r^   rf   rË   r  r(  rð   rS   rS   rT   r  Ž  s6    


ÿ
zStaticResource._handle)r(  rY   c                 C   sÞ   |  ¡ sJ ‚| | j¡ ¡ }d|› �}d|› d�}g }| ¡ }t|ƒD ]R}| | j¡ ¡ }| jd | }	|  ¡ r~|j› d�}
n|j}
| dj	|	|
d�¡ qFd 	d 
|¡¡}d	|› d|› d
�}d|› d�}d|› d|› d�}|S )Nz
Index of /z<h1>z</h1>r@   z#<li><a href="{url}">{name}</a></li>)r  rW   z<ul>
{}
</ul>Ú
z<body>
z
</body>z<head>
<title>z</title>
</head>z<html>
z
</html>)r  r"  r  Úas_posixÚiterdirÚsortedr  rW   rÇ   rª   Újoin)r^   r(  Zrelative_path_to_dirZindex_ofÚh1Z
index_listZ	dir_indexÚ_fileÚrel_pathZfile_urlÚ	file_nameÚulÚbodyZhead_strÚhtmlrS   rS   rT   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}>)rW   rC   rF   )rW   rª   r  r  r]   rS   rS   rT   r®   Ø  s    
ÿzStaticResource.__repr__)"rN   rO   rP   r'  rQ   r$   r   r˜   rÔ   rv   r_   r   r   r   rd   ÚstaticmethodÚbytesr&  rB   rm   r#   r6  r,   ru   rh   rÑ   r   r6   rÓ   r.   r  r>  r®   r¯   rS   rS   r¡   rT   r8     sD   öõ*ü
û&&$r8   c                       s˜   e Zd Zedddœ‡ fdd„Zeddœ‡ fdd„Zeeed	œd
d„Zedœdd„Z	e
edœdd„Zedœdd„Zee dœdd„Zedœdd„Z‡  ZS )ÚPrefixedSubAppResourcer:   N)rG   rI   rY   c                    s0   t ƒ  |¡ || _|j ¡ D ]}| |¡ qd S rZ   )rœ   r_   Ú_appÚrouterÚ	resourcesrk   )r^   rG   rI   ry   r¡   rS   rT   r_   à  s    zPrefixedSubAppResource.__init__ri   c                    s,   t ƒ  |¡ | jj ¡ D ]}| |¡ qd S rZ   )rœ   rk   rO  rP  rQ  )r^   rG   ry   r¡   rS   rT   rk   æ  s    z!PrefixedSubAppResource.add_prefixr“   c                 O   s   t dƒ‚d S )Nz3.url_for() is not supported by sub-application root©r¥   r–   rS   rS   rT   rd   ë  s    zPrefixedSubAppResource.url_forr`   c                 C   s   | j | jdœS )N)rI   rG   )rO  r  ra   rS   rS   rT   rm   î  s    zPrefixedSubAppResource.get_infore   c                 Ã   sl   |j j | j¡s(|j j| jkr(d tƒ fS | jj |¡I d H }| 	| j¡ t
|jtƒr^|jj}ntƒ }||fS rZ   )r  rÌ   rÖ   r  r  rÉ   rO  rP  rh   r¨   rŒ   rM   r)   rÎ   ©r^   rf   r9  ÚmethodsrS   rS   rT   rh   ñ  s    ÿþ

zPrefixedSubAppResource.resolvec                 C   s   t | jj ¡ ƒS rZ   )rÐ   rO  rP  rH   ra   rS   rS   rT   rÑ   ÿ  s    zPrefixedSubAppResource.__len__c                 C   s   t | jj ¡ ƒS rZ   )rÒ   rO  rP  rH   ra   rS   rS   rT   rÓ     s    zPrefixedSubAppResource.__iter__c                 C   s   dj | j| jd�S )Nz,<PrefixedSubAppResource {prefix} -> {app!r}>)rG   rI   )rª   r  rO  ra   rS   rS   rT   r®     s    ÿzPrefixedSubAppResource.__repr__)rN   rO   rP   rQ   r_   rk   r   rd   rB   rm   r,   ru   rh   rÔ   rÑ   r   r6   rÓ   r®   r¯   rS   rS   r¡   rT   rN  ß  s   rN  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 )
rK   re   c                 Ã   s   dS )z1Return bool if the request satisfies the criteriaNrS   rg   rS   rS   rT   r„     s    zAbstractRuleMatching.matchr`   c                 C   s   dS rl   rS   ra   rS   rS   rT   rm     s    zAbstractRuleMatching.get_infoc                 C   s   dS )zReturn a strNrS   ra   rS   rS   rT   rb     s    zAbstractRuleMatching.canonicalN)rN   rO   rP   rs   rt   r,   rv   r„   rB   rm   rr   rQ   rb   rS   rS   rS   rT   rK     s   rK   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©rJ   rY   c                    s   t ƒ  ¡  |  |¡| _d S rZ   )rœ   r_   Ú
validationÚ_domain)r^   rJ   r¡   rS   rT   r_     s    
zDomain.__init__r`   c                 C   s   | j S rZ   ©rX  ra   rS   rS   rT   rb   !  s    zDomain.canonicalc                    s    t |tƒstdƒ‚| d¡ ¡ }|s.tdƒ‚nd|v r>tdƒ‚td| ƒ}|jd usXJ ‚t‡ fdd„|j 	d¡D ƒƒs~td	ƒ‚|j
d
krŽ|jS |j› d|j
› �S )NzDomain must be strr;   zDomain cannot be emptyz://zScheme not supportedzhttp://c                 3   s   | ]}ˆ j  |¡V  qd S rZ   )Úre_partrç   )r÷   Úxra   rS   rT   Ú	<genexpr>/  r   z$Domain.validation.<locals>.<genexpr>zDomain not validéP   ú:)rŒ   rQ   Ú	TypeErrorÚrstripr¼   r…   r   Zraw_hostÚallrå   Úport)r^   rJ   r  rS   ra   rT   rW  %  s    


zDomain.validationre   c                 Ã   s    |j  tj¡}|sdS |  |¡S r›   )r¹   rº   r   ZHOSTÚmatch_domain)r^   rf   ÚhostrS   rS   rT   r„   5  s    zDomain.match©rd  rY   c                 C   s   |  ¡ | jkS rZ   )r¼   rX  ©r^   rd  rS   rS   rT   rc  ;  s    zDomain.match_domainc                 C   s
   d| j iS )NrJ   rY  ra   rS   rS   rT   rm   >  s    zDomain.get_info)rN   rO   rP   rí   rï   rZ  rQ   r_   rr   rb   rW  r,   rv   r„   rc  rB   rm   r¯   rS   rS   r¡   rT   rU    s   
rU  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}(?<!-)NrV  c                    s2   t ƒ  |¡ | j dd¡ dd¡}t |¡| _d S )Nr;   z\.Ú*z.*)rœ   r_   rX  r   rí   rï   Ú_mask)r^   rJ   Úmaskr¡   rS   rT   r_   E  s    zMaskDomain.__init__r`   c                 C   s   | j jS rZ   )ri  rE   ra   rS   rS   rT   rb   J  s    zMaskDomain.canonicalre  c                 C   s   | j  |¡d uS rZ   )ri  rç   rf  rS   rS   rT   rc  N  s    zMaskDomain.match_domain)rN   rO   rP   rí   rï   rZ  rQ   r_   rr   rb   rv   rc  r¯   rS   rS   r¡   rT   rg  B  s
   
rg  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)rL   rI   rY   c                 C   s    t  | ¡ d| _|| _|| _d S )Nr·   )r2   r_   r  rO  Ú_rule)r^   rL   rI   rS   rS   rT   r_   S  s    
zMatchedSubAppResource.__init__r`   c                 C   s   | j jS rZ   )rl  rb   ra   rS   rS   rT   rb   Y  s    zMatchedSubAppResource.canonicalc                 C   s   | j | jdœS )N)rI   rL   )rO  rl  ra   rS   rS   rT   rm   ]  s    zMatchedSubAppResource.get_infore   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 rZ   )rl  r„   rÉ   rO  rP  rh   r¨   rŒ   rM   r)   rÎ   rS  rS   rS   rT   rh   `  s    

zMatchedSubAppResource.resolvec                 C   s   dj | jd�S )Nz"<MatchedSubAppResource -> {app!r}>)rI   )rª   rO  ra   rS   rS   rT   r®   k  s    zMatchedSubAppResource.__repr__)rN   rO   rP   rK   r_   rr   rQ   rb   rB   rm   r,   ru   rh   r®   rS   rS   rS   rT   rk  R  s   rk  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 )r7   zA route with resourceNrÁ   )rz   r{   ry   rx   rY   c                   s   t ƒ j||||d� d S )Nrw   )rœ   r_   )r^   rz   r{   ry   rx   r¡   rS   rT   r_   r  s    ÿzResourceRoute.__init__r`   c                 C   s   dj | j| j| jd�S )Nz3<ResourceRoute [{method}] {resource} -> {handler!r})rz   ry   r{   )rª   rz   r’   r{   ra   rS   rS   rT   r®   ~  s    ÿzResourceRoute.__repr__c                 C   s   | j d u rd S | j jS rZ   )r’   rW   ra   rS   rS   rT   rW   ƒ  s    
zResourceRoute.namer“   c                 O   s    | j dusJ ‚| j j|i |¤ŽS r•   )r’   rd   r–   rS   rS   rT   rd   ‰  s    zResourceRoute.url_forc                 C   s   | j d usJ ‚| j  ¡ S rZ   )r’   rm   ra   rS   rS   rT   rm   Ž  s    zResourceRoute.get_info)rN   rO   rP   Ú__doc__rQ   r   r#   r   r   r2   r   r˜   r_   r®   rr   rW   r   rd   rB   rm   r¯   rS   rS   r¡   rT   r7   o  s   úùr7   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 rZ   )rœ   r_   r   rÂ   r  Ú_http_exceptionr´   r¡   rS   rT   r_   ”  s    zSystemRoute.__init__r“   c                 O   s   t dƒ‚d S )Nz).url_for() is not allowed for SystemRouterR  r–   rS   rS   rT   rd   ˜  s    zSystemRoute.url_forr`   c                 C   s   d S rZ   rS   ra   rS   rS   rT   rW   ›  s    zSystemRoute.namec                 C   s
   d| j iS )NrM   ©rn  ra   rS   rS   rT   rm   Ÿ  s    zSystemRoute.get_infore   c                 Ã   s
   | j ‚d S rZ   ro  rg   rS   rS   rT   r  ¢  s    zSystemRoute._handlec                 C   s   | j jS rZ   )rn  rµ   ra   rS   rS   rT   rµ   ¥  s    zSystemRoute.statusc                 C   s   | j jS rZ   )rn  r¶   ra   rS   rS   rT   r¶   ©  s    zSystemRoute.reasonc                 C   s   dj | d�S )Nz*<SystemRoute {self.status}: {self.reason}>ra   )rª   ra   rS   rS   rT   r®   ­  s    zSystemRoute.__repr__)rN   rO   rP   r&   r_   rQ   r   rd   rr   r   rW   rB   rm   r,   r.   r  rÔ   rµ   r¶   r®   r¯   rS   rS   r¡   rT   r³   “  s   r³   c                   @   s@   e Zd Zedœdd„Zeedef dœdd„Zddœdd„ZdS )	r9   r`   c                 Ã   sJ   | j jtjvr|  ¡  t| | j j ¡ d ƒ}|d u r:|  ¡  |ƒ I d H }|S rZ   )rf   rz   r   ÚMETH_ALLÚ_raise_allowed_methodsÚgetattrr¼   )r^   rz   ÚresprS   rS   rT   Ú_iter²  s    ÿz
View._iterNc                 C   s   |   ¡  ¡ S rZ   )rt  Ú	__await__ra   rS   rS   rT   ru  ½  s    zView.__await__c                    s&   ‡ fdd„t jD ƒ}tˆ jj|ƒ‚d S )Nc                    s   h | ]}t ˆ | ¡ ƒr|’qS rS   )Úhasattrr¼   )r÷   r4  ra   rS   rT   Ú	<setcomp>Á  r   z.View._raise_allowed_methods.<locals>.<setcomp>)r   rp  r)   rf   rz   )r^   rÎ   rS   ra   rT   rq  À  s    zView._raise_allowed_methods)	rN   rO   rP   r.   rt  r   r   ru  rq  rS   rS   rS   rT   r9   ±  s   r9   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)rQ  rY   c                 C   s
   || _ d S rZ   ©Ú
_resources)r^   rQ  rS   rS   rT   r_   Æ  s    zResourcesView.__init__r`   c                 C   s
   t | jƒS rZ   )rÐ   rz  ra   rS   rS   rT   rÑ   É  s    zResourcesView.__len__c                 c   s   | j E d H  d S rZ   ry  ra   rS   rS   rT   rÓ   Ì  s    zResourcesView.__iter__©ry   rY   c                 C   s
   || j v S rZ   ry  ©r^   ry   rS   rS   rT   Ú__contains__Ï  s    zResourcesView.__contains__)rN   rO   rP   r   r2   r_   rÔ   rÑ   r   rÓ   Úobjectrv   r}  rS   rS   rS   rT   rx  Å  s   rx  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)rQ  c                 C   s*   g | _ |D ]}|D ]}| j  |¡ qq
d S rZ   )rÀ   rÇ   )r^   rQ  ry   rš   rS   rS   rT   r_   Ô  s    zRoutesView.__init__r`   c                 C   s
   t | jƒS rZ   rÏ   ra   rS   rS   rT   rÑ   Ú  s    zRoutesView.__len__c                 c   s   | j E d H  d S rZ   ©rÀ   ra   rS   rS   rT   rÓ   Ý  s    zRoutesView.__iter__rÆ   c                 C   s
   || j v S rZ   r€  rÈ   rS   rS   rT   r}  à  s    zRoutesView.__contains__N)rN   rO   rP   r   r2   r_   rÔ   rÑ   r   r6   rÓ   r~  rv   r}  rS   rS   rS   rT   r  Ó  s   r  c                       s"  e Zd Ze d¡Zddœ‡ fdd„Zeedœdd„Z	e
e dœd	d
„Zedœdd„Zeedœdd„Zeedœdd„Zedœdd„Zedœdd„Zeeef dœdd„Zeddœdd„Zddœeee edœdd„Zdddœeeeee e! f ee ee" e#d œd!d"„Z$ddd#d$d$d$d%œee%ee ee" eeeeed&œ	d'd(„Z&eee'e#d)œd*d+„Z(eee'e#d)œd,d-„Z)dd.d/œeeee ee'e#d0œd1d2„Z*eee'e#d)œd3d4„Z+eee'e#d)œd5d6„Z,eee'e#d)œd7d8„Z-eee'e#d)œd9d:„Z.ee e! e'e#d)œd;d<„Z/ddœ‡ fd=d>„Z0e1e2 e3e# d?œd@dA„Z4‡  Z5S )Br0   z[.:-]Nr`   c                    s   t ƒ  ¡  g | _i | _d S rZ   )rœ   r_   rz  Ú_named_resourcesra   r¡   rS   rT   r_   è  s    
zUrlDispatcher.__init__re   c                 Ã   sd   |j }tƒ }| jD ]0}| |¡I d H \}}|d ur:|  S ||O }q|rVtt||ƒƒS ttƒ ƒS d S rZ   )rz   rÉ   rz  rh   r°   r)   r*   )r^   rf   rz   rÎ   ry   r™   ÚallowedrS   rS   rT   rh   í  s    

zUrlDispatcher.resolvec                 C   s
   t | jƒS rZ   )rÒ   r�  ra   rS   rS   rT   rÓ   ý  s    zUrlDispatcher.__iter__c                 C   s
   t | jƒS rZ   )rÐ   r�  ra   rS   rS   rT   rÑ      s    zUrlDispatcher.__len__r{  c                 C   s
   || j v S rZ   ©r�  r|  rS   rS   rT   r}    s    zUrlDispatcher.__contains__rX   c                 C   s
   | j | S rZ   rƒ  r]   rS   rS   rT   Ú__getitem__  s    zUrlDispatcher.__getitem__c                 C   s
   t | jƒS rZ   )rx  rz  ra   rS   rS   rT   rQ  	  s    zUrlDispatcher.resourcesc                 C   s
   t | jƒS rZ   )r  rz  ra   rS   rS   rT   rH     s    zUrlDispatcher.routesc                 C   s
   t | jƒS rZ   )r   r�  ra   rS   rS   rT   Únamed_resources  s    zUrlDispatcher.named_resourcesc                 C   s´   t |tƒsJ d|›�ƒ‚| jr&tdƒ‚|j}|d ur¤| j |¡}|D ]4}t |¡rbt	d|›d�ƒ‚| 
¡ sDt	d |¡ƒ‚qD|| jv ršt	d || j| ¡ƒ‚|| j|< | j |¡ d S )Nz4Instance of AbstractResource class is required, got z.Cannot register a resource into frozen router.zIncorrect route name z/, python keywords cannot be used for route namezoIncorrect route name {!r}, the name should be a sequence of python identifiers separated by dash, dot or columnz'Duplicate {!r}, already handled by {!r})rŒ   r2   Úfrozenr¥   rW   ÚNAME_SPLIT_RErå   ÚkeywordÚ	iskeywordr…   Úisidentifierrª   r�  rz  rÇ   )r^   ry   rW   rü   ró   rS   rS   rT   Úregister_resource  s:    ÿþ

ÿýÿ

ÿÿ
zUrlDispatcher.register_resourcerV   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 )Nr@   z)path should be started with / or be emptyéÿÿÿÿrã   rä   rV   )rÖ   r…   rz  rW   rq   r   r3   r?   Úsearchr4   rì   r‹  r5   )r^   rC   rW   ry   rS   rS   rT   Úadd_resource3  s    



zUrlDispatcher.add_resource)rW   rx   )rz   rC   r{   rW   rx   rY   c                C   s   | j ||d�}|j|||d�S )NrV   rÁ   )rŽ  rÅ   )r^   rz   rC   r{   rW   rx   ry   rS   rS   rT   rÅ   C  s    	zUrlDispatcher.add_router  Fr  )	rG   rC   rW   rx   r  r	  r
  r  rY   c          
   
   C   sJ   |  d¡sJ ‚| d¡r$|dd… }t||||||||d�}	|  |	¡ |	S )z^Add static files view.

        prefix - url prefix
        path - folder with files

        r@   NrŒ  r  )rÖ   rÚ   r8   r‹  )
r^   rG   rC   rW   rx   r  r	  r
  r  ry   rS   rS   rT   Ú
add_staticO  s    
ø

zUrlDispatcher.add_static)rC   r{   rc   rY   c                 K   s   | j tj||fi |¤ŽS )z(Shortcut for add_route with method HEAD.)rÅ   r   Ú	METH_HEAD©r^   rC   r{   rc   rS   rS   rT   Úadd_headq  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‘  rS   rS   rT   Úadd_optionsu  s    zUrlDispatcher.add_optionsT)rW   Ú
allow_head)rC   r{   rW   r”  rc   rY   c                K   s>   | j ||d�}|r(|jtj|fi |¤Ž |jtj|fi |¤ŽS )zœShortcut for add_route with method GET.

        If allow_head is true, another
        route is added allowing head requests to the same endpoint.
        rV   )rŽ  rÅ   r   r�  ZMETH_GET)r^   rC   r{   rW   r”  rc   ry   rS   rS   rT   Úadd_gety  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‘  rS   rS   rT   Ú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‘  rS   rS   rT   Ú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‘  rS   rS   rT   Ú	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‘  rS   rS   rT   Ú
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‘  rS   rS   rT   Úadd_viewœ  s    zUrlDispatcher.add_viewc                    s"   t ƒ  ¡  | jD ]}| ¡  qd S rZ   )rœ   rn   rz  r|  r¡   rS   rT   rn   ¢  s    

zUrlDispatcher.freeze)rH   rY   c                 C   s"   g }|D ]}|  | | ¡¡ q|S )z¢Append routes to route table.

        Parameter should be a sequence of RouteDef objects.

        Returns a list of registered AbstractRoute instances.
        )ÚextendÚregister)r^   rH   Zregistered_routesZ	route_defrS   rS   rT   Ú
add_routes§  s    zUrlDispatcher.add_routes)6rN   rO   rP   rí   rï   r‡  r_   r,   r1   rh   r   rQ   rÓ   rÔ   rÑ   r~  rv   r}  r2   r„  rx  rQ  r  rH   r   r…  r‹  r   r3   rŽ  r   r#   r   r   r˜   r6   rÅ   r$   r�  r   r’  r“  r•  r–  r—  r˜  r™  rš  rn   r   r/   r   r�  r¯   rS   rS   r¡   rT   r0   ä  sx   
!ùøöõ"	úø
þr0   )rù   rY   c                 C   s$   t dk r|  dd¡} tj| dd�jS )Nr  r  r  FrÜ   )r=   r   r   rÞ   rÌ   ©rù   rS   rS   rT   rý   ´  s    rý   c                 C   s   t j| dd�jS rÛ   )r   rÞ   rC   rž  rS   rS   rT   rö   º  s    rö   c                 C   s    t | ƒ}d| v r| dd¡}|S )Nr  r  )rý   r   )rù   r~   rS   rS   rT   rì   ¾  s    rì   )srs   r|   r0  r-  r‡   rˆ  r  rí   r‰   Ú
contextlibr   Ú	functoolsr   Úpathlibr   Útypesr   Útypingr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zyarlr   r   Zyarl_versionr·   r   r   r   r   Zhelpersr    Úhttpr!   Ztypedefsr"   r#   r$   r%   Zweb_exceptionsr&   r'   r(   r)   r*   Zweb_fileresponser+   Zweb_requestr,   Zweb_responser-   r.   Zweb_routedefr/   Ú__all__Zweb_appr:   rQ   ZBaseDictÚdictr£   ÚmaprÔ   rå   r=   rR   rï   r>   r?   rî   rA   r˜   ru   rB   r2   ÚABCr6   r1   r°   r�   r3   r4   r5   r  r8   rN  rK   rU  rg  rk  r7   r³   r9   rx  r  r0   rý   rö   rì   rS   rS   rS   rT   Ú<module>   s„   
T0ÿÿ/PC<)L I,($ Q