Skip to content

Commit 4d7bdf2

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 3f70afd commit 4d7bdf2

File tree

3 files changed

+56
-45
lines changed

3 files changed

+56
-45
lines changed

mcp/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
*/
@@ -381,20 +382,30 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
381382
}
382383
catch (Exception e) {
383384
logger.error("Error processing message: {}", e.getMessage());
384-
try {
385-
McpError mcpError = new McpError(e.getMessage());
386-
response.setContentType(APPLICATION_JSON);
387-
response.setCharacterEncoding(UTF_8);
388-
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
389-
String jsonError = objectMapper.writeValueAsString(mcpError);
390-
PrintWriter writer = response.getWriter();
391-
writer.write(jsonError);
392-
writer.flush();
393-
}
394-
catch (IOException ex) {
395-
logger.error(FAILED_TO_SEND_ERROR_RESPONSE, ex.getMessage());
396-
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error processing message");
397-
}
385+
responseError(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, new McpError(e.getMessage()));
386+
}
387+
}
388+
389+
/**
390+
* Sends an error response to the client.
391+
* @param response The HTTP servlet response
392+
* @param httpCode The HTTP status code
393+
* @param mcpError The MCP error to send
394+
* @throws IOException If an I/O error occurs
395+
*/
396+
private void responseError(HttpServletResponse response, int httpCode, McpError mcpError) throws IOException {
397+
try {
398+
response.setContentType(APPLICATION_JSON);
399+
response.setCharacterEncoding(UTF_8);
400+
response.setStatus(httpCode);
401+
String jsonError = objectMapper.writeValueAsString(mcpError);
402+
PrintWriter writer = response.getWriter();
403+
writer.write(jsonError);
404+
writer.flush();
405+
}
406+
catch (IOException ex) {
407+
logger.error(FAILED_TO_SEND_ERROR_RESPONSE, ex.getMessage());
408+
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error processing message");
398409
}
399410
}
400411

mcp/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 = objectMapper.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 = objectMapper.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/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
*/
@@ -502,14 +503,8 @@ else if (message instanceof McpSchema.JSONRPCRequest jsonrpcRequest) {
502503
}
503504
catch (Exception e) {
504505
logger.error("Error handling message: {}", e.getMessage());
505-
try {
506-
this.responseError(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
507-
new McpError("Error processing message: " + e.getMessage()));
508-
}
509-
catch (IOException ex) {
510-
logger.error(FAILED_TO_SEND_ERROR_RESPONSE, ex.getMessage());
511-
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error processing message");
512-
}
506+
this.responseError(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
507+
new McpError("Error processing message: " + e.getMessage()));
513508
}
514509
}
515510

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

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

588581
/**

0 commit comments

Comments
 (0)