This is an automated email from the ASF dual-hosted git repository.

markt 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 9cc2b05cb9 Fix a regression in the previous release when logging the 
query string
9cc2b05cb9 is described below

commit 9cc2b05cb9862b541951ca244e1b41fb1ed6057e
Author: Mark Thomas <[email protected]>
AuthorDate: Wed Apr 1 14:30:31 2026 +0100

    Fix a regression in the previous release when logging the query string
    
    "?-"could appear in the access log rather than "?" when the query string
    was present but empty
---
 .../apache/catalina/valves/AbstractAccessLogValve.java    | 15 ++++++++++++---
 test/org/apache/catalina/valves/TestAccessLogValve.java   | 12 ++++++++++--
 webapps/docs/changelog.xml                                |  5 +++++
 3 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/java/org/apache/catalina/valves/AbstractAccessLogValve.java 
b/java/org/apache/catalina/valves/AbstractAccessLogValve.java
index e5f14f0424..55db894ec7 100644
--- a/java/org/apache/catalina/valves/AbstractAccessLogValve.java
+++ b/java/org/apache/catalina/valves/AbstractAccessLogValve.java
@@ -1132,9 +1132,13 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
                     buf.append(request.getMethod());
                     buf.append(' ');
                     escapeAndAppend(request.getRequestURI(), buf);
-                    if (request.getQueryString() != null) {
+                    String query = request.getQueryString();
+                    if (query != null) {
                         buf.append('?');
-                        escapeAndAppend(request.getQueryString(), buf);
+                        // Don't want to write "-" if the query string is empty
+                        if (!query.isEmpty()) {
+                            escapeAndAppend(query, buf);
+                        }
                     }
                     buf.append(' ');
                     buf.append(request.getProtocol());
@@ -1331,7 +1335,12 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
             }
             if (query != null) {
                 buf.append('?');
-                escapeAndAppend(query, buf);
+                // Don't want to write "-" if the query string is empty
+                if (!query.isEmpty()) {
+                    escapeAndAppend(query, buf);
+                }
+            } else {
+                buf.append('-');
             }
         }
     }
diff --git a/test/org/apache/catalina/valves/TestAccessLogValve.java 
b/test/org/apache/catalina/valves/TestAccessLogValve.java
index ded7d437c2..a244bd5850 100644
--- a/test/org/apache/catalina/valves/TestAccessLogValve.java
+++ b/test/org/apache/catalina/valves/TestAccessLogValve.java
@@ -114,10 +114,18 @@ public class TestAccessLogValve extends TomcatBaseTest {
         parameterSets.add(new Object[] {"pct-m", JSON_TYPE, "/", "%m", 
"\\{\"method\":\"GET\"\\}"});
         parameterSets.add(new Object[] {"pct-p", TEXT_TYPE, "/", "%p", 
"\\d+"});
         parameterSets.add(new Object[] {"pct-p", JSON_TYPE, "/", "%p", 
"\\{\"port\":\"\\d+\"\\}"});
+        parameterSets.add(new Object[] {"pct-q", TEXT_TYPE, "/", "%q", "-"});
+        parameterSets.add(new Object[] {"pct-q", JSON_TYPE, "/", "%q", 
"\\{\"query\":\"-\"\\}"});
+        parameterSets.add(new Object[] {"pct-q", TEXT_TYPE, "/?", "%q", 
"\\?"});
+        parameterSets.add(new Object[] {"pct-q", JSON_TYPE, "/?", "%q", 
"\\{\"query\":\"\\?\"\\}"});
         parameterSets.add(new Object[] {"pct-q", TEXT_TYPE, "/?data=123", 
"%q", "\\?data=123"});
         parameterSets.add(new Object[] {"pct-q", JSON_TYPE, "/?data=123", 
"%q", "\\{\"query\":\"\\?data=123\"\\}"});
         parameterSets.add(new Object[] {"pct-r", TEXT_TYPE, "/", "%r", "GET / 
HTTP/1.1"});
         parameterSets.add(new Object[] {"pct-r", JSON_TYPE, "/", "%r", 
"\\{\"request\":\"GET / HTTP/1.1\"\\}"});
+        parameterSets.add(new Object[] {"pct-r", TEXT_TYPE, "/?", "%r", "GET 
/\\? HTTP/1.1"});
+        parameterSets.add(new Object[] {"pct-r", JSON_TYPE, "/?", "%r", 
"\\{\"request\":\"GET /\\? HTTP/1.1\"\\}"});
+        parameterSets.add(new Object[] {"pct-r", TEXT_TYPE, "/?data=123", 
"%r", "GET /\\?data=123 HTTP/1.1"});
+        parameterSets.add(new Object[] {"pct-r", JSON_TYPE, "/?data=123", 
"%r", "\\{\"request\":\"GET /\\?data=123 HTTP/1.1\"\\}"});
         parameterSets.add(new Object[] {"pct-s", TEXT_TYPE, "/", "%s", "200"});
         parameterSets.add(new Object[] {"pct-s", JSON_TYPE, "/", "%s", 
"\\{\"statusCode\":\"200\"\\}"});
         parameterSets.add(new Object[] {"pct-S", TEXT_TYPE, "/", "%S", 
"[A-F0-9]{32}"});
@@ -312,9 +320,9 @@ public class TestAccessLogValve extends TomcatBaseTest {
         Assert.assertFalse("Access log line empty after " + 
(System.currentTimeMillis() - startWait) + " milliseconds", "".equals(result));
         boolean matches = Pattern.matches(resultMatch, result);
         if (!matches) {
-            log.error("Resulting log line '" + result + "' does not match '" + 
resultMatch + "'");
+            log.error("Resulting log line '" + result + "' does not match 
pattern '" + resultMatch + "'");
         }
-        Assert.assertTrue("Resulting log line '" + result + "' does not match 
'" + resultMatch + "'", matches);
+        Assert.assertTrue("Resulting log line '" + result + "' does not match 
pattern '" + resultMatch + "'", matches);
 
         if (JSON_TYPE.equals(type)) {
             JSONParser parser = new JSONParser(result);
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 42c21e9fc9..2edd36ece9 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -111,6 +111,11 @@
         Refactor generation of the remote user element in the access log to
         remove unnecessary code. (markt)
       </scode>
+      <fix>
+        Fix a regression in the previous release that meant <code>?-</code>
+        could appear in the access log rather than <code>?</code> when the 
query
+        string was present but empty. (markt)
+      </fix>
     </changelog>
   </subsection>
 </section>


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to