From b678de65141b64fa0f007b0077bc7f6e9feb57ee Mon Sep 17 00:00:00 2001 From: Christian Tzolov Date: Sun, 13 Jul 2025 10:47:33 +0200 Subject: [PATCH] fix: improve error handling in HttpClientSseClientTransport and add test - Include response body in error messages for better debugging - Change sendHttpPost return type from HttpResponse to HttpResponse - Use BodyHandlers.ofString() instead of discarding response body - Add testErrorOnBogusMessage test to verify error handling for invalid JSON-RPC messages - Test validates that malformed messages return 400 status with descriptive error message Replace #361 Signed-off-by: Christian Tzolov Co-authored-by: jkma --- .../client/transport/HttpClientSseClientTransport.java | 8 ++++---- .../transport/HttpClientSseClientTransportTests.java | 10 ++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java b/mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java index 271f382..8598e31 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java +++ b/mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java @@ -424,8 +424,8 @@ public class HttpClientSseClientTransport implements McpClientTransport { .flatMap(body -> sendHttpPost(messageEndpointUri, body).handle((response, sink) -> { if (response.statusCode() != 200 && response.statusCode() != 201 && response.statusCode() != 202 && response.statusCode() != 206) { - sink.error(new RuntimeException( - "Sending message failed with a non-OK HTTP code: " + response.statusCode())); + sink.error(new RuntimeException("Sending message failed with a non-OK HTTP code: " + + response.statusCode() + " - " + response.body())); } else { sink.next(response); @@ -453,7 +453,7 @@ public class HttpClientSseClientTransport implements McpClientTransport { }); } - private Mono> sendHttpPost(final String endpoint, final String body) { + private Mono> sendHttpPost(final String endpoint, final String body) { final URI requestUri = Utils.resolveUri(baseUri, endpoint); final HttpRequest request = this.requestBuilder.copy() .uri(requestUri) @@ -461,7 +461,7 @@ public class HttpClientSseClientTransport implements McpClientTransport { .build(); // TODO: why discard the body? - return Mono.fromFuture(httpClient.sendAsync(request, HttpResponse.BodyHandlers.discarding())); + return Mono.fromFuture(httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString())); } /** diff --git a/mcp/src/test/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransportTests.java b/mcp/src/test/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransportTests.java index 3f1b71e..3143054 100644 --- a/mcp/src/test/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransportTests.java +++ b/mcp/src/test/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransportTests.java @@ -105,6 +105,16 @@ class HttpClientSseClientTransportTests { container.stop(); } + @Test + void testErrorOnBogusMessage() { + // bogus message + JSONRPCRequest bogusMessage = new JSONRPCRequest(null, null, "test-id", Map.of("key", "value")); + + StepVerifier.create(transport.sendMessage(bogusMessage)) + .verifyErrorMessage( + "Sending message failed with a non-OK HTTP code: 400 - Invalid message: {\"id\":\"test-id\",\"params\":{\"key\":\"value\"}}"); + } + @Test void testMessageProcessing() { // Create a test message