Skip to main content

futu_auth/
websocket.rs

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
14/// Return whether the supplied `Sec-WebSocket-Key` header values satisfy the
15/// RFC 6455 client-handshake shape.
16pub 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}