mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 17:30:23 +08:00
fix: prefer client session adapters
This commit is contained in:
@@ -31,10 +31,11 @@ pub(crate) fn client_session_affinity_from_request(
|
|||||||
let request = ClientSessionAffinityRequest { headers, body_json };
|
let request = ClientSessionAffinityRequest { headers, body_json };
|
||||||
let client_family = detect_client_family(&request);
|
let client_family = detect_client_family(&request);
|
||||||
let session_key = explicit_aether_session_key(&request)
|
let session_key = explicit_aether_session_key(&request)
|
||||||
|
.or_else(|| extract_session_key_for_client_family(&request, client_family.as_str()))
|
||||||
.or_else(|| GenericSessionAffinityAdapter.extract_session_key(&request))
|
.or_else(|| GenericSessionAffinityAdapter.extract_session_key(&request))
|
||||||
.or_else(|| CodexSessionAffinityAdapter.extract_session_key(&request))
|
.or_else(|| {
|
||||||
.or_else(|| ClaudeCodeSessionAffinityAdapter.extract_session_key(&request))
|
extract_session_key_from_other_specific_adapters(&request, client_family.as_str())
|
||||||
.or_else(|| OpenCodeSessionAffinityAdapter.extract_session_key(&request));
|
});
|
||||||
|
|
||||||
session_key
|
session_key
|
||||||
.map(|session_key| ClientSessionAffinity::new(Some(client_family), Some(session_key)))
|
.map(|session_key| ClientSessionAffinity::new(Some(client_family), Some(session_key)))
|
||||||
@@ -64,6 +65,26 @@ fn specific_client_session_affinity_adapters() -> [&'static dyn ClientSessionAff
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn extract_session_key_for_client_family(
|
||||||
|
request: &ClientSessionAffinityRequest<'_>,
|
||||||
|
client_family: &str,
|
||||||
|
) -> Option<String> {
|
||||||
|
specific_client_session_affinity_adapters()
|
||||||
|
.into_iter()
|
||||||
|
.find(|adapter| adapter.family() == client_family)
|
||||||
|
.and_then(|adapter| adapter.extract_session_key(request))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn extract_session_key_from_other_specific_adapters(
|
||||||
|
request: &ClientSessionAffinityRequest<'_>,
|
||||||
|
client_family: &str,
|
||||||
|
) -> Option<String> {
|
||||||
|
specific_client_session_affinity_adapters()
|
||||||
|
.into_iter()
|
||||||
|
.filter(|adapter| adapter.family() != client_family)
|
||||||
|
.find_map(|adapter| adapter.extract_session_key(request))
|
||||||
|
}
|
||||||
|
|
||||||
impl ClientSessionAffinityAdapter for GenericSessionAffinityAdapter {
|
impl ClientSessionAffinityAdapter for GenericSessionAffinityAdapter {
|
||||||
fn family(&self) -> &'static str {
|
fn family(&self) -> &'static str {
|
||||||
"generic"
|
"generic"
|
||||||
@@ -325,6 +346,33 @@ mod tests {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn specific_adapter_wins_over_generic_body_session() {
|
||||||
|
let mut headers = HeaderMap::new();
|
||||||
|
headers.insert(
|
||||||
|
http::header::USER_AGENT,
|
||||||
|
HeaderValue::from_static("OpenCode/0.9"),
|
||||||
|
);
|
||||||
|
headers.insert(
|
||||||
|
"x-opencode-session-id",
|
||||||
|
HeaderValue::from_static("oc-session"),
|
||||||
|
);
|
||||||
|
headers.insert("x-opencode-agent-id", HeaderValue::from_static("reviewer"));
|
||||||
|
let body = json!({
|
||||||
|
"session_id": "body-session",
|
||||||
|
"agent_id": "body-agent"
|
||||||
|
});
|
||||||
|
|
||||||
|
let affinity = client_session_affinity_from_request(&headers, Some(&body))
|
||||||
|
.expect("affinity should build");
|
||||||
|
|
||||||
|
assert_eq!(affinity.client_family.as_deref(), Some("opencode"));
|
||||||
|
assert_eq!(
|
||||||
|
affinity.session_key.as_deref(),
|
||||||
|
Some("session=oc-session;agent=reviewer")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn missing_session_signal_returns_none() {
|
fn missing_session_signal_returns_none() {
|
||||||
let headers = HeaderMap::new();
|
let headers = HeaderMap::new();
|
||||||
|
|||||||
Reference in New Issue
Block a user