m DMc@sdZdkZdkZdkZdkZdkZdkZdklZl Z dk l Z dk l Z dklZeidZeiZdZedZeaed eate_eaed d d d dddddddddddddfZed d ddfZdZdZ edZ!deeedZ"ei#d Z$ei#d!Z%d"Z&d#Z'ed$Z(eeed%Z)d&Z*ei#d'Z+ei#d(ei,Z-ei#d)ei,Z.ei#d*ei,Z/d+Z0ed,Z1d-d.e2e2eeefe2d/Z3d d0d1Z4d2e5fd3YZ6d4e5fd5YZ7e2d6Z8d7Z9d8Z:dS(9sF This file is part of the web2py Web Framework Copyrighted by Massimo Di Pierro License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html) gluon.rewrite parses incoming URLs and formats outgoing URLs for gluon.html.URL. In addition, it rewrites both incoming and outgoing URLs based on the (optional) user-supplied routes.py, which also allows for rewriting of certain error messages. routes.py supports two styles of URL rewriting, depending on whether 'routers' is defined. Refer to router.example.py and routes.example.py for additional documentation. N(sStoragesList(sHTTP(sabspath(sglobal_settingssweb2py.rewritecCsgtddddddddd d d dd dd ddddgdddtdddddd}|S(s&return new copy of default base routertdefault_applicationtinitt applicationstALLtdefault_controllertdefaultt controllerstDEFAULTtdefault_functiontindext functionstdefault_languaget languagest root_statics favicon.icos robots.txttdomainst map_hyphent acfe_matchs\w+$t file_matchs(\w+[-=./]?)+$t args_matchs([\w@ -]+[=.]?)*$N(tStoragetNonetFalsetrouter(R((t7/home/camdpams_www/Products_Activation/gluon/rewrite.pyt_router_default"s    cCst}|pd|_|pd|_d|_d|_g|_g|_g|_ g|_ g|_ d |_ d|_dddd |_d |_|S( s%return new copy of default parameterstBASERRR s%

%s

s

Internal error

