B `l@sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z ddl mZddlmZddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ddl%m&Z&ddl'm(Z(m)Z*d d l+m,Z,d d lm-Z-m.Z.m/Z/d d l0m1Z1d d l2m3Z3d dl4m5Z5d dl6m7Z7m8Z8m9Z9m:Z:m;Z;d dlm?Z?d dl@mAZAmBZBd dlCmDZDdZEerd dlFmGZGeeHeHfZIneJZIeKeLeMe*NdddZOePdZQePdZReSdZTee?geeBfZUee?gedfZVe!ee-eeHfZWGddde&ddZXGdd d e ed!ZYGd"d!d!ejZZ[Gd#d$d$eIe-Z\Gd%d&d&e\Z]e?dd'd(d)Z^Gd*d+d+eYZ_Gd,d-d-e_Z`Gd.d/d/e_ZaGd0d1d1eYZbGd2d3d3ebZcGd4d5d5ebZdGd6d7d7ejZZeGd8d9d9eeZfGd:d;d;efZgGdd?d?e[ZiGd@dAdAe[ZjGdBdCdCe/ZkGdDdEdEe eeYeeYZlGdFdGdGe ee[ee[ZmGdHdIdIe.eeHeYfZneHeHdJdKdLZoeHeHdJdMdNZpeHeHdJdOdPZqdS)QN)contextmanager)wraps)Path)MappingProxyType) TYPE_CHECKINGAny AwaitableCallable ContainerDict GeneratorIterableIteratorListMappingOptionalPatternSetSizedTupleTypeUnioncast) TypedDict)URL __version__)hdrs)AbstractMatchInfoAbstractRouter AbstractView)DEBUG) HttpVersion11)PathLike) HTTPExceptionHTTPExpectationFailed HTTPForbiddenHTTPMethodNotAllowed HTTPNotFound) FileResponse)Request)ResponseStreamResponse)AbstractRouteDef) UrlDispatcherUrlMappingMatchInfoAbstractResourceResource PlainResourceDynamicResource AbstractRoute ResourceRouteStaticResourceView) Application.z$^[0-9A-Za-z!#\$%&'\*\+\-\.\^_`\|~]+$z*(\{[_a-zA-Z][^{}]*(?:\{[^{}]*\}[^{}]*)*\})/c@sjeZdZUeed<eed<eeed<eed<eed<eedfed<ded <eed <d ed <eed <dS) _InfoDictpath formatterpattern directoryprefixr4routesr8appdomainAbstractRuleMatchingrulehttp_exceptionN) __name__ __module__ __qualname__str__annotations__rrrr$rMrMt/private/var/folders/7j/8686xlfs15q3tgljmghtvg0r0000gn/T/pip-target-isidps9b/lib/python/aiohttp/web_urldispatcher.pyr<Ys  r<F)totalc@seZdZddeeddddZeeedddZeej edd d Z ej ee d d d Z ej e edddZej eddddZej edddZddddZej eedddZdS)r0N)name)rPreturncCs ||_dS)N)_name)selfrPrMrMrN__init__mszAbstractResource.__init__)rQcCs|jS)N)rR)rSrMrMrNrPpszAbstractResource.namecCsdS)zWExposes the resource's canonical path. For example '/foo/bar/{name}' NrM)rSrMrMrN canonicaltszAbstractResource.canonical)kwargsrQcKsdS)z2Construct url for resource with additional params.NrM)rSrVrMrMrNurl_for}szAbstractResource.url_for)requestrQcsdS)zMResolve resource Return (UrlMappingMatchInfo, allowed_methods) pair.NrM)rSrXrMrMrNresolveszAbstractResource.resolve)rArQcCsdS)zXAdd a prefix to processed URLs. Required for subapplications support. NrM)rSrArMrMrN add_prefixszAbstractResource.add_prefixcCsdS)z;Return a dict with additional info useful for introspectionNrM)rSrMrMrNget_infoszAbstractResource.get_infocCsdS)NrM)rSrMrMrNfreezeszAbstractResource.freeze)r=rQcCsdS)z Perform a raw match against pathNrM)rSr=rMrMrN raw_matchszAbstractResource.raw_match)rHrIrJrrKrTpropertyrPabcabstractmethodrUrrWr*_ResolverYrZr<r[r\boolr]rMrMrMrNr0ls"r0r4c@seZdZdddeeeeefee ee ddddZ e edddZ e edd d Ze ejeedd d Ze ee dd dZejedddZejeeedddZeddddZdS)r4N)expect_handlerresource)methodhandlerrcrdrQcs|dkr t}t|s$td||}t|sDt|dt|sTt|t|r`n^t |rxt dt nFt|trt|trn0t dt t|ttdfdd }||}||_||_||_||_dS)NzCoroutine is expected, got z is not allowed HTTP methodz6Bare generators are deprecated, use @coroutine wrapperz-Bare functions are deprecated, use async ones)rXrQcs |}t|r|IdHS|S)N)asyncio iscoroutine)rXresult) old_handlerrMrNhandler_wrappers  z/AbstractRoute.__init__..handler_wrapper)_default_expect_handlerrgiscoroutinefunctionAssertionErrorupperHTTP_METHOD_REmatch ValueErrorcallableinspectisgeneratorfunctionwarningswarnDeprecationWarning isinstancetype issubclassr rr*r,_method_handler_expect_handler _resource)rSrerfrcrdrkrM)rjrNrTs6     zAbstractRoute.__init__)rQcCs|jS)N)r|)rSrMrMrNreszAbstractRoute.methodcCs|jS)N)r})rSrMrMrNrfszAbstractRoute.handlercCsdS)z8Optional route's name, always equals to resource's name.NrM)rSrMrMrNrPszAbstractRoute.namecCs|jS)N)r)rSrMrMrNrdszAbstractRoute.resourcecCsdS)z;Return a dict with additional info useful for introspectionNrM)rSrMrMrNr[szAbstractRoute.get_info)argsrVrQcOsdS)z/Construct url for route with additional params.NrM)rSrrVrMrMrNrWszAbstractRoute.url_for)rXrQcs||IdHdS)N)r~)rSrXrMrMrNhandle_expect_headersz"AbstractRoute.handle_expect_header)rHrIrJrKr _WebHandlerrr r_ExpectHandlerr0rTr^rerfr_r`rPrdr<r[rrWr*rrMrMrMrNr4s""+cseZdZeeefedfdd ZeedddZ eedddZ ee dd d Z ee edd d Zedd dZeeddddZdddddZeddddZededdddZddddZedfdd ZZS) r/) match_dictroutecs(t|||_g|_d|_d|_dS)NF)superrT_route_apps _current_app_frozen)rSrr) __class__rMrNrTs  zUrlMappingMatchInfo.__init__)rQcCs|jjS)N)rrf)rSrMrMrNrfszUrlMappingMatchInfo.handlercCs|jS)N)r)rSrMrMrNrszUrlMappingMatchInfo.routecCs|jjS)N)rr)rSrMrMrNrcsz"UrlMappingMatchInfo.expect_handlercCsdS)NrM)rSrMrMrNrGsz"UrlMappingMatchInfo.http_exceptioncCs |jS)N)rr[)rSrMrMrNr[szUrlMappingMatchInfo.get_info)r8.cCs t|jS)N)tupler)rSrMrMrNappsszUrlMappingMatchInfo.appsr8N)rCrQcCs0|jrtd|jdkr||_|jd|dS)Nz-Cannot change apps stack after .freeze() callr)r RuntimeErrorrrinsert)rSrCrMrMrNadd_app s  zUrlMappingMatchInfo.add_appcCs|j}|dk st|S)N)rrn)rSrCrMrMrN current_apps zUrlMappingMatchInfo.current_app)NNNccsDtr ||jkr td|j||j}||_z dVWd||_XdS)Nz1Expected one of the following apps {!r}, got {!r})r!rrformatr)rSrCprevrMrMrNset_current_apps   z#UrlMappingMatchInfo.set_current_appcCs d|_dS)NT)r)rSrMrMrNr\'szUrlMappingMatchInfo.freezecsdtd|jdS)Nz )r__repr__r)rS)rrMrNr*szUrlMappingMatchInfo.__repr__)rHrIrJr rKr4rTr^rrfrrrcrr$rGr<r[rrrrrr rr\r __classcell__rMrM)rrNr/s&r/csDeZdZeddfdd ZeedddZeddd ZZ S) MatchInfoErrorN)rGrQcs||_tit|jdS)N) _exceptionrrT SystemRoute)rSrG)rrMrNrT/szMatchInfoError.__init__)rQcCs|jS)N)r)rSrMrMrNrG3szMatchInfoError.http_exceptioncCsd|jj|jjS)Nz)rrstatusreason)rSrMrMrNr7szMatchInfoError.__repr__) rHrIrJr$rTr^rGrKrrrMrM)rrNr.sr)rXrQcsL|jtjd}|jtkrH|dkr:|jdIdHnt d|ddS)zDefault handler for Expect header. Just send "100 Continue" to client. raise HTTPExpectationFailed if value of header is not "100-continue" z 100-continuesHTTP/1.1 100 Continue NzUnknown Expect: %s)text) headersgetrZEXPECTversionr"lowerwriterwriter%)rXexpectrMrMrNrl=s   rlcseZdZddeeddfddZddeeeee fee ddd d Z ddd d d Z e edddZejeeeeefdddZedddZeedddZZS)r1N)rP)rPrQcstj|dg|_dS)N)rP)rrT_routes)rSrP)rrMrNrTLszResource.__init__)rcr5)rerfrcrQcCsTx4|jD]*}|j|ks"|jtjkrtdj|dqWt||||d}|||S)NzOAdded route will never be executed, method {route.method} is already registered)r)rc)rrerMETH_ANYrrr5register_route)rSrerfrc route_objrMrMrN add_routePs  zResource.add_route)rrQcCs(t|tstd||j|dS)Nz)Instance of Route class is required, got )ryr5rnrappend)rSrrMrMrNrds  zResource.register_route)rXrQcsrt}||jj}|dkr$d|fSxH|jD]6}|j}||||jksT|tjkr,t |||fSq,Wd|fSdS)N) set_matchrel_urlraw_pathrreaddrrr/)rSrXallowed_methodsrrZ route_methodrMrMrNrYjs  zResource.resolve)r=rQcCsdS)NrM)rSr=rMrMrNrzszResource._match)rQcCs t|jS)N)lenr)rSrMrMrN__len__~szResource.__len__cCs t|jS)N)iterr)rSrMrMrN__iter__szResource.__iter__)rHrIrJrrKrTrrr rrrrr*rarYr_r`r rintrrr4rrrMrM)rrNr1Ks r1cseZdZddeeeddfddZeedddZddd d Zedd d d Z eee eefdddZ ee dddZ edddZedddZedddZZS)r2N)rP)r=rPrQcs*tj|d|r |ds t||_dS)N)rPr;)rrT startswithrn_path)rSr=rP)rrMrNrTszPlainResource.__init__)rQcCs|jS)N)r)rSrMrMrNrUszPlainResource.canonicalcCs|js d|_dS)Nr;)r)rSrMrMrNr\szPlainResource.freeze)rArQcCs<|dst|drtt|dks,t||j|_dS)Nr;r)rrnendswithrr)rSrArMrMrNrZszPlainResource.add_prefix)r=rQcCs|j|kriSdSdS)N)r)rSr=rMrMrNrs zPlainResource._matchcCs |j|kS)N)r)rSr=rMrMrNr]szPlainResource.raw_matchcCs d|jiS)Nr=)r)rSrMrMrNr[szPlainResource.get_infocCstj|jddS)NT)r=encoded)rbuildr)rSrMrMrNrWszPlainResource.url_forcCs0|jdk rd|jdnd}d|d|jdS)N'z' rz[_a-zA-Z][_a-zA-Z0-9]*)\}z.\{(?P[_a-zA-Z][_a-zA-Z0-9]*):(?P.+)\}z[^{}/]+N)rP)r=rPrQc shtj|dd}d}xt|D]}|j|}|rf|d|d|j7}|d|dd7}q"|j |}|r|djf| 7}|d|dd7}q"d|ksd|krt d|d |d t |}||7}|t |7}q"Wyt |}Wn<t jk r4}zt d |d |dWdd}~XYnX|jtsHt|d sXt||_||_dS)N)rPrz (?P<{}>{})var{}z(?P<{var}>{re})zInvalid path 'z'['z']z Bad pattern 'z': r;)rrTROUTE_REsplitDYN fullmatchrgroupGOOD DYN_WITH_RE groupdictrr _requote_pathreescapecompileerrorr?rPATH_SEPrn_pattern _formatter) rSr=rPr?r>partrqZcompiledexc)rrMrNrTs6  (zDynamicResource.__init__)rQcCs|jS)N)r)rSrMrMrNrUszDynamicResource.canonical)rArQcCsV|dst|drtt|dks,ttt||jj|_||j |_ dS)Nr;r) rrnrrrrrrr?r)rSrArMrMrNrZs zDynamicResource.add_prefix)r=rQcCs2|j|}|dkrdSdd|DSdS)NcSsi|]\}}t||qSrM) _unquote_path).0keyvaluerMrMrN sz*DynamicResource._match..)rrritems)rSr=rqrMrMrNrs  zDynamicResource._matchcCs |j|kS)N)r)rSr=rMrMrNr]szDynamicResource.raw_matchcCs|j|jdS)N)r>r?)rr)rSrMrMrNr[szDynamicResource.get_info)partsrQcKs(|jdd|D}tj|ddS)NcSsi|]\}}t||qSrM) _quote_path)rkvrMrMrNrsz+DynamicResource.url_for..T)r=r)r format_maprrr)rSrurlrMrMrNrWszDynamicResource.url_forcCs,|jdk rd|jdnd}dj||jdS)Nrz' rz$)rPr>)rPrr)rSrPrMrMrNrszDynamicResource.__repr__)rHrIrJrrrrrrKrrTr^rUrZr rrbr]r<r[rrWrrrMrM)rrNr3s   ! r3csbeZdZddeeeddfddZeedddZedd d d Zee d d d Z Z S)PrefixResourceN)rP)rArPrQcsL|r|dst||dks0|dr0t|tj|dt||_dS)Nr;)rr;)rP)rrnrrrTr_prefix)rSrArP)rrMrNrTszPrefixResource.__init__)rQcCs|jS)N)r)rSrMrMrNrUszPrefixResource.canonical)rArQcCs<|dst|drtt|dks,t||j|_dS)Nr;r)rrnrrr)rSrArMrMrNrZszPrefixResource.add_prefixcCsdS)NFrM)rSrArMrMrNr] szPrefixResource.raw_match) rHrIrJrKrrTr^rUrZrbr]rrMrM)rrNrs  rc seZdZdZdddddddeeeeeeee e e dd fddZ dd e ee fee e d d d Zeeed ddZedddZeddddZeedddZedddZeedddZeedddZe edd d!Zedd"d#Z Z!S)$r6rNiF)rPrc chunk_size show_indexfollow_symlinksappend_version) rAr@rPrcrrrrrQc stj||dyFt|}t|drd|fSdt|t|jddi}t ||j||fS)Nrr) rrrerrrrrrr/)rSrXr=rerrrMrMrNrYws   zStaticResource.resolvecCs t|jS)N)rr)rSrMrMrNrszStaticResource.__len__cCst|jS)N)rrvalues)rSrMrMrNrszStaticResource.__iter__c s*|jd}y:t|}|jr t|j|}|jsB||jWnxt t fk rr}z t |Wdd}~XYnLtk rYn8t k r}z|j j|t |Wdd}~XYnX|r |jryt||ddStk rtYnXntn|r"t||jdSt dS)Nrz text/html)r content_type)r) match_inforanchorr&rrrYrrrrrr( ExceptionrClogger exceptionrrr+_directory_as_htmlPermissionErrorrr)r)rSrXrrrrrMrMrNrs4   zStaticResource._handle)rrQcCs|s t||j}d|}d|d}g}|}x^t|D]R}||j}|jd|} |r|jd} n|j} | dj | | dqHWd d |} d |d| d } d |d } d | d| d}|S)Nz Index of /z

z

r;z#
  • {name}
  • )rrPz
      {}
     z z z z z z ) rrnrras_posixiterdirsortedrrPrrjoin)rSrZrelative_path_to_dirZindex_ofh1Z index_listZ dir_index_filerel_pathZfile_url file_nameulbodyZhead_strhtmlrMrMrNrs(    z!StaticResource._directory_as_htmlcCs0|jdk rd|jdnd}dj||j|jdS)Nrrz/ {directory!r}>)rPr=r@)rPrrr)rSrPrMrMrNrszStaticResource.__repr__)"rHrIrJrrKr#rrrrbrTrrrrW staticmethodbytesrr<r[rrr*rarYrrr4rr,rrrrrMrM)rrNr6s(! &$r6cseZdZedddfdd Zeddfdd Zeeed d d Zed d dZ e e dddZ e d ddZeed ddZed ddZZS)PrefixedSubAppResourcer8N)rArCrQcs4t|||_x|jD]}||qWdS)N)rrT_approuter resourcesrZ)rSrArCrd)rrMrNrTs zPrefixedSubAppResource.__init__)rArQcs0t|x|jjD]}||qWdS)N)rrZr'r(r))rSrArd)rrMrNrZs z!PrefixedSubAppResource.add_prefix)rrVrQcOs tddS)Nz3.url_for() is not supported by sub-application root)r)rSrrVrMrMrNrWszPrefixedSubAppResource.url_for)rQcCs|j|jdS)N)rCrA)r'r)rSrMrMrNr[szPrefixedSubAppResource.get_info)rXrQcsp|jj|jds,|jj|jkr,dtfS|jj|IdH}||jt |j t rb|j j }nt}||fS)Nr;) rrrrrr'r(rYrryrGr'r)rSrXrmethodsrMrMrNrYs    zPrefixedSubAppResource.resolvecCst|jjS)N)rr'r(rB)rSrMrMrNrszPrefixedSubAppResource.__len__cCst|jjS)N)rr'r(rB)rSrMrMrNrszPrefixedSubAppResource.__iter__cCsdj|j|jdS)Nz, {app!r}>)rArC)rrr')rSrMrMrNrszPrefixedSubAppResource.__repr__)rHrIrJrKrTrZrrWr<r[r*rarYrrrr4rrrrMrM)rrNr&sr&c@sNeZdZejeedddZejedddZ e eje dddZ d S) rE)rXrQcsdS)z1Return bool if the request satisfies the criteriaNrM)rSrXrMrMrNrqszAbstractRuleMatching.match)rQcCsdS)z;Return a dict with additional info useful for introspectionNrM)rSrMrMrNr[ szAbstractRuleMatching.get_infocCsdS)z Return a strNrM)rSrMrMrNrUszAbstractRuleMatching.canonicalN) rHrIrJr_r`r*rbrqr<r[r^rKrUrMrMrMrNrEsrEcs~eZdZedZeddfdd ZeedddZ eedd d Z e e d d d Z ee dddZedddZZS)Domainz(?!-)[a-z\d-]{1,63}(?tdtd|}|jdk sXtt fdd|j dDs~td |j d kr|jS|jd |j S) NzDomain must be strr9zDomain cannot be emptyz://zScheme not supportedzhttp://c3s|]}j|VqdS)N)re_partr)rx)rSrMrN +sz$Domain.validation..zDomain not validP:) ryrK TypeErrorrstriprrrrZraw_hostrnallrport)rSrDrrM)rSrNr,!s    zDomain.validation)rXrQcs |jtj}|sdS||S)NF)rrrZHOST match_domain)rSrXhostrMrMrNrq1sz Domain.match)r8rQcCs||jkS)N)rr-)rSr8rMrMrNr77szDomain.match_domaincCs d|jiS)NrD)r-)rSrMrMrNr[:szDomain.get_info)rHrIrJrrr.rKrTr^rUr,r*rbrqr7r<r[rrMrM)rrNr+s r+csPeZdZedZeddfdd ZeedddZ ee d d d Z Z S) MaskDomainz(?!-)[a-z\d\*-]{1,63}(?s  r9c@s\eZdZedddddZeedddZedd d Z e e d d d Z edddZ dS)MatchedSubAppResourcer8N)rFrCrQcCs t|d|_||_||_dS)Nr)r0rTrr'_rule)rSrFrCrMrMrNrTOs zMatchedSubAppResource.__init__)rQcCs|jjS)N)r>rU)rSrMrMrNrUUszMatchedSubAppResource.canonicalcCs|j|jdS)N)rCrF)r'r>)rSrMrMrNr[YszMatchedSubAppResource.get_info)rXrQcs`|j|IdHsdtfS|jj|IdH}||jt|jt rR|jj }nt}||fS)N) r>rqrr'r(rYrryrGr'r)rSrXrr*rMrMrNrY\s    zMatchedSubAppResource.resolvecCsdj|jdS)Nz" {app!r}>)rC)rr')rSrMrMrNrgszMatchedSubAppResource.__repr__)rHrIrJrErTr^rKrUr<r[r*rarYrrMrMrMrNr=Ns  r=cseZdZdZddeeeeefe e e ddfddZ eddd Z ee edd d Zeeed d dZedddZZS)r5zA route with resourceN)rc)rerfrdrcrQcstj||||ddS)N)rcrd)rrT)rSrerfrdrc)rrMrNrTnszResourceRoute.__init__)rQcCsdj|j|j|jdS)Nz3 {handler!r})rerdrf)rrerrf)rSrMrMrNrzszResourceRoute.__repr__cCs|jdkrdS|jjS)N)rrP)rSrMrMrNrPs zResourceRoute.name)rrVrQcOs|jdk st|jj||S)z/Construct url for route with additional params.N)rrnrW)rSrrVrMrMrNrWszResourceRoute.url_forcCs|jdk st|jS)N)rrnr[)rSrMrMrNr[szResourceRoute.get_info)rHrIrJ__doc__rKrrrr r0rrrTrr^rPrrWr<r[rrMrM)rrNr5ksr5cseZdZeddfdd ZeeedddZee edd d Z e dd d Z e ed ddZeedddZeedddZedddZZS)rN)rGrQcsttj|j||_dS)N)rrTrrr_http_exception)rSrG)rrMrNrTszSystemRoute.__init__)rrVrQcOs tddS)Nz).url_for() is not allowed for SystemRoute)r)rSrrVrMrMrNrWszSystemRoute.url_for)rQcCsdS)NrM)rSrMrMrNrPszSystemRoute.namecCs d|jiS)NrG)r@)rSrMrMrNr[szSystemRoute.get_info)rXrQcs |jdS)N)r@)rSrXrMrMrNrszSystemRoute._handlecCs|jjS)N)r@r)rSrMrMrNrszSystemRoute.statuscCs|jjS)N)r@r)rSrMrMrNrszSystemRoute.reasoncCs dj|dS)Nz*)rS)r)rSrMrMrNrszSystemRoute.__repr__)rHrIrJr$rTrKrrWr^rrPr<r[r*r,rrrrrrrMrM)rrNrsrc@s@eZdZedddZeedefdddZddddZdS) r7)rQcsJ|jjtjkr|t||jjd}|dkr:||IdH}|S)N)rXrerMETH_ALL_raise_allowed_methodsgetattrr)rSreresprMrMrN_iters z View._iterNcCs |S)N)rE __await__)rSrMrMrNrFszView.__await__cs&fddtjD}tjj|dS)Ncsh|]}t|r|qSrM)hasattrr)rr )rSrMrN sz.View._raise_allowed_methods..)rrAr'rXre)rSrrM)rSrNrBszView._raise_allowed_methods) rHrIrJr,rEr rrFrBrMrMrMrNr7s r7c@sPeZdZeeddddZedddZeeddd Z e e d d d Z dS) ResourcesViewN)r)rQcCs ||_dS)N) _resources)rSr)rMrMrNrTszResourcesView.__init__)rQcCs t|jS)N)rrJ)rSrMrMrNrszResourcesView.__len__ccs|jEdHdS)N)rJ)rSrMrMrNrszResourcesView.__iter__)rdrQcCs ||jkS)N)rJ)rSrdrMrMrN __contains__szResourcesView.__contains__) rHrIrJrr0rTrrrrobjectrbrKrMrMrMrNrIsrIc@sNeZdZeedddZedddZee dddZ e e d d d Z d S) RoutesView)r)cCs2g|_x&|D]}x|D]}|j|qWq WdS)N)rr)rSr)rdrrMrMrNrTs  zRoutesView.__init__)rQcCs t|jS)N)rr)rSrMrMrNrszRoutesView.__len__ccs|jEdHdS)N)r)rSrMrMrNrszRoutesView.__iter__)rrQcCs ||jkS)N)r)rSrrMrMrNrKszRoutesView.__contains__N)rHrIrJrr0rTrrrr4rrLrbrKrMrMrMrNrMsrMc s"eZdZedZddfdd ZeedddZ e e dd d Z e dd d Zeed ddZe edddZedddZedddZee efdddZedd ddZdde ee edddZddde e eee e!fee ee"e#d d!d"Z$ddd#d$d$d$d%e e%ee ee"e eeeed& d'd(Z&e ee'e#d)d*d+Z(e ee'e#d)d,d-Z)dd.d/e eee ee'e#d0d1d2Z*e ee'e#d)d3d4Z+e ee'e#d)d5d6Z,e ee'e#d)d7d8Z-e ee'e#d)d9d:Z.e e e!e'e#d)d;d<Z/ddfd=d> Z0e1e2e3e#d?d@dAZ4Z5S)Br.z[.:-]N)rQcstg|_i|_dS)N)rrTrJ_named_resources)rS)rrMrNrTs zUrlDispatcher.__init__)rXrQcsd|j}t}xR|jD],}||IdH\}}|dk r8|S||O}qW|rVtt||SttSdS)N)rerrJrYrr'r()rSrXrerrdrallowedrMrMrNrYs  zUrlDispatcher.resolvecCs t|jS)N)rrN)rSrMrMrNrszUrlDispatcher.__iter__cCs t|jS)N)rrN)rSrMrMrNrszUrlDispatcher.__len__)rdrQcCs ||jkS)N)rN)rSrdrMrMrNrKszUrlDispatcher.__contains__)rPrQcCs |j|S)N)rN)rSrPrMrMrN __getitem__szUrlDispatcher.__getitem__cCs t|jS)N)rIrJ)rSrMrMrNr)szUrlDispatcher.resourcescCs t|jS)N)rMrJ)rSrMrMrNrBszUrlDispatcher.routescCs t|jS)N)rrN)rSrMrMrNnamed_resources szUrlDispatcher.named_resourcescCst|tstd||jr&td|j}|dk r|j|}x<|D]4}t |rdt d|d| sFt d |qFW||j krt d ||j |||j |<|j|dS)Nz4Instance of AbstractResource class is required, got z.Cannot register a resource into frozen router.zIncorrect 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})ryr0rnfrozenrrP NAME_SPLIT_RErkeyword iskeywordrr isidentifierrrNrJr)rSrdrPrrrMrMrNregister_resource s,        zUrlDispatcher.register_resource)rP)r=rPrQcCs|r|dstd|jrD|jd}|j|krD||rDtt|Sd|ks|d|ks|t|s|t t ||d}| ||St ||d}| ||S)Nr;z)path should be started with / or be emptyrr)rP) rrrrJrPr]rr1rsearchr2rrWr3)rSr=rPrdrMrMrN add_resource-s     zUrlDispatcher.add_resource)rPrc)rer=rfrPrcrQcCs|j||d}|j|||dS)N)rP)rc)rZr)rSrer=rfrPrcrdrMrMrNr=s zUrlDispatcher.add_routeiF)rPrcrrrr) rAr=rPrcrrrrrQc CsJ|dst|dr$|dd}t||||||||d} || | S)z^Add static files view. prefix - url prefix path - folder with files r;NrX)rPrcrrrr)rrnrr6rW) rSrAr=rPrcrrrrrdrMrMrN add_staticIs   zUrlDispatcher.add_static)r=rfrVrQcKs|jtj||f|S)z9 Shortcut for add_route with method HEAD )rr METH_HEAD)rSr=rfrVrMrMrNadd_headkszUrlDispatcher.add_headcKs|jtj||f|S)z< Shortcut for add_route with method OPTIONS )rrZ METH_OPTIONS)rSr=rfrVrMrMrN add_optionsqszUrlDispatcher.add_optionsT)rP allow_head)r=rfrPr_rVrQcKs6|j||d}|r$|jtj|f||jtj|f|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 )rP)rZrrr\ZMETH_GET)rSr=rfrPr_rVrdrMrMrNadd_getys zUrlDispatcher.add_getcKs|jtj||f|S)z9 Shortcut for add_route with method POST )rrZ METH_POST)rSr=rfrVrMrMrNadd_postszUrlDispatcher.add_postcKs|jtj||f|S)z8 Shortcut for add_route with method PUT )rrZMETH_PUT)rSr=rfrVrMrMrNadd_putszUrlDispatcher.add_putcKs|jtj||f|S)z: Shortcut for add_route with method PATCH )rrZ METH_PATCH)rSr=rfrVrMrMrN add_patchszUrlDispatcher.add_patchcKs|jtj||f|S)z; Shortcut for add_route with method DELETE )rrZ METH_DELETE)rSr=rfrVrMrMrN add_deleteszUrlDispatcher.add_deletecKs|jtj||f|S)zP Shortcut for add_route with ANY methods for a class-based view )rrr)rSr=rfrVrMrMrNadd_viewszUrlDispatcher.add_viewcs&tx|jD] }|qWdS)N)rr\rJ)rSrd)rrMrNr\s  zUrlDispatcher.freeze)rBrQcCs&g}x|D]}|||q W|S)zAppend routes to route table. Parameter should be a sequence of RouteDef objects. Returns a list of registered AbstractRoute instances. )extendregister)rSrBZregistered_routesZ route_defrMrMrN add_routess zUrlDispatcher.add_routes)6rHrIrJrrrSrTr*rrYrrKrrrrLrbrKr0rPrIr)rMrBrrQrWrr1rZrrrr rr4rr#r[rr]r^r`rarbrcrdrer\r r-rrhrrMrM)rrNr.sN !$    r.)rrQcCs$tdkr|dd}tj|ddjS)N)rrrz%25F)r=r)rrrrr)rrMrMrNrs rcCstj|ddjS)NT)r=r)rrr=)rrMrMrNrsrcCs t|}d|kr|dd}|S)Nrz%25)rr)rrirMrMrNrs r)rr_rgrrrtrTrrrv contextlibr functoolsrpathlibrtypesrtypingrrrr r r r r rrrrrrrrrrrZtyping_extensionsrZyarlrrZ yarl_versionrrrrr Zhelpersr!httpr"Ztypedefsr#Zweb_exceptionsr$r%r&r'r(Zweb_fileresponser)Z web_requestr*Z web_responser+r,Z web_routedefr-__all__Zweb_appr8rKZBaseDictdictrmaprrrrrprrrrrrar<r0ABCr4r/rrlr1r2r3rr6r&rEr+r9r=r5rr7rIrMr.rrrrMrMrMrNs    T             /PC<)LI,($d