use reqwest::header::{HeaderMap, HeaderName, HeaderValue};
const AGENT_SESSION_ID: HeaderName = HeaderName::from_static("agent-session-id");
const TRACEPARENT: HeaderName = HeaderName::from_static("traceparent");
pub fn agent_headers() -> HeaderMap {
match is_ai_agent::detect() {
Some(agent) => {
agent_headers_from(agent.session_id.as_deref(), agent.traceparent.as_deref())
}
None => HeaderMap::new(),
}
}
fn agent_headers_from(session_id: Option<&str>, traceparent: Option<&str>) -> HeaderMap {
let mut headers = HeaderMap::new();
if let Some(value) = session_id.and_then(|s| HeaderValue::from_str(s).ok()) {
headers.insert(AGENT_SESSION_ID, value);
}
if let Some(value) = traceparent.and_then(|s| HeaderValue::from_str(s).ok()) {
headers.insert(TRACEPARENT, value);
}
headers
}
pub fn client_builder() -> reqwest::ClientBuilder {
reqwest::Client::builder()
.user_agent(crate::user_agent::user_agent())
.default_headers(agent_headers())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn both_ids_present_yields_both_headers() {
let headers = agent_headers_from(Some("sess-123"), Some("00-abc-def-01"));
assert_eq!(headers.get("agent-session-id").unwrap(), "sess-123");
assert_eq!(headers.get("traceparent").unwrap(), "00-abc-def-01");
assert_eq!(headers.len(), 2);
}
#[test]
fn no_ids_yields_empty_map() {
let headers = agent_headers_from(None, None);
assert!(headers.is_empty());
}
#[test]
fn session_only_yields_single_header() {
let headers = agent_headers_from(Some("sess-123"), None);
assert_eq!(headers.get("agent-session-id").unwrap(), "sess-123");
assert!(headers.get("traceparent").is_none());
assert_eq!(headers.len(), 1);
}
#[test]
fn traceparent_only_yields_single_header() {
let headers = agent_headers_from(None, Some("00-abc-def-01"));
assert_eq!(headers.get("traceparent").unwrap(), "00-abc-def-01");
assert!(headers.get("agent-session-id").is_none());
assert_eq!(headers.len(), 1);
}
#[test]
fn invalid_header_value_is_dropped_without_panic() {
let headers = agent_headers_from(Some("bad\nvalue"), Some("00-ok-01"));
assert!(headers.get("agent-session-id").is_none());
assert_eq!(headers.get("traceparent").unwrap(), "00-ok-01");
}
#[test]
fn client_builder_builds() {
let _client = client_builder().build().unwrap();
}
}