Skip to content

Commit cf5c8b5

Browse files
committed
Polish HttpServlet server transports
1. Fix `HttpServletStatelessServerTransport.FAILED_TO_SEND_ERROR_RESPONSE` is unused 2. refactor to log error message in method `responseError` instead of caller method Signed-off-by: Yanming Zhou <[email protected]>
1 parent a0afdcd commit cf5c8b5

File tree

3 files changed

+56
-45
lines changed

3 files changed

+56
-45
lines changed

mcp-core/src/main/java/io/modelcontextprotocol/server/transport/HttpServletSseServerTransportProvider.java

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
*
6363
* @author Christian Tzolov
6464
* @author Alexandros Pappas
65+
* @author Yanming Zhou
6566
* @see McpServerTransportProvider
6667
* @see HttpServlet
6768
*/
@@ -317,20 +318,30 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
317318
}
318319
catch (Exception e) {
319320
logger.error("Error processing message: {}", e.getMessage());
320-
try {
321-
McpError mcpError = new McpError(e.getMessage());
322-
response.setContentType(APPLICATION_JSON);
323-
response.setCharacterEncoding(UTF_8);
324-
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
325-
String jsonError = jsonMapper.writeValueAsString(mcpError);
326-
PrintWriter writer = response.getWriter();
327-
writer.write(jsonError);
328-
writer.flush();
329-
}
330-
catch (IOException ex) {
331-
logger.error(FAILED_TO_SEND_ERROR_RESPONSE, ex.getMessage());
332-
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error processing message");
333-
}
321+
responseError(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, new McpError(e.getMessage()));
322+
}
323+
}
324+
325+
/**
326+
* Sends an error response to the client.
327+
* @param response The HTTP servlet response
328+
* @param httpCode The HTTP status code
329+
* @param mcpError The MCP error to send
330+
* @throws IOException If an I/O error occurs
331+
*/
332+
private void responseError(HttpServletResponse response, int httpCode, McpError mcpError) throws IOException {
333+
try {
334+
response.setContentType(APPLICATION_JSON);
335+
response.setCharacterEncoding(UTF_8);
336+
response.setStatus(httpCode);
337+
String jsonError = jsonMapper.writeValueAsString(mcpError);
338+
PrintWriter writer = response.getWriter();
339+
writer.write(jsonError);
340+
writer.flush();
341+
}
342+
catch (IOException ex) {
343+
logger.error(FAILED_TO_SEND_ERROR_RESPONSE, ex.getMessage());
344+
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error processing message");
334345
}
335346
}
336347

mcp-core/src/main/java/io/modelcontextprotocol/server/transport/HttpServletStatelessServerTransport.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
*
3333
* @author Christian Tzolov
3434
* @author Dariusz Jędrzejczyk
35+
* @author Yanming Zhou
3536
*/
3637
@WebServlet(asyncSupported = true)
3738
public class HttpServletStatelessServerTransport extends HttpServlet implements McpStatelessServerTransport {
@@ -200,13 +201,19 @@ else if (message instanceof McpSchema.JSONRPCNotification jsonrpcNotification) {
200201
* @throws IOException If an I/O error occurs
201202
*/
202203
private void responseError(HttpServletResponse response, int httpCode, McpError mcpError) throws IOException {
203-
response.setContentType(APPLICATION_JSON);
204-
response.setCharacterEncoding(UTF_8);
205-
response.setStatus(httpCode);
206-
String jsonError = jsonMapper.writeValueAsString(mcpError);
207-
PrintWriter writer = response.getWriter();
208-
writer.write(jsonError);
209-
writer.flush();
204+
try {
205+
response.setContentType(APPLICATION_JSON);
206+
response.setCharacterEncoding(UTF_8);
207+
response.setStatus(httpCode);
208+
String jsonError = jsonMapper.writeValueAsString(mcpError);
209+
PrintWriter writer = response.getWriter();
210+
writer.write(jsonError);
211+
writer.flush();
212+
}
213+
catch (IOException ex) {
214+
logger.error(FAILED_TO_SEND_ERROR_RESPONSE, ex.getMessage());
215+
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error processing message");
216+
}
210217
}
211218

212219
/**

mcp-core/src/main/java/io/modelcontextprotocol/server/transport/HttpServletStreamableServerTransportProvider.java

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
* @author Zachary German
5555
* @author Christian Tzolov
5656
* @author Dariusz Jędrzejczyk
57+
* @author Yanming Zhou
5758
* @see McpStreamableServerTransportProvider
5859
* @see HttpServlet
5960
*/
@@ -503,14 +504,8 @@ else if (message instanceof McpSchema.JSONRPCRequest jsonrpcRequest) {
503504
}
504505
catch (Exception e) {
505506
logger.error("Error handling message: {}", e.getMessage());
506-
try {
507-
this.responseError(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
508-
new McpError("Error processing message: " + e.getMessage()));
509-
}
510-
catch (IOException ex) {
511-
logger.error(FAILED_TO_SEND_ERROR_RESPONSE, ex.getMessage());
512-
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error processing message");
513-
}
507+
this.responseError(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
508+
new McpError("Error processing message: " + e.getMessage()));
514509
}
515510
}
516511

@@ -564,26 +559,24 @@ protected void doDelete(HttpServletRequest request, HttpServletResponse response
564559
}
565560
catch (Exception e) {
566561
logger.error("Failed to delete session {}: {}", sessionId, e.getMessage());
567-
try {
568-
this.responseError(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
569-
new McpError(e.getMessage()));
570-
}
571-
catch (IOException ex) {
572-
logger.error(FAILED_TO_SEND_ERROR_RESPONSE, ex.getMessage());
573-
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error deleting session");
574-
}
562+
this.responseError(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, new McpError(e.getMessage()));
575563
}
576564
}
577565

578566
public void responseError(HttpServletResponse response, int httpCode, McpError mcpError) throws IOException {
579-
response.setContentType(APPLICATION_JSON);
580-
response.setCharacterEncoding(UTF_8);
581-
response.setStatus(httpCode);
582-
String jsonError = jsonMapper.writeValueAsString(mcpError);
583-
PrintWriter writer = response.getWriter();
584-
writer.write(jsonError);
585-
writer.flush();
586-
return;
567+
try {
568+
response.setContentType(APPLICATION_JSON);
569+
response.setCharacterEncoding(UTF_8);
570+
response.setStatus(httpCode);
571+
String jsonError = jsonMapper.writeValueAsString(mcpError);
572+
PrintWriter writer = response.getWriter();
573+
writer.write(jsonError);
574+
writer.flush();
575+
}
576+
catch (IOException ex) {
577+
logger.error(FAILED_TO_SEND_ERROR_RESPONSE, ex.getMessage());
578+
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error processing message");
579+
}
587580
}
588581

589582
/**

0 commit comments

Comments
 (0)