use crate::internal::domain::{RequestId, SessionId};
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use uuid::Uuid;
pub const REQUEST_ID_HEADER: &str = "x-request-id";
pub const SESSION_ID_HEADER: &str = "mcp-session-id";
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct HttpMcpSessionIds {
pub request_id: RequestId,
pub session_id: SessionId,
}
impl HttpMcpSessionIds {
#[must_use]
pub fn from_headers(headers: &BTreeMap<String, String>) -> Self {
Self {
request_id: header_uuid(headers, REQUEST_ID_HEADER)
.map(RequestId::from_uuid)
.unwrap_or_default(),
session_id: header_uuid(headers, SESSION_ID_HEADER)
.map(SessionId::from_uuid)
.unwrap_or_default(),
}
}
}
fn header<'a>(headers: &'a BTreeMap<String, String>, name: &str) -> Option<&'a str> {
headers
.iter()
.find(|(header_name, _)| header_name.eq_ignore_ascii_case(name))
.map(|(_, value)| value.as_str())
}
fn header_uuid(headers: &BTreeMap<String, String>, name: &str) -> Option<Uuid> {
header(headers, name).and_then(|value| Uuid::parse_str(value).ok())
}