use crate::transport::http::core::{
context::HttpContext, engine::HttpEngine, handlers, types::StreamResponse,
};
use ::volga::{
HttpRequest, HttpResult, di::Dc, error::Error as VolgaError, http::sse::Message as SseMessage,
sse,
};
use super::engine::VolgaEngine;
pub(crate) async fn post(manager: Dc<HttpContext>, req: HttpRequest) -> HttpResult {
let outcome = handlers::dispatch_post::<VolgaEngine>(req, &manager)
.await
.map_err(to_volga_err)?;
match outcome {
StreamResponse::Stream { stream, .. } => {
let stream = futures_util::StreamExt::map(stream, Ok::<SseMessage, VolgaError>);
sse!(stream; [crate::transport::http::CONTENT_TYPE_OPTIONS])
}
StreamResponse::Complete(resp) => VolgaEngine::adapt_response(resp),
}
}
#[cfg_attr(not(feature = "legacy-spec"), allow(dead_code))]
pub(crate) async fn delete(manager: Dc<HttpContext>, req: HttpRequest) -> HttpResult {
let neutral = VolgaEngine::adapt_request(req)
.await
.map_err(to_volga_err)?;
let resp = handlers::handle_delete(neutral, &manager).await;
VolgaEngine::adapt_response(resp)
}
#[cfg_attr(not(feature = "legacy-spec"), allow(dead_code))]
pub(crate) async fn get(manager: Dc<HttpContext>, req: HttpRequest) -> HttpResult {
let outcome = handlers::dispatch_get_sse::<VolgaEngine>(req, &manager)
.await
.map_err(to_volga_err)?;
match outcome {
StreamResponse::Stream { headers, stream } => {
let session_id = headers
.get(handlers::MCP_SESSION_ID)
.and_then(|v| v.to_str().ok())
.map(str::to_owned);
let stream = futures_util::StreamExt::map(stream, Ok::<SseMessage, VolgaError>);
if let Some(id) = session_id {
sse!(
stream;
[
(handlers::MCP_SESSION_ID, id),
crate::transport::http::CONTENT_TYPE_OPTIONS,
]
)
} else {
sse!(stream; [crate::transport::http::CONTENT_TYPE_OPTIONS])
}
}
StreamResponse::Complete(resp) => VolgaEngine::adapt_response(resp),
}
}
#[cfg(feature = "server-oauth")]
pub(crate) async fn oauth_metadata(manager: Dc<HttpContext>) -> HttpResult {
VolgaEngine::adapt_response(handlers::handle_oauth_metadata(&manager))
}
fn to_volga_err(err: crate::error::Error) -> VolgaError {
VolgaError::server_error(err.to_string())
}