This is an automated email from the ASF dual-hosted git repository. remm pushed a commit to branch 10.1.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/10.1.x by this push: new 79469a8d86 Fix detailed view of a connector with auto port 79469a8d86 is described below commit 79469a8d861ad34113ab33bf32906f3707a13456 Author: remm <r...@apache.org> AuthorDate: Thu Jun 27 13:05:33 2024 +0200 Fix detailed view of a connector with auto port Using the port in the mbean name for request processor is not necessarily a bad idea, but this is only added after binding so there's a difference with the connector mbean name. --- .../apache/catalina/manager/StatusTransformer.java | 17 ++++++- .../catalina/manager/TestStatusTransformer.java | 54 +++++++++++++++++++--- webapps/docs/changelog.xml | 8 ++++ 3 files changed, 71 insertions(+), 8 deletions(-) diff --git a/java/org/apache/catalina/manager/StatusTransformer.java b/java/org/apache/catalina/manager/StatusTransformer.java index bef7f8edb7..bfc83dc006 100644 --- a/java/org/apache/catalina/manager/StatusTransformer.java +++ b/java/org/apache/catalina/manager/StatusTransformer.java @@ -385,7 +385,7 @@ public class StatusTransformer { "</th><th>" + args[17] + "</th></tr>"); for (ObjectName objectName : requestProcessors) { - if (name.equals(objectName.getKeyProperty("worker"))) { + if (name.equals(getConnectorName(objectName.getKeyProperty("worker")))) { writer.print("<tr>"); writeProcessorState(writer, objectName, mBeanServer, mode); writer.print("</tr>"); @@ -428,7 +428,7 @@ public class StatusTransformer { writer.write("<workers>"); for (ObjectName objectName : requestProcessors) { - if (name.equals(objectName.getKeyProperty("worker"))) { + if (name.equals(getConnectorName(objectName.getKeyProperty("worker")))) { writeProcessorState(writer, objectName, mBeanServer, mode); } } @@ -484,6 +484,19 @@ public class StatusTransformer { } + /** + * Return the connector name without the port, for auto port connectors. + * @param name the connector name + * @return the name without the port for the auto connectors + */ + protected static String getConnectorName(String name) { + if (name.indexOf("-auto-") > 0) { + return name.substring(0, name.lastIndexOf("-")) + "\""; + } else { + return name; + } + } + /** * Write processor state. * diff --git a/test/org/apache/catalina/manager/TestStatusTransformer.java b/test/org/apache/catalina/manager/TestStatusTransformer.java index 3cd772fdd4..1a7ecfa4fc 100644 --- a/test/org/apache/catalina/manager/TestStatusTransformer.java +++ b/test/org/apache/catalina/manager/TestStatusTransformer.java @@ -17,6 +17,9 @@ package org.apache.catalina.manager; import java.io.File; +import java.io.StringReader; + +import javax.xml.parsers.DocumentBuilderFactory; import org.junit.Assert; import org.junit.Test; @@ -28,11 +31,32 @@ import org.apache.catalina.startup.SimpleHttpClient; import org.apache.catalina.startup.Tomcat; import org.apache.catalina.startup.TomcatBaseTest; import org.apache.tomcat.util.json.JSONParser; +import org.w3c.dom.Document; +import org.w3c.dom.ls.DOMImplementationLS; +import org.xml.sax.InputSource; public class TestStatusTransformer extends TomcatBaseTest { + enum Mode { + HTML, XML, JSON + } + @Test public void testJSON() throws Exception { + testStatusServlet(Mode.JSON); + } + + @Test + public void testXML() throws Exception { + testStatusServlet(Mode.XML); + } + + @Test + public void testHTML() throws Exception { + testStatusServlet(Mode.HTML); + } + + protected void testStatusServlet(Mode mode) throws Exception { Tomcat tomcat = getTomcatInstance(); // Add default servlet to make some requests @@ -65,17 +89,35 @@ public class TestStatusTransformer extends TomcatBaseTest { client.connect(); client.processRequest(true); + String requestline = null; + switch (mode) { + case XML -> requestline = "GET /status/all?XML=true HTTP/1.1"; + case JSON -> requestline = "GET /status/all?JSON=true HTTP/1.1"; + default -> requestline = "GET /status/all HTTP/1.1"; + } client.setRequest(new String[] { - "GET /status/all?JSON=true HTTP/1.1" + CRLF + + requestline + CRLF + "Host: localhost" + CRLF + "Connection: Close" + CRLF + CRLF }); client.connect(); client.processRequest(true); - String json = client.getResponseBody(); - System.out.println(json); - JSONParser parser = new JSONParser(json); - String result = parser.parse().toString(); - Assert.assertTrue(result.contains("name=localhost/")); + String body = client.getResponseBody(); + if (mode.equals(Mode.JSON)) { + JSONParser parser = new JSONParser(body); + String result = parser.parse().toString(); + Assert.assertTrue(result.contains("name=localhost/")); + } else if (mode.equals(Mode.XML)) { + try (StringReader reader = new StringReader(body)) { + Document xmlDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(reader)); + String serialized = ((DOMImplementationLS) xmlDocument.getImplementation()).createLSSerializer().writeToString(xmlDocument); + Assert.assertTrue(serialized.contains("http-nio-127.0.0.1-auto-")); + Assert.assertTrue(serialized.contains("stage=\"S\"")); + } + } else { + Assert.assertTrue(body.contains("http-nio-127.0.0.1-auto-")); + // Verify that a request is being processed + Assert.assertTrue(body.contains("<strong>S</strong>")); + } } } diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index d5afb9b694..f2e93dff1d 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -172,6 +172,14 @@ </add> </changelog> </subsection> + <subsection name="Web applications"> + <changelog> + <fix> + Fix status servlet detailed view of the connectors when using automatic + port. (remm) + </fix> + </changelog> + </subsection> <subsection name="Other"> <changelog> <update> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org