use autogen_alpn::{AlpnType, ALPNS_LIST};
pub mod autogen_alpn;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct AlpnProtocolId
{
pub ident: AlpnType,
pub ident_seq: &'static [u8],
pub ident_str: &'static str,
pub descr: &'static str,
}
impl AlpnProtocolId
{
pub
fn get_by_alpn_type(altp: AlpnType) -> &'static AlpnProtocolId
{
return &ALPNS_LIST[altp as usize];
}
pub
fn get_by_ident_str(ident: &str) -> Option<&'static AlpnProtocolId>
{
let idx = ALPNS_LIST.binary_search_by_key(&ident,|v| v.ident_str).ok()?;
return Some(&ALPNS_LIST[idx]);
}
pub
fn get_by_ident_seq(ident: &[u8]) -> Option<&'static AlpnProtocolId>
{
let idx = ALPNS_LIST.binary_search_by_key(&ident,|v| v.ident_seq).ok()?;
return Some(&ALPNS_LIST[idx]);
}
}
#[cfg(test)]
mod tests
{
use crate::protocol::autogen::autogen_alpn::AlpnType;
use super::AlpnProtocolId;
#[test]
fn test_get_by_ident_str()
{
let a1 = AlpnProtocolId::get_by_ident_str("h2c");
assert_eq!(Some(AlpnProtocolId::get_by_alpn_type(AlpnType::Http2OverTcp)), a1);
let a1 = AlpnProtocolId::get_by_ident_str("http/1.0");
assert_eq!(Some(AlpnProtocolId::get_by_alpn_type(AlpnType::Http10)), a1);
let a1 = AlpnProtocolId::get_by_ident_str("https/1.0");
assert_eq!(None, a1);
let a1 = AlpnProtocolId::get_by_ident_seq(b"\x68\x32\x63");
assert_eq!(Some(AlpnProtocolId::get_by_alpn_type(AlpnType::Http2OverTcp)), a1);
let a1 = AlpnProtocolId::get_by_ident_seq(b"\x68\x74\x74\x70\x2f\x31\x2e\x30");
assert_eq!(Some(AlpnProtocolId::get_by_alpn_type(AlpnType::Http10)), a1);
}
}