Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ public Mono<Void> sendMessage(McpSchema.JSONRPCMessage message) {

// The spec mentions only ACCEPTED, but the existing SDKs can return
// 200 OK for notifications
if (is2xx(response)) {
if (response.statusCode().is2xxSuccessful()) {
Optional<MediaType> contentType = response.headers().contentType();
long contentLength = response.headers().contentLength().orElse(-1);
// Existing SDKs consume notifications with no response body nor
Expand Down Expand Up @@ -397,15 +397,14 @@ private Flux<McpSchema.JSONRPCMessage> extractError(ClientResponse response, Str
}
catch (IOException ex) {
toPropagate = new McpTransportException("Sending request failed, " + e.getMessage(), e);
logger.debug("Received content together with {} HTTP code response: {}", response.rawStatusCode(),
body);
logger.debug("Received content together with {} HTTP code response: {}", response.statusCode(), body);
}

// Some implementations can return 400 when presented with a
// session id that it doesn't know about, so we will
// invalidate the session
// https://github.com/modelcontextprotocol/typescript-sdk/issues/389
if (isBadRequest(responseException)) {
if (responseException.getStatusCode().isSameCodeAs(HttpStatus.BAD_REQUEST)) {
if (!sessionRepresentation.equals(MISSING_SESSION_ID)) {
return Mono.error(new McpTransportSessionNotFoundException(sessionRepresentation, toPropagate));
}
Expand All @@ -425,8 +424,16 @@ private Flux<McpSchema.JSONRPCMessage> eventStream(McpTransportStream<Disposable
return Flux.from(sessionStream.consumeSseStream(idWithMessages));
}

private static boolean isNotFound(ClientResponse response) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please make these methods a protected class method, then I can override them via subtyping.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@He-Pin if framework 5 is important, perhaps you can copy the WebClientStreamableHttpTransport.java and modify and build it locally for your needs.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but that will require me to diff every time there is a release :(

return response.statusCode().isSameCodeAs(HttpStatus.NOT_FOUND);
}

private static boolean isNotAllowed(ClientResponse response) {
return response.statusCode().isSameCodeAs(HttpStatus.METHOD_NOT_ALLOWED);
}

private static boolean isEventStream(ClientResponse response) {
return is2xx(response) && response.headers().contentType().isPresent()
return response.statusCode().is2xxSuccessful() && response.headers().contentType().isPresent()
&& response.headers().contentType().get().isCompatibleWith(MediaType.TEXT_EVENT_STREAM);
}

Expand Down Expand Up @@ -605,36 +612,4 @@ public WebClientStreamableHttpTransport build() {

}

/**
* Needed for Spring 5 compatibility
*/
@SuppressWarnings("deprecation")
private static boolean isBadRequest(final WebClientResponseException responseException) {
return responseException.getRawStatusCode() == HttpStatus.BAD_REQUEST.value();
}

/**
* Needed for Spring 5 compatibility
*/
@SuppressWarnings("deprecation")
private static boolean isNotFound(ClientResponse response) {
return response.rawStatusCode() == HttpStatus.NOT_FOUND.value();
}

/**
* Needed for Spring 5 compatibility
*/
@SuppressWarnings("deprecation")
private static boolean isNotAllowed(ClientResponse response) {
return response.rawStatusCode() == HttpStatus.METHOD_NOT_ALLOWED.value();
}

/**
* Needed for Spring 5 compatibility
*/
@SuppressWarnings("deprecation")
private static boolean is2xx(final ClientResponse response) {
return response.rawStatusCode() >= 200 && response.rawStatusCode() < 300;
}

}