This is an automated email from the ASF dual-hosted git repository. rzo1 pushed a commit to branch tomee-10.x in repository https://gitbox.apache.org/repos/asf/tomee.git
commit 69235dff1316fe5c41e3eeda7c0e9dde2ead9af0 Author: Markus Jung <[email protected]> AuthorDate: Sat Aug 29 21:22:10 2026 +0200 dont emit stacktrace on error (cherry picked from commit d6b880f60ae99e621f826a0eec7d742b70b55a2e) --- .../openejb/server/httpd/HttpResponseImpl.java | 46 +++------------------- .../openejb/server/httpd/OpenEJBHttpServer.java | 3 +- .../server/httpd/OpenEJBHttpServerTest.java | 28 +++++++++++++ 3 files changed, 34 insertions(+), 43 deletions(-) diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java index 20e90758dd..6de2496fe7 100644 --- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java +++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java @@ -39,7 +39,6 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.StringTokenizer; import static java.util.Collections.singletonList; @@ -583,11 +582,11 @@ public class HttpResponseImpl implements HttpResponse { /** * creates an error with user defined variables * - * @param message the message of the error - * @param t a Throwable to print a stack trace to + * @param message the message of the error, logged when debug logging is enabled + * @param t the cause of the error, logged when debug logging is enabled * @return the HttpResponseImpl that this error belongs to */ - protected static HttpResponseImpl createError(String message, final Throwable t) { + protected static HttpResponseImpl createError(final String message, final Throwable t) { final HttpResponseImpl res = new HttpResponseImpl(500, "Internal Server Error", "text/html"); final PrintWriter body; try { @@ -602,45 +601,10 @@ public class HttpResponseImpl implements HttpResponse { body.println("<br><br>"); if (LOGGER.isDebugEnabled()) { // this is not an error, don't log it by default - LOGGER.error(String.valueOf(t), t); + LOGGER.error(message, t); } - if (message != null) { - final StringTokenizer msg = new StringTokenizer(message, "\n\r"); - - while (msg.hasMoreTokens()) { - body.print(msg.nextToken()); - body.println("<br>"); - } - } - - if (t != null) { - - PrintWriter writer = null; - - try { - body.println("<br><br>"); - body.println("Stack Trace:<br>"); - final ByteArrayOutputStream baos = new ByteArrayOutputStream(); - writer = new PrintWriter(baos); - t.printStackTrace(writer); - writer.flush(); - - message = new String(baos.toByteArray()); - final StringTokenizer msg = new StringTokenizer(message, "\n\r"); - - while (msg.hasMoreTokens()) { - body.print(msg.nextToken()); - body.println("<br>"); - } - } catch (final Exception e) { - //no-op - } finally { - if (writer != null) { - writer.close(); - } - } - } + body.println("The server encountered an internal error."); body.println("</body>"); body.println("</html>"); diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java index 4f83cc4a97..1cf463852f 100644 --- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java +++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java @@ -271,8 +271,7 @@ public class OpenEJBHttpServer implements HttpServer { res.setCode(400); res.setResponseString("Could not read the request"); try { - res.getWriter().println(t.getMessage()); - t.printStackTrace(res.getWriter()); + res.getWriter().println("Bad request"); } catch (IOException e) { // no-op } diff --git a/server/openejb-http/src/test/java/org/apache/openejb/server/httpd/OpenEJBHttpServerTest.java b/server/openejb-http/src/test/java/org/apache/openejb/server/httpd/OpenEJBHttpServerTest.java index 959ff518d8..ef3d1b0440 100644 --- a/server/openejb-http/src/test/java/org/apache/openejb/server/httpd/OpenEJBHttpServerTest.java +++ b/server/openejb-http/src/test/java/org/apache/openejb/server/httpd/OpenEJBHttpServerTest.java @@ -28,7 +28,11 @@ import org.apache.openejb.util.NetworkUtil; import org.junit.Test; import org.junit.runner.RunWith; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.OutputStream; import java.net.HttpURLConnection; +import java.net.Socket; import java.net.URL; import java.security.Principal; import java.util.ArrayList; @@ -39,6 +43,7 @@ import java.util.concurrent.CopyOnWriteArrayList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; @EnableServices({"httpejbd"}) @RunWith(ApplicationComposer.class) @@ -74,6 +79,29 @@ public class OpenEJBHttpServerTest { } } + @Test + public void malformedRequestResponseContainsNoServerDetails() throws Exception { + final String response; + try (final Socket socket = new Socket("localhost", nextAvailablePort)) { + final OutputStream out = socket.getOutputStream(); + out.write("GET /foo HTTP/1.1\r\nno-colon-header\r\n\r\n".getBytes()); + out.flush(); + socket.shutdownOutput(); + final InputStream in = socket.getInputStream(); + final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + final byte[] chunk = new byte[1024]; + int read; + while ((read = in.read(chunk)) != -1) { + buffer.write(chunk, 0, read); + } + response = buffer.toString(); + } + assertTrue(response, response.startsWith("HTTP/1.1 500 ")); + assertFalse(response, response.contains("Exception")); + assertFalse(response, response.contains("org.apache.openejb")); + assertFalse(response, response.contains("\tat ")); + } + @Configuration public Properties props() { nextAvailablePort = NetworkUtil.getNextAvailablePort();
