1use base64::Engine as _;
2use base64::alphabet;
3use base64::engine::DecodePaddingMode;
4use base64::engine::general_purpose::{GeneralPurpose, GeneralPurposeConfig};
5
6const WEBSOCKET_KEY_ENGINE: GeneralPurpose = GeneralPurpose::new(
7 &alphabet::STANDARD,
8 GeneralPurposeConfig::new()
9 .with_encode_padding(true)
10 .with_decode_padding_mode(DecodePaddingMode::RequireCanonical)
11 .with_decode_allow_trailing_bits(false),
12);
13
14pub fn is_valid_sec_websocket_key<'a>(values: impl IntoIterator<Item = &'a [u8]>) -> bool {
17 let mut values = values.into_iter();
18 let Some(value) = values.next() else {
19 return false;
20 };
21 if values.next().is_some() {
22 return false;
23 }
24 WEBSOCKET_KEY_ENGINE
25 .decode(value)
26 .is_ok_and(|decoded| decoded.len() == 16)
27}