From e6ccb9b66c0f7d4a091688d880ab950379fd6b1f Mon Sep 17 00:00:00 2001 From: reusedname <155286845+reusedname@users.noreply.github.com> Date: Thu, 14 Nov 2024 23:16:42 +0500 Subject: [PATCH] basic debug servlet to print thread stacks --- .../ctbrec/recorder/server/DebugServlet.java | 71 +++++++++++++++++++ .../ctbrec/recorder/server/HttpServer.java | 4 ++ 2 files changed, 75 insertions(+) create mode 100644 server/src/main/java/ctbrec/recorder/server/DebugServlet.java diff --git a/server/src/main/java/ctbrec/recorder/server/DebugServlet.java b/server/src/main/java/ctbrec/recorder/server/DebugServlet.java new file mode 100644 index 00000000..dfe776ee --- /dev/null +++ b/server/src/main/java/ctbrec/recorder/server/DebugServlet.java @@ -0,0 +1,71 @@ +package ctbrec.recorder.server; + +import ctbrec.Config; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.json.JSONObject; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.net.URLDecoder; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.text.MessageFormat; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static javax.servlet.http.HttpServletResponse.*; + +@Slf4j +public class DebugServlet extends AbstractCtbrecServlet { + + public static final String BASE_URL = "/debug"; + + private static final Pattern URL_PATTERN_DEBUG_STACK = Pattern.compile(BASE_URL + "/stack(/.*?)"); + + public DebugServlet() + {} + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) { + String requestURI = req.getRequestURI().substring(req.getContextPath().length()); + try { + // boolean authenticated = checkAuthentication(req, ""); + // if (!authenticated) { + // sendResponse(resp, SC_UNAUTHORIZED, HMAC_ERROR_DOCUMENT); + // return; + // } + + Matcher m; + if ((m = URL_PATTERN_DEBUG_STACK.matcher(requestURI)).matches()) { + String threadUrl = URLDecoder.decode(m.group(1), UTF_8); + + var stacks = Thread.getAllStackTraces(); + var box = new Object() { String text = ""; };//stacks.toString(); + + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + // e.printStackTrace(pw); + + stacks.forEach((thread, stack) -> { + box.text += String.format("%s:\n", thread.getName()); + var idx = 0; + for (var s : stack) { + box.text += String.format("[%d] %s\n", idx++, s.toString()); + } + }); + + log.debug("Stacks Request {} - {}", threadUrl, stacks); + resp.setContentType("text/plain"); + sendResponse(resp, SC_OK, box.text); + } else + sendResponse(resp, SC_NOT_FOUND, ""); + } catch (Exception e) { + log.error(INTERNAL_SERVER_ERROR, e); + sendResponse(resp, SC_INTERNAL_SERVER_ERROR, INTERNAL_SERVER_ERROR); + } + } + +} diff --git a/server/src/main/java/ctbrec/recorder/server/HttpServer.java b/server/src/main/java/ctbrec/recorder/server/HttpServer.java index 7a4452ed..0b507503 100644 --- a/server/src/main/java/ctbrec/recorder/server/HttpServer.java +++ b/server/src/main/java/ctbrec/recorder/server/HttpServer.java @@ -258,6 +258,10 @@ public class HttpServer { ModelServlet modelServlet = new ModelServlet(config); holder = new ServletHolder(modelServlet); defaultContext.addServlet(holder, ModelServlet.BASE_URL + "/*"); + + DebugServlet debugServlet = new DebugServlet(); + holder = new ServletHolder(debugServlet); + defaultContext.addServlet(holder, DebugServlet.BASE_URL + "/*"); if (this.config.getSettings().webinterface) { startWebInterface(defaultContext, basicAuthContext);