mirror of
https://github.com/windmill-labs/windmill.git
synced 2026-10-17 08:03:06 +00:00
fix: fail closed when an mcp error message has no status prefix
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
2e2a358739
commit
35841220fc
@@ -26,7 +26,8 @@ async fn redacted<T>(request: impl Future<Output = Result<T, Error>>) -> Result<
|
||||
// An owned message is `HTTP <status>: <body>`, and the body is the server's
|
||||
// to write: a common one echoes the request target (`Cannot POST /mcp/<key>`).
|
||||
Err(StreamableHttpError::UnexpectedServerResponse(Cow::Owned(message))) => {
|
||||
let status = message.split(": ").next().unwrap_or_default().to_string();
|
||||
let status = message.split_once(": ").map_or("", |(status, _)| status);
|
||||
let status = status.to_string();
|
||||
Err(StreamableHttpError::UnexpectedServerResponse(status.into()))
|
||||
}
|
||||
r => r,
|
||||
@@ -120,3 +121,31 @@ impl StreamableHttpClient for UrlRedactingClient {
|
||||
.await
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[tokio::test]
|
||||
async fn server_error_body_is_dropped() {
|
||||
for (message, expected) in [
|
||||
(
|
||||
"HTTP 404 Not Found: Cannot POST /mcp/KEY",
|
||||
"HTTP 404 Not Found",
|
||||
),
|
||||
("Cannot POST /mcp/KEY", ""),
|
||||
] {
|
||||
let err = redacted(async {
|
||||
Err::<(), Error>(StreamableHttpError::UnexpectedServerResponse(
|
||||
message.to_string().into(),
|
||||
))
|
||||
})
|
||||
.await
|
||||
.unwrap_err();
|
||||
let StreamableHttpError::UnexpectedServerResponse(got) = err else {
|
||||
panic!("unexpected variant: {err}");
|
||||
};
|
||||
assert_eq!(got, expected);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user