diff -r 058bb3dc685f -r 0b59724cb3f2 web/views/apacherewrite.py --- a/web/views/apacherewrite.py Mon Jan 04 18:40:30 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,111 +0,0 @@ -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. -# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr -# -# This file is part of CubicWeb. -# -# CubicWeb is free software: you can redistribute it and/or modify it under the -# terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 2.1 of the License, or (at your option) -# any later version. -# -# CubicWeb is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License along -# with CubicWeb. If not, see . -"""provide class to do Apache rewrite rules'job inside cubicweb (though functionnalities -are much more limited for the moment) - -""" - -__docformat__ = "restructuredtext en" - -from re import compile - -from cubicweb.web import Redirect -from cubicweb.web.component import Component - -class RewriteCond(object): - def __init__(self, condition, match='host', rules=(), action='rewrite'): - self.condition = compile(condition) - assert match in ('host', 'path'), match - self.match_part = match - self.rules = [] - for rule, replace in rules: - rulergx = compile(rule) - self.rules.append( (rulergx, replace) ) - assert action in ('rewrite', 'redirect', 'stop'), action - self.process = getattr(self, 'action_%s' % action) - - def match(self, **kwargs): - self._match = self.condition.match(kwargs[self.match_part]) - return not self._match is None - - def action_rewrite(self, path): - for rgx, replace in self.rules: - if not rgx.match(path) is None: - matchdict = self._match.groupdict() or None - if not matchdict is None: - replace = replace % matchdict - return rgx.sub(replace, path) - return path - - def action_redirect(self, path): - url = self.action_rewrite(path) - raise Redirect(url) - - def action_stop(self, path): - return path - - -class ApacheURLRewrite(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.*)\.logilab\.fr', match='host', - rules=[('/(.*)', r'/m_%(cat)s/\1')]), - ] - """ - __abstract__ = True - __regid__ = 'urlrewriter' - rules = [] - - def get_rules(self, req): - return self.rules - - def rewrite(self, host, path, req): - for cond in self.get_rules(req): - if cond.match(host=host, path=path): - return cond.process(path) - return path