You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2018/09/20 09:03:05 UTC

svn commit: r1841445 - in /tomcat/trunk: java/org/apache/catalina/valves/rewrite/ test/org/apache/catalina/valves/rewrite/ webapps/docs/

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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org