Author: remm Date: Mon Sep 3 12:54:34 2018 New Revision: 1839955 URL: http://svn.apache.org/viewvc?rev=1839955&view=rev Log: 62667: Add recursion for the parsing and evaluation of map keys and values.
Modified: tomcat/trunk/java/org/apache/catalina/valves/rewrite/Substitution.java tomcat/trunk/test/org/apache/catalina/valves/rewrite/TestRewriteValve.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/catalina/valves/rewrite/Substitution.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/rewrite/Substitution.java?rev=1839955&r1=1839954&r2=1839955&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/valves/rewrite/Substitution.java (original) +++ tomcat/trunk/java/org/apache/catalina/valves/rewrite/Substitution.java Mon Sep 3 12:54:34 2018 @@ -101,14 +101,13 @@ public class Substitution { public class MapElement extends SubstitutionElement { public RewriteMap map = null; - public String key; - public String defaultValue = ""; - public int n; + public SubstitutionElement[] defaultValue = null; + public SubstitutionElement[] key = null; @Override public String evaluate(Matcher rule, Matcher cond, Resolver resolver) { - String result = map.lookup(rule.group(n)); - if (result == null) { - result = defaultValue; + String result = map.lookup(evaluateSubstitution(key, rule, cond, resolver)); + if (result == null && defaultValue != null) { + result = evaluateSubstitution(defaultValue, rule, cond, resolver); } return result; } @@ -126,6 +125,10 @@ public class Substitution { } public void parse(Map<String, RewriteMap> maps) { + this.elements = parseSubtitution(sub, maps); + } + + private SubstitutionElement[] parseSubtitution(String sub, Map<String, RewriteMap> maps) { List<SubstitutionElement> elements = new ArrayList<>(); int pos = 0; @@ -183,17 +186,20 @@ public class Substitution { if (newElement.map == null) { throw new IllegalArgumentException(sub + ": No map: " + sub.substring(open + 1, colon)); } + String key = null; + String defaultValue = null; if (def > -1) { if (!(colon < def && def < close)) { throw new IllegalArgumentException(sub); } - newElement.key = sub.substring(colon + 1, def); - newElement.defaultValue = sub.substring(def + 1, close); + key = sub.substring(colon + 1, def); + defaultValue = sub.substring(def + 1, close); } else { - newElement.key = sub.substring(colon + 1, close); + key = sub.substring(colon + 1, close); } - if (newElement.key.startsWith("$")) { - newElement.n = Integer.parseInt(newElement.key.substring(1)); + newElement.key = parseSubtitution(key, maps); + if (defaultValue != null) { + newElement.defaultValue = parseSubtitution(defaultValue, maps); } pos = close + 1; elements.add(newElement); @@ -253,7 +259,7 @@ public class Substitution { } } - this.elements = elements.toArray(new SubstitutionElement[0]); + return elements.toArray(new SubstitutionElement[0]); } @@ -265,6 +271,10 @@ public class Substitution { * @return The substitution result */ public String evaluate(Matcher rule, Matcher cond, Resolver resolver) { + return evaluateSubstitution(elements, rule, cond, resolver); + } + + private String evaluateSubstitution(SubstitutionElement[] elements, Matcher rule, Matcher cond, Resolver resolver) { StringBuffer buf = new StringBuffer(); for (int i = 0; i < elements.length; i++) { buf.append(elements[i].evaluate(rule, cond, resolver)); Modified: tomcat/trunk/test/org/apache/catalina/valves/rewrite/TestRewriteValve.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/valves/rewrite/TestRewriteValve.java?rev=1839955&r1=1839954&r2=1839955&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/catalina/valves/rewrite/TestRewriteValve.java (original) +++ tomcat/trunk/test/org/apache/catalina/valves/rewrite/TestRewriteValve.java Mon Sep 3 12:54:34 2018 @@ -81,6 +81,13 @@ public class TestRewriteValve extends To "RewriteRule /b/(.*).html$ /c/${mapa:$1|dd}", "/b/x.html", "/c/dd"); } + // BZ 62667 + @Test + public void testRewriteMap03() throws Exception { + doTestRewrite("RewriteMap mapa org.apache.catalina.valves.rewrite.TesterRewriteMapA\n" + + "RewriteRule /b/(.*).html$ /c/${mapa:$1|d$1d}", "/b/x.html", "/c/dxd"); + } + @Test public void testRewriteServerVar() throws Exception { doTestRewrite("RewriteRule /b/(.*).html$ /c%{SERVLET_PATH}", "/b/x.html", "/c/b/x.html"); Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1839955&r1=1839954&r2=1839955&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Mon Sep 3 12:54:34 2018 @@ -64,6 +64,9 @@ loaded via the service loader mechanism when the protection is enabled. (markt) </fix> + <fix> + <bug>62667</bug>: Add recursion to rewrite substitution parsing. (remm) + </fix> </changelog> </subsection> <subsection name="Coyote"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org