in neqo-http3/src/settings.rs [252:296]
fn check(&self, token: &[u8]) -> ZeroRttCheckResult {
let mut dec = Decoder::from(token);
// Read and check the version.
if let Some(version) = dec.decode_varint() {
if version != SETTINGS_ZERO_RTT_VERSION {
return ZeroRttCheckResult::Reject;
}
} else {
return ZeroRttCheckResult::Fail;
}
// Now treat the rest as a settings frame.
let mut settings = HSettings::new(&[]);
if settings.decode_frame_contents(&mut dec).is_err() {
return ZeroRttCheckResult::Fail;
}
if settings.iter().all(|setting| match setting.setting_type {
HSettingType::BlockedStreams => {
u64::from(self.settings.get_max_blocked_streams()) >= setting.value
}
HSettingType::MaxTableCapacity => {
self.settings.get_max_table_size_decoder() >= setting.value
}
HSettingType::EnableWebTransport => {
if setting.value > 1 {
return false;
}
let value = setting.value == 1;
self.settings.get_webtransport() || !value
}
HSettingType::EnableH3Datagram => {
if setting.value > 1 {
return false;
}
let value = setting.value == 1;
self.settings.get_http3_datagram() || !value
}
HSettingType::MaxHeaderListSize => true,
}) {
ZeroRttCheckResult::Accept
} else {
ZeroRttCheckResult::Reject
}
}