use crate::common::SafetyBufferingTreatment; use http::HeaderMap; pub(crate) const X_CODEX_SAFETY_BUFFERING_ENABLED_HEADER: &str = "x-codex-safety-buffering-enabled"; pub(crate) const X_CODEX_SAFETY_BUFFERING_FASTER_MODEL_HEADER: &str = "x-codex-safety-buffering-faster-model"; pub(crate) fn treatment_from_headers(headers: &HeaderMap) -> Option { if !headers.contains_key(X_CODEX_SAFETY_BUFFERING_ENABLED_HEADER) && !headers.contains_key(X_CODEX_SAFETY_BUFFERING_FASTER_MODEL_HEADER) { return None; } let faster_model = headers .get(X_CODEX_SAFETY_BUFFERING_FASTER_MODEL_HEADER) .and_then(|value| value.to_str().ok()) .map(str::to_string); Some(SafetyBufferingTreatment { faster_model }) } #[cfg(test)] mod tests { use super::*; use http::HeaderValue; use pretty_assertions::assert_eq; #[test] fn reads_treatment_from_http_headers() { let mut headers = HeaderMap::new(); headers.insert( X_CODEX_SAFETY_BUFFERING_ENABLED_HEADER, HeaderValue::from_static("true"), ); headers.insert( X_CODEX_SAFETY_BUFFERING_FASTER_MODEL_HEADER, HeaderValue::from_static("faster-model"), ); assert_eq!( treatment_from_headers(&headers), Some(SafetyBufferingTreatment { faster_model: Some("faster-model".to_string()), }) ); } #[test] fn buffering_enabled_header_does_not_gate_the_faster_model_fallback() { let mut headers = HeaderMap::new(); headers.insert( X_CODEX_SAFETY_BUFFERING_ENABLED_HEADER, HeaderValue::from_static("false"), ); headers.insert( X_CODEX_SAFETY_BUFFERING_FASTER_MODEL_HEADER, HeaderValue::from_static("faster-model"), ); assert_eq!( treatment_from_headers(&headers), Some(SafetyBufferingTreatment { faster_model: Some("faster-model".to_string()), }) ); } }