use crate::types::{ProxyCapabilities, RoutingPath};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum TransportPreference {
#[default]
PreferH3,
ForceTcp,
PersistentTcp,
}
#[must_use]
pub const fn resolve_routing_path(
capabilities: &ProxyCapabilities,
preference: TransportPreference,
) -> RoutingPath {
match preference {
TransportPreference::ForceTcp => RoutingPath::H1H2OverTcp,
TransportPreference::PersistentTcp => RoutingPath::PersistentTcp,
TransportPreference::PreferH3 => {
if capabilities.supports_http3_tunnel {
RoutingPath::H3OverUdp
} else {
RoutingPath::H1H2OverTcp
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::ProxyCapabilities;
#[test]
fn prefer_h3_with_udp_support_returns_h3() {
let caps = ProxyCapabilities {
supports_http3_tunnel: true,
..Default::default()
};
assert_eq!(
resolve_routing_path(&caps, TransportPreference::PreferH3),
RoutingPath::H3OverUdp,
);
}
#[test]
fn prefer_h3_without_udp_support_falls_back_to_tcp() {
let caps = ProxyCapabilities::default();
assert_eq!(
resolve_routing_path(&caps, TransportPreference::PreferH3),
RoutingPath::H1H2OverTcp,
);
}
#[test]
fn force_tcp_always_returns_tcp() {
let caps = ProxyCapabilities {
supports_http3_tunnel: true,
..Default::default()
};
assert_eq!(
resolve_routing_path(&caps, TransportPreference::ForceTcp),
RoutingPath::H1H2OverTcp,
);
}
#[test]
fn persistent_tcp_returns_persistent_tcp() {
let caps = ProxyCapabilities {
supports_http3_tunnel: true,
..Default::default()
};
assert_eq!(
resolve_routing_path(&caps, TransportPreference::PersistentTcp),
RoutingPath::PersistentTcp,
);
}
}