pub const HARNESS_HEADER: &str = "X-Relaycast-Harness";
pub const AGENT_RELAY_DISTINCT_ID_HEADER: &str = "X-Agent-Relay-Distinct-Id";
pub const AGENT_RELAY_DISTINCT_ID_QUERY: &str = "agent_relay_distinct_id";
const HARNESS_MAX_LENGTH: usize = 120;
const AGENT_RELAY_DISTINCT_ID_MAX_LENGTH: usize = 128;
fn is_allowed(c: char) -> bool {
c.is_ascii_alphanumeric()
|| matches!(
c,
' ' | '.' | '_' | '-' | '/' | '(' | ')' | ':' | '=' | ';' | ',' | '+'
)
}
fn is_allowed_agent_relay_distinct_id(c: char) -> bool {
c.is_ascii_alphanumeric() || matches!(c, '.' | '_' | ':' | '-')
}
pub fn sanitize_harness(raw: Option<impl AsRef<str>>) -> Option<String> {
let raw = raw?;
let trimmed = raw.as_ref().trim();
if trimmed.is_empty() {
return None;
}
if !trimmed.chars().all(is_allowed) {
return None;
}
Some(
trimmed
.chars()
.take(HARNESS_MAX_LENGTH)
.collect::<String>()
.to_lowercase(),
)
}
pub fn sanitize_agent_relay_distinct_id(raw: Option<impl AsRef<str>>) -> Option<String> {
let raw = raw?;
let trimmed = raw.as_ref().trim();
if trimmed.is_empty() {
return None;
}
if !trimmed.chars().all(is_allowed_agent_relay_distinct_id) {
return None;
}
Some(
trimmed
.chars()
.take(AGENT_RELAY_DISTINCT_ID_MAX_LENGTH)
.collect::<String>(),
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn keeps_a_ua_style_token_lowercased() {
assert_eq!(
sanitize_harness(Some("Claude-Code/2.3 (model=Opus-4.8; fast)")),
Some("claude-code/2.3 (model=opus-4.8; fast)".to_string())
);
}
#[test]
fn trims_surrounding_whitespace() {
assert_eq!(
sanitize_harness(Some(" codex ")),
Some("codex".to_string())
);
}
#[test]
fn drops_empty_and_none() {
assert_eq!(sanitize_harness(Some("")), None);
assert_eq!(sanitize_harness(Some(" ")), None);
assert_eq!(sanitize_harness(None::<&str>), None);
}
#[test]
fn drops_crlf_and_control_characters() {
assert_eq!(sanitize_harness(Some("evil\r\nX-Inject: bad")), None);
assert_eq!(sanitize_harness(Some("a\tb")), None);
}
#[test]
fn caps_at_120_characters() {
let long = "a".repeat(200);
assert_eq!(sanitize_harness(Some(&long)), Some("a".repeat(120)));
}
#[test]
fn keeps_agent_relay_distinct_id_without_lowercasing() {
assert_eq!(
sanitize_agent_relay_distinct_id(Some(" AgentRelay.abc_123:XYZ-9 ")),
Some("AgentRelay.abc_123:XYZ-9".to_string())
);
}
#[test]
fn drops_invalid_agent_relay_distinct_ids() {
assert_eq!(sanitize_agent_relay_distinct_id(Some("")), None);
assert_eq!(sanitize_agent_relay_distinct_id(Some(" ")), None);
assert_eq!(
sanitize_agent_relay_distinct_id(Some("evil\r\nX-Inject: bad")),
None
);
assert_eq!(sanitize_agent_relay_distinct_id(Some("a/b")), None);
}
#[test]
fn caps_agent_relay_distinct_id_at_128_characters() {
let long = "a".repeat(200);
assert_eq!(
sanitize_agent_relay_distinct_id(Some(&long)),
Some("a".repeat(128))
);
}
}