Author: remm Date: Thu Sep 20 09:03:05 2018 New Revision: 1841445 URL: http://svn.apache.org/viewvc?rev=1841445&view=rev Log: Implement some simple rewrite fixmes.
Modified: tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteCond.java tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteRule.java tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteValve.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/RewriteCond.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteCond.java?rev=1841445&r1=1841444&r2=1841445&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteCond.java (original) +++ tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteCond.java Thu Sep 20 09:03:05 2018 @@ -88,6 +88,7 @@ public class RewriteCond { protected String testString = null; protected String condPattern = null; + protected String flagsString = null; public String getCondPattern() { return condPattern; @@ -105,6 +106,14 @@ public class RewriteCond { this.testString = testString; } + public final String getFlagsString() { + return flagsString; + } + + public final void setFlagsString(String flagsString) { + this.flagsString = flagsString; + } + public void parse(Map<String, RewriteMap> maps) { test = new Substitution(); test.setSub(testString); @@ -163,8 +172,8 @@ public class RewriteCond { */ @Override public String toString() { - // FIXME: Add flags if possible - return "RewriteCond " + testString + " " + condPattern; + return "RewriteCond " + testString + " " + condPattern + + ((flagsString != null) ? (" " + flagsString) : ""); } Modified: tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteRule.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteRule.java?rev=1841445&r1=1841444&r2=1841445&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteRule.java (original) +++ tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteRule.java Thu Sep 20 09:03:05 2018 @@ -31,6 +31,7 @@ public class RewriteRule { protected String patternString = null; protected String substitutionString = null; + protected String flagsString = null; public void parse(Map<String, RewriteMap> maps) { // Parse the substitution @@ -145,8 +146,8 @@ public class RewriteRule { */ @Override public String toString() { - // FIXME: Add flags if possible - return "RewriteRule " + patternString + " " + substitutionString; + return "RewriteRule " + patternString + " " + substitutionString + + ((flagsString != null) ? (" " + flagsString) : ""); } @@ -282,6 +283,15 @@ public class RewriteRule { protected boolean qsappend = false; /** + * When the requested URI contains a query string, and the target URI does + * not, the default behavior of RewriteRule is to copy that query string + * to the target URI. Using the [QSD] flag causes the query string + * to be discarded. + * Using [QSD] and [QSA] together will result in [QSD] taking precedence. + */ + protected boolean qsdiscard = false; + + /** * Prefix Substitution with http://thishost[:thisport]/ (which makes the * new URL a URI) to force a external redirection. If no code is given * an HTTP response of 302 (FOUND, previously MOVED TEMPORARILY) is used. @@ -430,6 +440,12 @@ public class RewriteRule { public void setQsappend(boolean qsappend) { this.qsappend = qsappend; } + public final boolean isQsdiscard() { + return qsdiscard; + } + public final void setQsdiscard(boolean qsdiscard) { + this.qsdiscard = qsdiscard; + } public boolean isRedirect() { return redirect; } @@ -483,6 +499,14 @@ public class RewriteRule { this.substitutionString = substitutionString; } + public final String getFlagsString() { + return flagsString; + } + + public final void setFlagsString(String flagsString) { + this.flagsString = flagsString; + } + public boolean isHost() { return host; } Modified: tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteValve.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteValve.java?rev=1841445&r1=1841444&r2=1841445&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteValve.java (original) +++ tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteValve.java Thu Sep 20 09:03:05 2018 @@ -93,6 +93,12 @@ public class RewriteValve extends ValveB protected Map<String, RewriteMap> maps = new Hashtable<>(); + /** + * Maps configuration. + */ + protected ArrayList<String> mapsConfiguration = new ArrayList<>(); + + public RewriteValve() { super(true); } @@ -190,7 +196,12 @@ public class RewriteValve extends ValveB public String getConfiguration() { StringBuffer buffer = new StringBuffer(); - // FIXME: Output maps if possible + for (String mapConfiguration : mapsConfiguration) { + buffer.append(mapConfiguration).append("\r\n"); + } + if (mapsConfiguration.size() > 0) { + buffer.append("\r\n"); + } for (int i = 0; i < rules.length; i++) { for (int j = 0; j < rules[i].getConditions().length; j++) { buffer.append(rules[i].getConditions()[j].toString()).append("\r\n"); @@ -240,6 +251,9 @@ public class RewriteValve extends ValveB String mapName = (String) ((Object[]) result)[0]; RewriteMap map = (RewriteMap) ((Object[]) result)[1]; maps.put(mapName, map); + // Keep the original configuration line as it is not possible to get + // the parameters back without an API change + mapsConfiguration.add(line); if (map instanceof Lifecycle) { ((Lifecycle) map).start(); } @@ -305,6 +319,7 @@ public class RewriteValve extends ValveB boolean rewritten = false; boolean done = false; boolean qsa = false; + boolean qsd = false; for (int i = 0; i < rules.length; i++) { RewriteRule rule = rules[i]; CharSequence test = (rule.isHost()) ? host : urlDecoded; @@ -324,11 +339,13 @@ public class RewriteValve extends ValveB // Check QSA before the final reply if (!qsa && newtest != null && rule.isQsappend()) { - // TODO: This logic will need some tweaks if we add QSD - // support qsa = true; } + if (!qsa && newtest != null && rule.isQsdiscard()) { + qsd = true; + } + // Final reply // - forbidden @@ -360,8 +377,8 @@ public class RewriteValve extends ValveB StringBuffer urlStringEncoded = new StringBuffer(URLEncoder.DEFAULT.encode(urlStringDecoded, uriCharset)); - if (originalQueryStringEncoded != null && - originalQueryStringEncoded.length() > 0) { + if (!qsd && originalQueryStringEncoded != null + && originalQueryStringEncoded.length() > 0) { if (rewrittenQueryStringDecoded == null) { urlStringEncoded.append('?'); urlStringEncoded.append(originalQueryStringEncoded); @@ -613,6 +630,7 @@ public class RewriteValve extends ValveB condition.setCondPattern(tokenizer.nextToken()); if (tokenizer.hasMoreTokens()) { String flags = tokenizer.nextToken(); + condition.setFlagsString(flags); if (flags.startsWith("[") && flags.endsWith("]")) { flags = flags.substring(1, flags.length() - 1); } @@ -632,6 +650,7 @@ public class RewriteValve extends ValveB rule.setSubstitutionString(tokenizer.nextToken()); if (tokenizer.hasMoreTokens()) { String flags = tokenizer.nextToken(); + rule.setFlagsString(flags); if (flags.startsWith("[") && flags.endsWith("]")) { flags = flags.substring(1, flags.length() - 1); } @@ -763,6 +782,8 @@ public class RewriteValve extends ValveB // capabilities } else if (flag.startsWith("qsappend") || flag.startsWith("QSA")) { rule.setQsappend(true); + } else if (flag.startsWith("qsdiscard") || flag.startsWith("QSD")) { + rule.setQsappend(true); } else if (flag.startsWith("redirect") || flag.startsWith("R")) { rule.setRedirect(true); int redirectCode = HttpServletResponse.SC_FOUND; 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=1841445&r1=1841444&r2=1841445&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/catalina/valves/rewrite/TestRewriteValve.java (original) +++ tomcat/trunk/test/org/apache/catalina/valves/rewrite/TestRewriteValve.java Thu Sep 20 09:03:05 2018 @@ -175,6 +175,11 @@ public class TestRewriteValve extends To } @Test + public void testQueryStringRemove02() throws Exception { + doTestRewrite("RewriteRule ^/b/(.*) /c/$1 [QSD]", "/b/d?=1", "/c/d", null); + } + + @Test public void testNonAsciiQueryString() throws Exception { doTestRewrite("RewriteRule ^/b/(.*) /c?$1", "/b/id=%E5%9C%A8%E7%BA%BF%E6%B5%8B%E8%AF%95", Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1841445&r1=1841444&r2=1841445&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Thu Sep 20 09:03:05 2018 @@ -67,6 +67,14 @@ <bug>62737</bug>: Fix rewrite substitutions parsing of {} nesting. (remm) </fix> + <fix> + Add rewrite flags output when getting the rewrite configuration back. + (remm) + </fix> + <fix> + Add missing qsdiscard flag to the rewrite flags as a cleaner way to + discard the query string. (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