Ticket issued: %(ticket)sN(RtptapptnameRRRt routes_appt routes_int routes_outtroutes_onerrortroutes_apps_rawRt error_handlert error_messageterror_message_tickettrouters(RR((Rt_params_default6s            RRRRRRR R R tdomainRR t path_prefixRt map_staticRRRcCs%tot||Snt||S(sparse and rewrite incoming URLN(R&t map_url_intrequesttenviront regex_url_in(R,R-((Rturl_infsc CsJto,t|||||} d| |f} n&d||||f} t | |} |p | dj o|djo t}qn| p |tjo:|o)|i o|i iddi}qd}n|dj o!|tjo|i i}qn|o;| djo d} n d| } d||| | f} n| S( s!assemble and rewrite outgoing URLs%s%ss /%s/%s/%s%stWSGI_URL_SCHEMEthttpts:%ss %s://%s%s%sN(R&t map_url_outR,t applicationt controllertfunctiontargstacftotherturltregex_filter_outtenvtschemetportRthosttTruetgettlowert http_host( R,R<R4R5R6R7R9R=R?R>R8R:((Rturl_outls,       cCstt|iid}|djotiiotd|i |fd|i d|df}xtiiD]\}}||jo|djoPnVd|jo&d ||||ii|if}n#d ||||ii|if}td d |d |SqvqvWn|S(s6called from main.wsgibase to rewrite the http responseiis%s/%ss%s/*s*/%ss*/*t!t?s4%s&code=%s&ticket=%s&requested_uri=%s&request_url=%ss4%s?code=%s&ticket=%s&requested_uri=%s&request_url=%si/s.You are being redirected heretLocationN(tinttstrt http_objecttstatustsplittthreadtroutesR!tsetR,R4tkeystkeytredirtticketR<t request_uriR:tHTTP(RJR,RSRKRQRRRPR:((Rttry_redirect_on_errors 0    &"s routes.pycBs|djo+eaeddate_dane |eoed|}d} n|dj o d} n||djoe|} ned||} ei i| pdSne| d}|iidd }|ih}y|d |UWn6ej o*}eid | ei|nXe|} xTdD]L}||jo9x6||D]&\} } | |i e!| | qsWqUqUWx-dD]%}||jo||| |.*)s (?P<%s>\w+)s\g<%s>N(Rptk0tfindtiRitregex_anythingtfindalltitemRgtregex_atRqtretcompiletDOTALL(RpRqRRR((RRss.   cCsJxtiD]}||jo|i|tti} |djoCx@t|iD]*}|t jot d||fqZqZWn| i t|| t|tctlr(RuR(RR>RRRRQRRRvRRR((RR}7s               # ,$  )      *  L   c Cs|d} |iddi}|id}|djo|| }nd|idd|idd i||id d i| f} x[|D]S\}}|i | o7|i || }tid || ||f|SqqWtid || |f|S(s-filter incoming URI against a list of regexest PATH_INFOt HTTP_HOSTt localhostRis%s:%s://%s:%s %st REMOTE_ADDRR0R1tREQUEST_METHODRAs%s: [%s] [%s] -> %ss%s: [%s] -> %s (not rewritten)N(RjR_RARBR?RRRQtregexestregextvaluetmatchtsubt rewrittenRkR~ttagR( RjRRRRRRRR?RQR_((Rt regex_uris  I  cCs|oti|tt_ng|oVtioLtot ||dt qt |tid}ti|tt_n tt_t idtii|S(sF select a set of regex rewrite params for the current request RRsselect routing parameters: %sN(RR[RAR\RMRNR<RR&R+R,R@RRkR~R(R<RR,((Rt regex_selects cCs|idd }|d|o d|pd|d \w+) # b=app /static # /b/static /(?P (\w[\-\=\./]?)* ) # x=file $) s (^( # (/a/c/f.e/s) /(?P [\w\s+]+ ) # /a=app ( # (/c.f.e/s) /(?P [\w\s+]+ ) # /a/c=controller ( # (/f.e/s) /(?P [\w\s+]+ ) # /a/c/f=function ( # (.e) \.(?P [\w\s+]+ ) # /a/c/f.e=extension )? ( # (/s) /(?P # /a/c/f.e/r=raw_args .* ) )? )? )? )? /?$) sy (^ (?P ( [\w@/-][=.]? )* # s=args )? /?$) # trailing slash c Cs-td|d|tiiot|}nx9|iD]+\}}||i |i i dd %ssroutes_out: [%s] not rewrittenN(thasattrRMRR&R:RNR RLRRjRARBR?RRRRRRRRRkR~(R:RjRRRRR?R((RR;?s,   U *RAs0.0.0.0cCstid} | i|} | idi} | idi}| id}|i d}|djot |}n|| ||d}}ti|}hd|<d |<d | <d |<d |<d |<d|<d|<d|<d| <d|<}t}ti|dhttp|https|HTTP|HTTPS)\://(?P[^/]*)(?P.*)R=R?turiRFiiRRR0RRRRRRRRCRRRiR2isat least /a/c/f is requireds%s/%ss /%s/%s/%sRs.%ss %ss ?%ss (%s)N(8RRRRR:RRBR=R?RRRpRRt query_stringturllibtunquotetremotetmethodRjRR,tglobal_settingsRR<tlangt uri_languageRR&R+R@RtoutR(tdomain_applicationtdomain_controllertlstripRLRRtAssertionErrorRRRR;R3R8RR/RR4R5R6tresultRR7(R:RRRRRR(R<RRRR=RRR?RRjRR8RRRpR,RR((Rt filter_url[sn i       ttktcCs|djotiiotd||fd|d|df}xtiiD]t\}}||jo[|djoPnBd|jo|dd ||f}n|dd ||f}|SqQqQWn|S( s,doctest/unittest interface to routes_onerroris%s/%ss%s/*s*/%ss*/*RERFRscode=%s&ticket=%sN( RKRMRNR!ROR4RPRQRRRSR:(RKR4RSRPRRR:RQ((Rt filter_errs*    tMapUrlIncBstZdZeedZdZdZdZdZdZ dZ dZ d Z d Z ed Zed Zd ZRS(slogic for mapping incoming URLscCsk||_||_d|_d|_d|_d|_d|_d|_ t |_ t |_ t |_ d|_t|_|id}|iidd|_|id}d||id<|id|iod|ipd|id<|ido|d }nt|o|idpg|_|iid d |_|iid d i|_|iid di|_|iid|_d|_|ip.|iid|_|iid|_n|ipd |_d|_nd|ijo"|iid\|_|_n|ip*|idjo d|_qgd|_ndS(sinitialize a map-in objectRRRRRFR2RiRRR0R1RRARt SERVER_NAMEt SERVER_PORTt80Rthttpst443N(R,tselfR<RRR4tlanguageR5R6RRORR R R RRR_RARRRRRLR7RRBR=RR?R>(RR,R<R_((Rt__init__sN              0&     "  cCstii}|o{t|}|t|ijodSnx4t|D]&}|||i|jodSqJqJWt |i||_ndS(s-strip path prefix, if present in its entiretyN( R&RR)tprefixRt prefixlenRR7txrangeRR(RRRR((Rt map_prefixs    cCsti}d |_d |_|i}|i o||i jo ||_ n|i |i f|i joI|i |i |i f\|_ |_|i |id<|i|idRR<Rt pop_arg_ifRRRURMRNR$RkR~R,RRRR R R RRR(RRR((Rtmap_appsN     %" 6cCst|idjor|i|iijo\d|_|i_ti i |ii i d|i |i|i}tid||SndS(s handle root-static files (no hyphen mapping) a root-static file is one whose incoming URL expects it to be at the root, typically robots.txt & favicon.ico iRRsroute: root static=%sN(RRR7RRR R5R,RbR_RR<RR4troot_static_fileRkR~R(RR((Rtmap_root_static4s, cCs|i}|o'|io||ijo ||_n |i|_|io7tid|i|i|i|j|i}ndS(s#handle language (no hyphen mapping)sroute: language=%sN(RRR RR RkR~R(RR((Rt map_languageDs !   cCs|i}| p|io'||ijo|ipd|_n ||_|i||ijtid|i|i i i |ip#t dt iidddndS(sidentify controllerR2sroute: controller=%sisinvalid requestRsinvalid controllerN(RRRRRR5RRkR~RRRRURMRNR$(RR((Rtmap_controllerPs " cCs|idjod Sndi|i}|iii|p#t dt i i dddn|i o4tii|iiid|id|i |}n|i ptii| o.tii|iiid|id|}ntid||S( sN handle static files file_match but no hyphen mapping RRisinvalid requestRsinvalid static fileRsroute: static=%sN(RR5RRR7tfileRRRRURMRNR$RRbR_R,R<RR4RRRkR~(RRR((RR*_s"   cCso|i}| p-|ioZ||ijoJ|i|ijo7|iipd|_|i |o |i|jnW|i d}t |djo|d|_|d|_ n ||_|i ttid|i|i f|iii|ip#tdtiidd d n|i o=|iii|i  o#tdtiidd d nd S( shandle function.extensionR2RYiiisroute: function.ext=%s.%sisinvalid requestRsinvalid functionsinvalid extensionN(RRRR R5RRRR6RRLtfunc_extRRR@RkR~RRRURMRNR$(RRR((Rt map_functionzs$ 5!   $cCsUxN|iD]C}|iii|p'tdtii ddd|q q WdS(s7 check args against validation pattern isinvalid requestRsinvalid arg <%s>N( RR7targRRRRURMRNR$(RR((Rt validate_argss  c Cs|i|i_|i|i_|i|i_|i|i_|i|i_|io|i|i_nd|i|i|if}|i o|i dd}n|idjo|d|i7}n|iod|i|f}n||ioAt i ddig}|iD]}|t|q~pd7}||iod |ipd7}||id / /a/dc/df => /a /a/c/df => /a/c We would also like to be able to strip the default application or application/controller from URLs with function/args present, thus: /da/c/f/args => /c/f/args /da/dc/f/args => /f/args We use [applications] and [controllers] to suppress ambiguous omissions. We assume that language names do not collide with a/c/f names. N(RR4R5R6R7R,R R8(R,R4R5R6R7R ((RR3sscCs+t p |tjodSntt|S(sKreturn a private copy of the effective router for the specified applicationN(R&RyRR(Ry((Rtget_effective_routers(;RRbRtloggingRmt threadingRtstorageRRR1RUt fileutilsRatsettingsRt getLoggerRktlocalRMRRR'RZR[R\RNR&RORR{R/RDRVR|RRRRsR}RRRRtXRRRR.R;RRRtobjectRRR+R3R()R|RURR}R.RRRRR+R/RRR3RRRRRRRRkR;RVRRaRRDRRRRsR'RMR{RmRRRRRb((RRFsZ              ?   l % Y    F $R