U '7`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$rMrML/opt/alt/python38/lib64/python3.8/site-packages/aiohttp/web_urldispatcher.pyr<Ys  r<F)Ztotalc@seZdZddeeddddZeeedddZeej edd d Z ej ee d d d Z ej e edddZej eddddZej edddZddddZej eedddZdS)r0NnamerPreturncCs ||_dSN_nameselfrPrMrMrN__init__mszAbstractResource.__init__rRcCs|jSrSrTrWrMrMrNrPpszAbstractResource.namecCsdS)zWExposes the resource's canonical path. For example '/foo/bar/{name}' NrMrZrMrMrN canonicaltszAbstractResource.canonical)kwargsrRcKsdS)z2Construct url for resource with additional params.NrM)rWr\rMrMrNurl_for}szAbstractResource.url_forrequestrRcsdS)zMResolve resource Return (UrlMappingMatchInfo, allowed_methods) pair.NrMrWr_rMrMrNresolveszAbstractResource.resolverArRcCsdS)zXAdd a prefix to processed URLs. Required for subapplications support. NrMrWrArMrMrN add_prefixszAbstractResource.add_prefixcCsdSz;Return a dict with additional info useful for introspectionNrMrZrMrMrNget_infoszAbstractResource.get_infocCsdSrSrMrZrMrMrNfreezeszAbstractResource.freezer=rRcCsdS)z Perform a raw match against pathNrMrWr=rMrMrN raw_matchszAbstractResource.raw_match)rHrIrJrrKrXpropertyrPabcabstractmethodr[rr]r*_Resolverardr<rfrgboolrjrMrMrMrNr0ls"r0r4c@seZdZdddeeeeefee ee ddddZ e edddZ e edd d Ze ejeedd d Ze ee dd dZejedddZejeeedddZeddddZdS)r4Nexpect_handlerresource)methodhandlerrqrrrRcs|dkr t}|}t|s,t|dt|r8n^t|rPt dt nFt |t rft|trfn0t dt t|ttdfdd }||}||_||_||_||_dS)Nz is not allowed HTTP methodz6Bare generators are deprecated, use @coroutine wrapperz-Bare functions are deprecated, use async onesr^cs |}t|r|IdHS|SrS)asyncioZ iscoroutine)r_resultZ old_handlerrMrNhandler_wrappers  z/AbstractRoute.__init__..handler_wrapper)_default_expect_handlerupperHTTP_METHOD_REmatch ValueErrorruZiscoroutinefunctioninspectZisgeneratorfunctionwarningswarnDeprecationWarning isinstancetype issubclassr rr*r,_method_handler_expect_handler _resource)rWrsrtrqrrrxrMrwrNrXs4    zAbstractRoute.__init__rYcCs|jSrS)rrZrMrMrNrsszAbstractRoute.methodcCs|jSrS)rrZrMrMrNrtszAbstractRoute.handlercCsdS)z8Optional route's name, always equals to resource's name.NrMrZrMrMrNrPszAbstractRoute.namecCs|jSrS)rrZrMrMrNrrszAbstractRoute.resourcecCsdSrerMrZrMrMrNrfszAbstractRoute.get_infoargsr\rRcOsdS)/Construct url for route with additional params.NrMrWrr\rMrMrNr]szAbstractRoute.url_forr^cs||IdHdSrS)rr`rMrMrNhandle_expect_headersz"AbstractRoute.handle_expect_header)rHrIrJrKr _WebHandlerrr r_ExpectHandlerr0rXrkrsrtrlrmrPrrr<rfrr]r*rrMrMrMrNr4s. 2cseZdZeeefedfdd ZeedddZ eedddZ ee dd d Z ee edd d Zedd dZeeddddZdddddZeddddZededdddZddddZedfdd ZZS) r/) match_dictroutecs(t|||_g|_d|_d|_dSNF)superrX_route_apps _current_app_frozen)rWrr __class__rMrNrXs  zUrlMappingMatchInfo.__init__rYcCs|jjSrS)rrtrZrMrMrNrtszUrlMappingMatchInfo.handlercCs|jSrS)rrZrMrMrNrszUrlMappingMatchInfo.routecCs|jjSrS)rrrZrMrMrNrqsz"UrlMappingMatchInfo.expect_handlercCsdSrSrMrZrMrMrNrGsz"UrlMappingMatchInfo.http_exceptioncCs |jSrS)rrfrZrMrMrNrfszUrlMappingMatchInfo.get_info)r8.cCs t|jSrS)tuplerrZrMrMrNappsszUrlMappingMatchInfo.appsr8N)rCrRcCs0|jrtd|jdkr||_|jd|dS)Nz-Cannot change apps stack after .freeze() callr)r RuntimeErrorrrinsertrWrCrMrMrNadd_app s  zUrlMappingMatchInfo.add_appcCs |j}|SrS)rrrMrMrN current_appszUrlMappingMatchInfo.current_app)NNNccsDtr ||jkr td|j||j}||_z dVW5||_XdS)Nz1Expected one of the following apps {!r}, got {!r})r!rrformatr)rWrCprevrMrMrNset_current_apps  z#UrlMappingMatchInfo.set_current_appcCs d|_dS)NT)rrZrMrMrNrg'szUrlMappingMatchInfo.freezecsdtd|jdS)Nz )r__repr__rrZrrMrNr*szUrlMappingMatchInfo.__repr__)rHrIrJr rKr4rXrkrrtrrrqrr$rGr<rfrrrrrr rrgr __classcell__rMrMrrNr/s&r/csDeZdZeddfdd ZeedddZeddd ZZ S) MatchInfoErrorNrGrRcs||_tit|jdSrS) _exceptionrrX SystemRouterWrGrrMrNrX/szMatchInfoError.__init__rYcCs|jSrS)rrZrMrMrNrG3szMatchInfoError.http_exceptioncCsd|jj|jjS)Nz)rrstatusreasonrZrMrMrNr7szMatchInfoError.__repr__) rHrIrJr$rXrkrGrKrrrMrMrrNr.srr^csL|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%)r_expectrMrMrNry=s   rycseZdZddeeddfddZddeeeee fee ddd d Z ddd d d Z e edddZejeeeeefdddZedddZeedddZZS)r1NrOrQcstj|dg|_dSNrO)rrX_routesrVrrMrNrXLszResource.__init__rqr5)rsrtrqrRcCsP|jD]*}|j|ks |jtjkrtdj|dqt||||d}|||S)NzOAdded route will never be executed, method {route.method} is already registered)rr)rrsrMETH_ANYrrr5register_route)rWrsrtrq route_objrMrMrN add_routePs  zResource.add_routerrRcCs|j|dSrSrappendrWrrMrMrNrdszResource.register_router^csnt}||jj}|dkr$d|fS|jD]:}|j}||||jksR|tjkr*t |||fSq*d|fSrS) set_matchrel_urlraw_pathrrsaddrrr/)rWr_allowed_methodsrrZ route_methodrMrMrNrajs  zResource.resolverhcCsdSrSrMrirMrMrNrzszResource._matchrYcCs t|jSrSlenrrZrMrMrN__len__~szResource.__len__cCs t|jSrS)iterrrZrMrMrN__iter__szResource.__iter__)rHrIrJrrKrXrrr rrrrr*rnrarlrmr rintrrr4rrrMrMrrNr1Ks  r1cseZdZddeeeddfddZeedddZddd d Zedd d d Z eee eefdddZ ee dddZ edddZedddZedddZZS)r2NrOr=rPrRcstj|d||_dSr)rrX_path)rWr=rPrrMrNrXszPlainResource.__init__rYcCs|jSrSrrZrMrMrNr[szPlainResource.canonicalcCs|js d|_dSNr;rrZrMrMrNrgszPlainResource.freezerbcCs||j|_dSrSrrcrMrMrNrdszPlainResource.add_prefixrhcCs|j|kriSdSdSrSrrirMrMrNrs zPlainResource._matchcCs |j|kSrSrrirMrMrNrjszPlainResource.raw_matchcCs d|jiS)Nr=rrZrMrMrNrfszPlainResource.get_infocCstj|jddSNTr=Zencoded)rbuildrrZrMrMrNr]szPlainResource.url_forcCs0|jdk rd|jdnd}d|d|jdS)N'' rz[_a-zA-Z][_a-zA-Z0-9]*)\}z.\{(?P[_a-zA-Z][_a-zA-Z0-9]*):(?P.+)\}z[^{}/]+NrOrc sBtj|dd}d}t|D]}|j|}|rd|d|d|j7}|d|dd7}q |j |}|r|djf| 7}|d|dd7}q d|ksd|krt d|d |d t |}||7}|t |7}q zt |}Wn<t jk r0}zt d |d |dW5d}~XYnX||_||_dS) NrOrz (?P<{}>{})var{}z(?P<{var}>{re})zInvalid path 'z'['z']z Bad pattern 'z': )rrXROUTE_REsplitDYN fullmatchrgroupGOOD DYN_WITH_RE groupdictr} _requote_pathreescapecompileerror_pattern _formatter) rWr=rPr?r>partr|ZcompiledexcrrMrNrXs2  (zDynamicResource.__init__rYcCs|jSrSrrZrMrMrNr[szDynamicResource.canonicalrbcCs*tt||jj|_||j|_dSrS)rrrrr?rrcrMrMrNrdszDynamicResource.add_prefixrhcCs2|j|}|dkrdSdd|DSdS)NcSsi|]\}}|t|qSrM) _unquote_path).0keyvaluerMrMrN sz*DynamicResource._match..)rrritems)rWr=r|rMrMrNrs   zDynamicResource._matchcCs |j|kSrSrrirMrMrNrjszDynamicResource.raw_matchcCs|j|jdS)N)r>r?)rrrZrMrMrNrfszDynamicResource.get_info)partsrRcKs(|jdd|D}tj|ddS)NcSsi|]\}}|t|qSrM) _quote_path)rkvrMrMrNrsz+DynamicResource.url_for..Tr)r format_maprrr)rWrurlrMrMrNr]szDynamicResource.url_forcCs,|jdk rd|jdnd}dj||jdS)Nrrrz$)rPr>)rPrrrVrMrMrNrs zDynamicResource.__repr__)rHrIrJrrrrrrKrrXrkr[rdr rrorjr<rfrr]rrrMrMrrNr3s   ! r3csbeZdZddeeeddfddZeedddZedd d d Zee d d d Z Z S)PrefixResourceNrO)rArPrRcstj|dt||_dSr)rrXr_prefix)rWrArPrrMrNrXszPrefixResource.__init__rYcCs|jSrSrrZrMrMrNr[szPrefixResource.canonicalrbcCs||j|_dSrSrrcrMrMrNrdszPrefixResource.add_prefixcCsdSrrMrcrMrMrNrj szPrefixResource.raw_match) rHrIrJrKrrXrkr[rdrorjrrMrMrrNrs  rc seZdZdZdddddddeeeeeeee e e dd fddZ dd e ee fee e d d d Zeeed ddZedddZeddddZeedddZedddZeedddZeedddZe edd d!Zedd"d#Z Z!S)$r6rNFrPrq chunk_size show_indexfollow_symlinksappend_version) rAr@rPrqrrrrrRc stj||dzFt|}t|drd|fSdt|t|jddi}t ||j||fS)Nrr) rrrsrrrrrrr/)rWr_r=rsrrrMrMrNraws   zStaticResource.resolvecCs t|jSrSrrZrMrMrNrszStaticResource.__len__cCst|jSrS)rrvaluesrZrMrMrNrszStaticResource.__iter__c s,|jd}z:t|}|jr t|j|}|jsB||jWnxt t fk rr}z t |W5d}~XYnLtk rYn8t k r}z|j j|t |W5d}~XYnX|r |jrzt||ddWStk rtYnXntn|r$t||jdSt dS)Nrz text/html)rZ content_type)r) match_inforZanchorr&r rrar rr}r r( ExceptionrCZloggerZ exceptionrr r+_directory_as_htmlPermissionErrorrr)r )rWr_rrr rrMrMrNrs8   zStaticResource._handle)r rRcCs||j}d|}d|d}g}|}t|D]R}||j}|jd|} |rr|jd} n|j} |dj | | dq:d 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 ) rr Zas_posixZiterdirsortedrrrPrrjoin)rWr Zrelative_path_to_dirZindex_ofZh1Z index_listZ dir_indexZ_fileZrel_pathZfile_url file_nameZulZbodyZhead_strZhtmlrMrMrNr.s,    z!StaticResource._directory_as_htmlcCs0|jdk rd|jdnd}dj||j|jdS)Nrrz/ {directory!r}>)rPr=r@)rPrrr rVrMrMrNrs zStaticResource.__repr__)"rHrIrJrrKr#rrrrorXrrrr] staticmethodbytesrr<rfrr*r*rnrarrr4rr,rr.rrrMrMrrNr6sD*  & &$r6cseZdZedddfdd Zeddfdd Zeeed d d Zed d dZ e e dddZ e d ddZeed ddZed ddZZS)PrefixedSubAppResourcer8N)rArCrRcs0t|||_|jD]}||qdSrS)rrX_approuter resourcesrd)rWrArCrrrrMrNrXs zPrefixedSubAppResource.__init__rbcs,t||jjD]}||qdSrS)rrdr7r8r9)rWrArrrrMrNrds z!PrefixedSubAppResource.add_prefixrcOs tddS)Nz3.url_for() is not supported by sub-application rootrrrMrMrNr]szPrefixedSubAppResource.url_forrYcCs|j|jdS)N)rCrA)r7rrZrMrMrNrfszPrefixedSubAppResource.get_infor^csp|jj|jds,|jj|jkr,dtfS|jj|IdH}||jt |j t rb|j j }nt}||fSr) rrrrrr7r8rarrrGr'rrWr_r,methodsrMrMrNras     zPrefixedSubAppResource.resolvecCst|jjSrS)rr7r8rBrZrMrMrNrszPrefixedSubAppResource.__len__cCst|jjSrS)rr7r8rBrZrMrMrNrszPrefixedSubAppResource.__iter__cCsdj|j|jdS)Nz, {app!r}>)rArC)rrr7rZrMrMrNrszPrefixedSubAppResource.__repr__)rHrIrJrKrXrdrr]r<rfr*rnrarrrr4rrrrMrMrrNr6sr6c@sNeZdZejeedddZejedddZ e eje dddZ d S) rEr^csdS)z1Return bool if the request satisfies the criteriaNrMr`rMrMrNr|szAbstractRuleMatching.matchrYcCsdSrerMrZrMrMrNrf szAbstractRuleMatching.get_infocCsdS)z Return a strNrMrZrMrMrNr[szAbstractRuleMatching.canonicalN) rHrIrJrlrmr*ror|r<rfrkrKr[rMrMrMrNrEsrEcs~eZdZedZeddfdd ZeedddZ eedd d Z e e d d d Z ee dddZedddZZS)Domainz(?!-)[a-z\d-]{1,63}(?tdtd|}tfdd|j dDsptd |j d kr|jS|jd |j S) NzDomain must be strr9zDomain cannot be emptyz://zScheme not supportedzhttp://c3s|]}j|VqdSrS)re_partr)rxrZrMrN +sz$Domain.validation..zDomain not validP:) rrK TypeErrorrstriprr}rallZraw_hostrZport)rWrDrrMrZrNr?!s    zDomain.validationr^cs |jtj}|sdS||Sr)rrrZHOST match_domain)rWr_hostrMrMrNr|1sz Domain.matchrKrRcCs||jkSrS)rr@rWrKrMrMrNrJ7szDomain.match_domaincCs d|jiS)NrDrArZrMrMrNrf:szDomain.get_info)rHrIrJrrrBrKrXrkr[r?r*ror|rJr<rfrrMrMrrNr=s r=csPeZdZedZeddfdd ZeedddZ ee d d d Z Z S) MaskDomainz(?!-)[a-z\d\*-]{1,63}(?cs2t||jdddd}t||_dS)Nr9z\.*z.*)rrXr@rrr_mask)rWrDmaskrrMrNrXAs zMaskDomain.__init__rYcCs|jjSrS)rPr?rZrMrMrNr[FszMaskDomain.canonicalrLcCs|j|dk SrS)rPrrMrMrMrNrJJszMaskDomain.match_domain) rHrIrJrrrBrKrXrkr[rorJrrMrMrrNrN>s  rNc@s\eZdZedddddZeedddZedd d Z e e d d d Z edddZ dS)MatchedSubAppResourcer8N)rFrCrRcCs t|d|_||_||_dS)Nr)r0rXrr7_rule)rWrFrCrMrMrNrXOs zMatchedSubAppResource.__init__rYcCs|jjSrS)rSr[rZrMrMrNr[UszMatchedSubAppResource.canonicalcCs|j|jdS)N)rCrF)r7rSrZrMrMrNrfYszMatchedSubAppResource.get_infor^cs`|j|IdHsdtfS|jj|IdH}||jt|jt rR|jj }nt}||fSrS) rSr|rr7r8rarrrGr'rr;rMrMrNra\s    zMatchedSubAppResource.resolvecCsdj|jdS)Nz" {app!r}>)rC)rr7rZrMrMrNrgszMatchedSubAppResource.__repr__)rHrIrJrErXrkrKr[r<rfr*rnrarrMrMrMrNrRNs  rRcseZdZdZddeeeeefe e e ddfddZ eddd Z ee edd d Zeeed d dZedddZZS)r5zA route with resourceNr)rsrtrrrqrRcstj||||ddS)Nrp)rrX)rWrsrtrrrqrrMrNrXns zResourceRoute.__init__rYcCsdj|j|j|jdS)Nz3 {handler!r})rsrrrt)rrsrrtrZrMrMrNrzs zResourceRoute.__repr__cCs|jdkrdS|jjSrS)rrPrZrMrMrNrPs zResourceRoute.namercOs|jj||S)r)rr]rrMrMrNr]szResourceRoute.url_forcCs |jSrS)rrfrZrMrMrNrfszResourceRoute.get_info)rHrIrJ__doc__rKrrrr r0rrrXrrkrPrr]r<rfrrMrMrrNr5ks r5cseZdZeddfdd ZeeedddZee edd d Z e dd d Z e ed ddZeedddZeedddZedddZZS)rNrcsttj|j||_dSrS)rrXrrr_http_exceptionrrrMrNrXszSystemRoute.__init__rcOs tddS)Nz).url_for() is not allowed for SystemRouter:rrMrMrNr]szSystemRoute.url_forrYcCsdSrSrMrZrMrMrNrPszSystemRoute.namecCs d|jiS)NrGrUrZrMrMrNrfszSystemRoute.get_infor^cs |jdSrSrVr`rMrMrNrszSystemRoute._handlecCs|jjSrS)rUrrZrMrMrNrszSystemRoute.statuscCs|jjSrS)rUrrZrMrMrNrszSystemRoute.reasoncCs dj|dS)Nz*rZ)rrZrMrMrNrszSystemRoute.__repr__)rHrIrJr$rXrKrr]rkrrPr<rfr*r,rrrrrrrMrMrrNrsrc@s@eZdZedddZeedefdddZddddZdS) r7rYcsJ|jjtjkr|t||jjd}|dkr:||IdH}|SrS)r_rsrMETH_ALL_raise_allowed_methodsgetattrr)rWrsZresprMrMrN_iters z View._iterNcCs |SrS)rZ __await__rZrMrMrNr[szView.__await__cs&fddtjD}tjj|dS)Ncsh|]}t|r|qSrM)hasattrr)rr)rZrMrN sz.View._raise_allowed_methods..)rrWr'r_rs)rWrrMrZrNrXszView._raise_allowed_methods) rHrIrJr,rZr rr[rXrMrMrMrNr7s r7c@sPeZdZeeddddZedddZeeddd Z e e d d d Z dS) ResourcesViewN)r9rRcCs ||_dSrS _resources)rWr9rMrMrNrXszResourcesView.__init__rYcCs t|jSrS)rr`rZrMrMrNrszResourcesView.__len__ccs|jEdHdSrSr_rZrMrMrNrszResourcesView.__iter__rrrRcCs ||jkSrSr_rWrrrMrMrN __contains__szResourcesView.__contains__) rHrIrJrr0rXrrrrobjectrorcrMrMrMrNr^sr^c@sNeZdZeedddZedddZee dddZ e e d d d Z d S) RoutesView)r9cCs*g|_|D]}|D]}|j|qq dSrSr)rWr9rrrrMrMrNrXszRoutesView.__init__rYcCs t|jSrSrrZrMrMrNrszRoutesView.__len__ccs|jEdHdSrSrrZrMrMrNrszRoutesView.__iter__rcCs ||jkSrSrfrrMrMrNrcszRoutesView.__contains__N)rHrIrJrr0rXrrrr4rrdrorcrMrMrMrNresrec 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[.:-]NrYcstg|_i|_dSrS)rrXr`_named_resourcesrZrrMrNrXs zUrlDispatcher.__init__r^csd|j}t}|jD]0}||IdH\}}|dk r:|S||O}q|rVtt||SttSdSrS)rsrr`rarr'r()rWr_rsrrrrZallowedrMrMrNras  zUrlDispatcher.resolvecCs t|jSrS)rrgrZrMrMrNrszUrlDispatcher.__iter__cCs t|jSrS)rrgrZrMrMrNrszUrlDispatcher.__len__racCs ||jkSrSrgrbrMrMrNrcszUrlDispatcher.__contains__rQcCs |j|SrSrhrVrMrMrN __getitem__szUrlDispatcher.__getitem__cCs t|jSrS)r^r`rZrMrMrNr9szUrlDispatcher.resourcescCs t|jSrS)rer`rZrMrMrNrBszUrlDispatcher.routescCs t|jSrS)rrgrZrMrMrNnamed_resources szUrlDispatcher.named_resourcescCs|jrtd|j}|dk r|j|}|D]4}t|rJtd|d|s,td |q,||j krtd ||j |||j |<|j |dS)Nz.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}) frozenrrP NAME_SPLIT_RErkeyword iskeywordr} isidentifierrrgr`r)rWrrrPrrrMrMrNregister_resource s2     zUrlDispatcher.register_resourcerOrcCs|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 emptyrrrO) rr}r`rPrjrr1rsearchr2rrpr3)rWr=rPrrrMrMrN add_resource-s     zUrlDispatcher.add_resource)rPrq)rsr=rtrPrqrRcCs|j||d}|j|||dS)NrOr)rsr)rWrsr=rtrPrqrrrMrMrNr=s zUrlDispatcher.add_routerFr) rAr=rPrqrrrrrRc Cs<|dr|dd}t||||||||d} || | S)z^Add static files view. prefix - url prefix path - folder with files r;Nrqr)endswithr6rp) rWrAr=rPrqrrrrrrrMrMrN add_staticIs   zUrlDispatcher.add_static)r=rtr\rRcKs|jtj||f|S)z9 Shortcut for add_route with method HEAD )rr METH_HEADrWr=rtr\rMrMrNadd_headkszUrlDispatcher.add_headcKs|jtj||f|S)z< Shortcut for add_route with method OPTIONS )rrZ METH_OPTIONSrwrMrMrN add_optionsqszUrlDispatcher.add_optionsT)rP allow_head)r=rtrPrzr\rRcKs6|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 rO)rsrrrvZMETH_GET)rWr=rtrPrzr\rrrMrMrNadd_getys zUrlDispatcher.add_getcKs|jtj||f|S)z9 Shortcut for add_route with method POST )rrZ METH_POSTrwrMrMrNadd_postszUrlDispatcher.add_postcKs|jtj||f|S)z8 Shortcut for add_route with method PUT )rrZMETH_PUTrwrMrMrNadd_putszUrlDispatcher.add_putcKs|jtj||f|S)z: Shortcut for add_route with method PATCH )rrZ METH_PATCHrwrMrMrN add_patchszUrlDispatcher.add_patchcKs|jtj||f|S)z; Shortcut for add_route with method DELETE )rrZ METH_DELETErwrMrMrN add_deleteszUrlDispatcher.add_deletecKs|jtj||f|S)zP Shortcut for add_route with ANY methods for a class-based view )rrrrwrMrMrNadd_viewszUrlDispatcher.add_viewcs"t|jD] }|qdSrS)rrgr`rbrrMrNrgs  zUrlDispatcher.freeze)rBrRcCs"g}|D]}|||q|S)zAppend routes to route table. Parameter should be a sequence of RouteDef objects. Returns a list of registered AbstractRoute instances. )extendregister)rWrBZregistered_routesZ route_defrMrMrN add_routesszUrlDispatcher.add_routes)6rHrIrJrrrlrXr*rrarrKrrrrdrorcr0rir^r9rerBrrjrprr1rsrrrr rr4rr#rurrxryr{r|r}r~rrrgr r-rrrrMrMrrNr.s !  "     r.)rrRcCs$tdkr|dd}tj|ddjS)NrrrFr)rrrrrrrMrMrNrs rcCstj|ddjSr)rrr=rrMrMrNrsrcCs t|}d|kr|dd}|S)Nrr)rr)rrvrMrMrNrs r)rrlrur'r%r~rmrrr contextlibr functoolsrpathlibrtypesrtypingrrrr r r r r rrrrrrrrrrrZtyping_extensionsrZyarlrrZ yarl_versionrrrrr Zhelpersr!Zhttpr"Ztypedefsr#Zweb_exceptionsr$r%r&r'r(Zweb_fileresponser)Z web_requestr*Z web_responser+r,Z web_routedefr-__all__Zweb_appr8rKZBaseDictdictrmaprrrrr{rrZPATH_SEPrrrnr<r0ABCr4r/rryr1r2r3rr6r6rEr=rNrRr5rr7r^rer.rrrrMrMrMrNs    T            /PC<)LI,($d