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