From 23319964c6debad9370935d05cef246faf95bc76 Mon Sep 17 00:00:00 2001 From: SHIVAM RAWAT Date: Thu, 9 Oct 2025 09:38:16 +0530 Subject: [PATCH 1/2] supporting streamable http in mcp --- libs/utils/src/main/java/com/akto/testing/ApiExecutor.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libs/utils/src/main/java/com/akto/testing/ApiExecutor.java b/libs/utils/src/main/java/com/akto/testing/ApiExecutor.java index 1fffd835d3..ddbae32762 100644 --- a/libs/utils/src/main/java/com/akto/testing/ApiExecutor.java +++ b/libs/utils/src/main/java/com/akto/testing/ApiExecutor.java @@ -562,7 +562,7 @@ private static OriginalHttpResponse sendWithRequestBody(OriginalHttpRequest requ if (payload == null) payload = ""; if (body == null) {// body not created by GRPC block yet - if (request.getHeaders().containsKey("charset")) { + if (request.getHeaders().containsKey("charset") || isJsonRpcRequest(request)) { body = RequestBody.create(payload, null); request.getHeaders().remove("charset"); } else { @@ -755,6 +755,11 @@ private static boolean shouldInitiateSSEStream(OriginalHttpRequest request) { return true; } + // Return false for streamable HTTP requests for MCP + if ("/mcp".equals(request.getPath())) { + return false; + } + for (Map.Entry> entry : request.getHeaders().entrySet()) { if (HttpRequestResponseUtils.HEADER_ACCEPT.equalsIgnoreCase(entry.getKey()) && entry.getValue() != null && !entry.getValue().isEmpty()) { From 17bdba301084aa081a877679e085ef0b87ce7ae3 Mon Sep 17 00:00:00 2001 From: SHIVAM RAWAT Date: Thu, 9 Oct 2025 11:41:58 +0530 Subject: [PATCH 2/2] supporting streamable http in mcp --- .../src/main/java/com/akto/testing/ApiExecutor.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libs/utils/src/main/java/com/akto/testing/ApiExecutor.java b/libs/utils/src/main/java/com/akto/testing/ApiExecutor.java index ddbae32762..6c3e2667c1 100644 --- a/libs/utils/src/main/java/com/akto/testing/ApiExecutor.java +++ b/libs/utils/src/main/java/com/akto/testing/ApiExecutor.java @@ -747,6 +747,7 @@ private static void closeSseSession(SseSession session) throws InterruptedExcept } private static boolean shouldInitiateSSEStream(OriginalHttpRequest request) { + if (!isJsonRpcRequest(request)) { return false; } @@ -755,11 +756,6 @@ private static boolean shouldInitiateSSEStream(OriginalHttpRequest request) { return true; } - // Return false for streamable HTTP requests for MCP - if ("/mcp".equals(request.getPath())) { - return false; - } - for (Map.Entry> entry : request.getHeaders().entrySet()) { if (HttpRequestResponseUtils.HEADER_ACCEPT.equalsIgnoreCase(entry.getKey()) && entry.getValue() != null && !entry.getValue().isEmpty()) { @@ -770,6 +766,10 @@ private static boolean shouldInitiateSSEStream(OriginalHttpRequest request) { } } } + // Check if x-akto-sse-endpoint header exists, return false if it doesn't + if (request.findHeaderValue("x-akto-sse-endpoint") == null) { + return false; + } return true; } }