diff --git a/agent/agent_common/src/main/java/com/intuit/tank/http/BaseRequest.java b/agent/agent_common/src/main/java/com/intuit/tank/http/BaseRequest.java index 061f7b5df..eea7cfbd7 100644 --- a/agent/agent_common/src/main/java/com/intuit/tank/http/BaseRequest.java +++ b/agent/agent_common/src/main/java/com/intuit/tank/http/BaseRequest.java @@ -288,6 +288,9 @@ public String getReqQueryString() { @SuppressWarnings("rawtypes") public void logRequest(String url, String body, String method, Map headerInformation, List cookies, boolean force) { + if (!force && (logUtil == null || !logUtil.isDebugMode())) { + return; + } try { StringBuilder sb = new StringBuilder(); diff --git a/agent/agent_common/src/main/java/com/intuit/tank/http/TankHttpLogger.java b/agent/agent_common/src/main/java/com/intuit/tank/http/TankHttpLogger.java index 73b0c466e..6518c8f15 100644 --- a/agent/agent_common/src/main/java/com/intuit/tank/http/TankHttpLogger.java +++ b/agent/agent_common/src/main/java/com/intuit/tank/http/TankHttpLogger.java @@ -43,4 +43,15 @@ public interface TankHttpLogger { * @return */ public AgentConfig getAgentConfig(); + + /** + * Returns true if the debugger is running the client code. + * Used to gate expensive request/response logging that is only + * consumed by the debugger UI. + * + * @return true if running inside the Tank Debugger tool + */ + default boolean isDebugMode() { + return false; + } } diff --git a/agent/agent_common/src/test/java/com/intuit/tank/http/BaseRequestTest.java b/agent/agent_common/src/test/java/com/intuit/tank/http/BaseRequestTest.java index fb1842df9..c5f0836b4 100644 --- a/agent/agent_common/src/test/java/com/intuit/tank/http/BaseRequestTest.java +++ b/agent/agent_common/src/test/java/com/intuit/tank/http/BaseRequestTest.java @@ -1,5 +1,6 @@ package com.intuit.tank.http; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.nio.charset.StandardCharsets; @@ -244,7 +245,7 @@ public void testLogRequest() { Map headerInformation = Map.of("testHeaderKey", "testHeaderValue"); List cookies = List.of("testCookie"); fixture.logRequest("testUrl", "testBody", "testMethod", headerInformation, - cookies, false); + cookies, true); assertEquals("REQUEST URL: testMethod testUrl\n" + "CONTENT TYPE: application/x-www-form-urlencoded\n" + "REQUEST HEADER: testHeaderKey = testHeaderValue\n" + @@ -270,4 +271,61 @@ public void testAsync() { fixture.setAsync(true); assertTrue(fixture.getAsync()); } + + @Test + @DisplayName("logRequest skips string building when debugger is not running") + public void logRequest_skipsWhenNotDebugMode() { + // MockBaseRequest uses MockLogUtil which has isDebugMode() = false (default) + BaseRequest fixture = new MockBaseRequest(null); + Map headers = Map.of("key", "value"); + List cookies = List.of("cookie1"); + fixture.logRequest("http://test.com", "body", "GET", headers, cookies, false); + + assertNull(fixture.logMsg, + "logMsg should remain null when debugger is not running and force is false"); + } + + @Test + @DisplayName("logRequest populates logMsg when force=true even if debugger is not running") + public void logRequest_populatesWhenForced() { + BaseRequest fixture = new MockBaseRequest(null); + Map headers = Map.of("key", "value"); + List cookies = List.of("cookie1"); + fixture.logRequest("http://test.com", "body", "GET", headers, cookies, true); + + assertNotNull(fixture.logMsg, + "logMsg should be populated when force=true regardless of debug mode"); + assertTrue(fixture.logMsg.contains("REQUEST URL: GET http://test.com")); + } + + @Test + @DisplayName("logRequest populates logMsg when debugger is running") + public void logRequest_populatesWhenDebugMode() { + // Create a request with a logUtil that reports debug mode = true + MockLogUtil debugLogUtil = new MockLogUtil() { + @Override + public boolean isDebugMode() { + return true; + } + }; + BaseRequest fixture = new MockBaseRequest(null) { + { + // Re-initialize with debug-enabled logUtil via reflection or direct field + } + }; + // Use a custom MockBaseRequest that injects the debug logUtil + BaseRequest debugFixture = new BaseRequest(null, debugLogUtil) { + @Override public void setKey(String key, String value) {} + @Override public String getKey(String key) { return null; } + @Override public void setNamespace(String name, String value) {} + }; + + Map headers = Map.of("key", "value"); + List cookies = List.of("cookie1"); + debugFixture.logRequest("http://test.com", "body", "GET", headers, cookies, false); + + assertNotNull(debugFixture.logMsg, + "logMsg should be populated when debugger is running"); + assertTrue(debugFixture.logMsg.contains("REQUEST URL: GET http://test.com")); + } } diff --git a/agent/apiharness/src/main/java/com/intuit/tank/http/HttpRequestFactory.java b/agent/apiharness/src/main/java/com/intuit/tank/http/HttpRequestFactory.java index 6a02618ec..146d55389 100644 --- a/agent/apiharness/src/main/java/com/intuit/tank/http/HttpRequestFactory.java +++ b/agent/apiharness/src/main/java/com/intuit/tank/http/HttpRequestFactory.java @@ -58,5 +58,10 @@ public AgentConfig getAgentConfig() { return APITestHarness.getInstance().getTankConfig().getAgentConfig(); } + @Override + public boolean isDebugMode() { + return APITestHarness.getInstance().isDebug(); + } + } }