"""provide class to do Apache rewrite rules'job inside cubicweb (though functionnalitiesare much more limited for the moment):organization: Logilab:copyright: 2007-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved.:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr"""__docformat__="restructuredtext en"fromreimportcompilefromcubicweb.webimportRedirectfromcubicweb.web.componentimportComponentclassRewriteCond(object):def__init__(self,condition,match='host',rules=(),action='rewrite'):self.condition=compile(condition)assertmatchin('host','path'),matchself.match_part=matchself.rules=[]forrule,replaceinrules:rulergx=compile(rule)self.rules.append((rulergx,replace))assertactionin('rewrite','redirect','stop'),actionself.process=getattr(self,'action_%s'%action)defmatch(self,**kwargs):self._match=self.condition.match(kwargs[self.match_part])returnnotself._matchisNonedefaction_rewrite(self,path):forrgx,replaceinself.rules:ifnotrgx.match(path)isNone:matchdict=self._match.groupdict()orNoneifnotmatchdictisNone:replace=replace%matchdictreturnrgx.sub(replace,path)returnpathdefaction_redirect(self,path):url=self.action_rewrite(path)raiseRedirect(url)defaction_stop(self,path):returnpathclassApacheURLRewrite(Component):"""inherit from this class with actual rules to activate apache style rewriting rules should have the form : [('condition pattern 1', [('rule1 pattern', 'replace expression'), ('rule2 pattern', 'replace expression')], ('condition pattern 2', [('rule1 pattern', 'replace expression'), ('rule2 pattern', 'replace expression')] ] for instance the equivalent of the following apache rules: RewriteCond %{HTTP_HOST} ^logilab\.fr RewriteRule ^/(.*) http://www.logilab.fr/$1 [L,R=301] RewriteCond %{HTTP_HOST} ^www\.logilab\.fr RewriteRule ^/(.*) http://localhost:8080/$1 [L,P] RewriteCond %{HTTP_HOST} ^(.+)\.logilab\.fr RewriteRule ^/(data/.*) http://localhost:8080/$1 [L,P] RewriteRule ^/(json.*) http://localhost:8080/$1 [L,P] RewriteRule ^/(.*) http://localhost:8080/m_%1/$1 [L,P] could be written (considering that no "host rewritting" is necessary): class MyAppRules(ApacheURLRewrite): rules = [ RewriteCond('logilab\.fr', match='host', rules=[('/(.*)', r'http://www.logilab.fr/\1')], action='redirect'), RewriteCond('(www)\.logilab\.fr', match='host', action='stop'), RewriteCond('/(data|json)/', match='path', action='stop'), RewriteCond('(?P<cat>.*)\.logilab\.fr', match='host', rules=[('/(.*)', r'/m_%(cat)s/\1')]), ] """__abstract__=Trueid='urlrewriter'rules=[]defrewrite(self,host,path):forcondinself.rules:ifcond.match(host=host,path=path):returncond.process(path)returnpath