This is an automated email from the ASF dual-hosted git repository.
markt-asf 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 a520aecb32 Fix unintentional conversion of `+` to ` ` during rule
processing
a520aecb32 is described below
commit a520aecb325e2279f2bf3a7a090ca7f61ed1c7af
Author: Mark Thomas <[email protected]>
AuthorDate: Tue Jun 30 22:51:46 2026 +0100
Fix unintentional conversion of `+` to ` ` during rule processing
Also silences exception logging when running tests or when using the
RewriteValve in embedded mode and setting the configuration directly.
---
java/org/apache/catalina/valves/rewrite/RewriteValve.java | 14 +++++++++++---
.../apache/catalina/valves/rewrite/TestRewriteValve.java | 10 ++++++++--
webapps/docs/changelog.xml | 4 ++++
3 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/java/org/apache/catalina/valves/rewrite/RewriteValve.java
b/java/org/apache/catalina/valves/rewrite/RewriteValve.java
index a162fe6274..f5bc2f52d6 100644
--- a/java/org/apache/catalina/valves/rewrite/RewriteValve.java
+++ b/java/org/apache/catalina/valves/rewrite/RewriteValve.java
@@ -17,11 +17,11 @@
package org.apache.catalina.valves.rewrite;
import java.io.BufferedReader;
+import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
-import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
@@ -174,7 +174,8 @@ public class RewriteValve extends ValveBase {
String webInfResourcePath = "/WEB-INF/" + resourcePath;
is = ((Context)
getContainer()).getServletContext().getResourceAsStream(webInfResourcePath);
if (is == null) {
- if (containerLog.isInfoEnabled()) {
+ // Don't log if the rules have been set directly via
setConfiguration()
+ if (containerLog.isInfoEnabled() && rules == null) {
containerLog.info(sm.getString("rewriteValve.noConfiguration",
webInfResourcePath));
}
} else {
@@ -187,6 +188,13 @@ public class RewriteValve extends ValveBase {
try {
ConfigurationSource.Resource resource =
ConfigFileLoader.getSource().getResource(resourceName);
is = resource.getInputStream();
+ } catch (FileNotFoundException fnfe) {
+ // Don't log if the rules have been set directly via
setConfiguration()
+ if (rules == null) {
+ if (containerLog.isInfoEnabled()) {
+
containerLog.info(sm.getString("rewriteValve.noConfiguration", resourceName),
fnfe);
+ }
+ }
} catch (IOException ioe) {
if (containerLog.isInfoEnabled()) {
containerLog.info(sm.getString("rewriteValve.noConfiguration", resourceName),
ioe);
@@ -586,7 +594,7 @@ public class RewriteValve extends ValveBase {
chunk.append(REWRITE_DEFAULT_ENCODER.encode(urlStringRewriteEncoded,
uriCharset));
// Rewriting may have denormalized the URL and added
encoded characters
// Decode then normalize
- String urlStringRewriteDecoded =
URLDecoder.decode(urlStringRewriteEncoded, uriCharset.name());
+ String urlStringRewriteDecoded =
UDecoder.URLDecode(urlStringRewriteEncoded, uriCharset);
urlStringRewriteDecoded =
RequestUtil.normalize(urlStringRewriteDecoded);
if (urlStringRewriteDecoded == null) {
// Assume bad input caused the re-write to try and
escape root
diff --git a/test/org/apache/catalina/valves/rewrite/TestRewriteValve.java
b/test/org/apache/catalina/valves/rewrite/TestRewriteValve.java
index aecc854259..21118651d0 100644
--- a/test/org/apache/catalina/valves/rewrite/TestRewriteValve.java
+++ b/test/org/apache/catalina/valves/rewrite/TestRewriteValve.java
@@ -20,7 +20,6 @@ import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
-import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.HashMap;
@@ -45,6 +44,7 @@ import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.startup.TomcatBaseTest;
import org.apache.catalina.valves.ValveBase;
import org.apache.tomcat.util.buf.ByteChunk;
+import org.apache.tomcat.util.buf.UDecoder;
import org.apache.tomcat.util.http.Method;
/*
@@ -1081,6 +1081,12 @@ public class TestRewriteValve extends TomcatBaseTest {
}
+ @Test
+ public void testEncodedUriPlus() throws Exception {
+ doTestRewriteWithEncoding("a+b");
+ }
+
+
private void doTestRewriteWithEncoding(String segment) throws Exception {
doTestRewriteWithEncoding(segment, segment, null);
}
@@ -1111,7 +1117,7 @@ public class TestRewriteValve extends TomcatBaseTest {
String body = res.toString();
Assert.assertTrue(body, body.contains("REQUEST-URI: /target/" +
expectedSegment));
Assert.assertTrue(body, body.contains("PATH-INFO: /" +
- URLDecoder.decode(expectedSegment, "UTF-8")));
+ UDecoder.URLDecode(expectedSegment, StandardCharsets.UTF_8)));
Assert.assertTrue(body, body.contains("REQUEST-QUERY-STRING: " +
expectedQueryString));
}
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 56f86e52b6..a5383042c8 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -148,6 +148,10 @@
<fix>
Various edge cases for SSI substitutions, quoting and escaping. (remm)
</fix>
+ <fix>
+ Fix unintentional conversion of literal <code>+</code> to a space
during
+ rule processing in the <code>RewriteValve</code>. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Coyote">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]