Skip to main content

rama_http_headers/common/
sec_websocket_version.rs

1use rama_http_types::{HeaderName, HeaderValue};
2
3use crate::{Error, HeaderDecode, HeaderEncode, TypedHeader};
4
5/// The `Sec-WebSocket-Version` header.
6#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
7pub struct SecWebSocketVersion(u8);
8
9impl SecWebSocketVersion {
10    /// `Sec-WebSocket-Version: 13`
11    pub const V13: Self = Self(13);
12}
13
14impl TypedHeader for SecWebSocketVersion {
15    fn name() -> &'static HeaderName {
16        &::rama_http_types::header::SEC_WEBSOCKET_VERSION
17    }
18}
19
20impl HeaderDecode for SecWebSocketVersion {
21    fn decode<'i, I: Iterator<Item = &'i HeaderValue>>(values: &mut I) -> Result<Self, Error> {
22        values
23            .next()
24            .and_then(|value| if value == "13" { Some(Self::V13) } else { None })
25            .ok_or_else(Error::invalid)
26    }
27}
28
29impl HeaderEncode for SecWebSocketVersion {
30    fn encode<E: Extend<HeaderValue>>(&self, values: &mut E) {
31        debug_assert_eq!(self.0, 13);
32
33        values.extend(::std::iter::once(HeaderValue::from_static("13")));
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::super::{test_decode, test_encode};
40    use super::SecWebSocketVersion;
41
42    #[test]
43    fn decode_v13() {
44        assert_eq!(
45            test_decode::<SecWebSocketVersion>(&["13"]),
46            Some(SecWebSocketVersion::V13),
47        );
48    }
49
50    #[test]
51    fn decode_fail() {
52        assert_eq!(test_decode::<SecWebSocketVersion>(&["1"]), None,);
53    }
54
55    #[test]
56    fn encode_v13() {
57        let headers = test_encode(SecWebSocketVersion::V13);
58        assert_eq!(headers["sec-websocket-version"], "13");
59    }
60}