This is an automated email from the ASF dual-hosted git repository. remm pushed a commit to branch 9.0.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/9.0.x by this push: new ea5061f Fix use of multiple parameters when defining RewriteMaps ea5061f is described below commit ea5061f93b9131b6257bce585c190de3bf6e5fe7 Author: remm <r...@apache.org> AuthorDate: Tue May 19 16:12:30 2020 +0200 Fix use of multiple parameters when defining RewriteMaps Missing part of PR #221. --- .../catalina/valves/rewrite/LocalStrings.properties | 2 ++ java/org/apache/catalina/valves/rewrite/RewriteMap.java | 5 ++++- java/org/apache/catalina/valves/rewrite/RewriteValve.java | 15 ++++++++++----- .../apache/catalina/valves/rewrite/TestRewriteValve.java | 6 ++++++ .../apache/catalina/valves/rewrite/TesterRewriteMapA.java | 6 +++++- webapps/docs/changelog.xml | 4 ++++ 6 files changed, 31 insertions(+), 7 deletions(-) diff --git a/java/org/apache/catalina/valves/rewrite/LocalStrings.properties b/java/org/apache/catalina/valves/rewrite/LocalStrings.properties index e67d4ba..c7541e7 100644 --- a/java/org/apache/catalina/valves/rewrite/LocalStrings.properties +++ b/java/org/apache/catalina/valves/rewrite/LocalStrings.properties @@ -15,6 +15,8 @@ quotedStringTokenizer.tokenizeError=Error tokenizing text [{0}] after position [{1}] from mode [{2}] +rewriteMap.tooManyParameters=Too many parameters for this map + rewriteValve.closeError=Error closing configuration rewriteValve.invalidFlags=Invalid flag in [{0}] flags [{1}] rewriteValve.invalidLine=Invalid line [{0}] diff --git a/java/org/apache/catalina/valves/rewrite/RewriteMap.java b/java/org/apache/catalina/valves/rewrite/RewriteMap.java index 43315e7..5ca73e7 100644 --- a/java/org/apache/catalina/valves/rewrite/RewriteMap.java +++ b/java/org/apache/catalina/valves/rewrite/RewriteMap.java @@ -16,6 +16,8 @@ */ package org.apache.catalina.valves.rewrite; +import org.apache.tomcat.util.res.StringManager; + /** * Interface for user defined lookup/replacement logic that can be defined in * a {@code rewrite.config} file by a {@code RewriteMap} directive. Such a map @@ -56,7 +58,8 @@ public interface RewriteMap { return; } if (params.length > 1) { - throw new IllegalArgumentException("Too many parameters for this map"); + throw new IllegalArgumentException( + StringManager.getManager(RewriteMap.class).getString("rewriteMap.tooManyParameters")); } setParameters(params[0]); } diff --git a/java/org/apache/catalina/valves/rewrite/RewriteValve.java b/java/org/apache/catalina/valves/rewrite/RewriteValve.java index 70d204b..c633bb2 100644 --- a/java/org/apache/catalina/valves/rewrite/RewriteValve.java +++ b/java/org/apache/catalina/valves/rewrite/RewriteValve.java @@ -630,12 +630,17 @@ public class RewriteValve extends ValveBase { throw new IllegalArgumentException(sm.getString("rewriteValve.invalidMapClassName", line)); } if (tokenizer.hasMoreTokens()) { - map.setParameters(tokenizer.nextToken()); + if (tokenizer.countTokens() == 1) { + map.setParameters(tokenizer.nextToken()); + } else { + List<String> params = new ArrayList<>(); + while (tokenizer.hasMoreTokens()) { + params.add(tokenizer.nextToken()); + } + map.setParameters(params.toArray(new String[0])); + } } - Object[] result = new Object[2]; - result[0] = name; - result[1] = map; - return result; + return new Object[] { name, map }; } else if (token.startsWith("#")) { // it's a comment, ignore it } else { diff --git a/test/org/apache/catalina/valves/rewrite/TestRewriteValve.java b/test/org/apache/catalina/valves/rewrite/TestRewriteValve.java index 134f45a..4c9a97c 100644 --- a/test/org/apache/catalina/valves/rewrite/TestRewriteValve.java +++ b/test/org/apache/catalina/valves/rewrite/TestRewriteValve.java @@ -107,6 +107,12 @@ public class TestRewriteValve extends TomcatBaseTest { } @Test + public void testRewriteMap07() throws Exception { + doTestRewrite("RewriteMap mapa org.apache.catalina.valves.rewrite.TesterRewriteMapA foo bar\n" + + "RewriteRule /b/.* /c/${mapa:${mapa:a}}", "/b/a.html", "/c/aaaa"); + } + + @Test public void testRewriteServerVar() throws Exception { doTestRewrite("RewriteRule /b/(.*).html$ /c%{SERVLET_PATH}", "/b/x.html", "/c/b/x.html"); } diff --git a/test/org/apache/catalina/valves/rewrite/TesterRewriteMapA.java b/test/org/apache/catalina/valves/rewrite/TesterRewriteMapA.java index 4be8fd7..0e0c5cc 100644 --- a/test/org/apache/catalina/valves/rewrite/TesterRewriteMapA.java +++ b/test/org/apache/catalina/valves/rewrite/TesterRewriteMapA.java @@ -31,8 +31,12 @@ public class TesterRewriteMapA implements RewriteMap { @Override public String setParameters(String params) { + throw new IllegalStateException(); + } + + @Override + public void setParameters(String... params) { // NO-OP - return null; } @Override diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 218abbf..1f703e7 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -52,6 +52,10 @@ of multi-line configuration in the RewriteValve. Patch provided by Jj. (markt) </fix> + <fix> + Fix use of multiple parameters when defining RewriteMaps. + (remm/fschumacher) + </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