headers/common/
sec_websocket_version.rs

1use http::{HeaderName, HeaderValue};
2
3use crate::{Error, Header};
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: SecWebsocketVersion = SecWebsocketVersion(13);
12}
13
14impl Header for SecWebsocketVersion {
15    fn name() -> &'static HeaderName {
16        &::http::header::SEC_WEBSOCKET_VERSION
17    }
18
19    fn decode<'i, I: Iterator<Item = &'i HeaderValue>>(values: &mut I) -> Result<Self, Error> {
20        values
21            .next()
22            .and_then(|value| {
23                if value == "13" {
24                    Some(SecWebsocketVersion::V13)
25                } else {
26                    None
27                }
28            })
29            .ok_or_else(Error::invalid)
30    }
31
32    fn encode<E: Extend<HeaderValue>>(&self, values: &mut E) {
33        debug_assert_eq!(self.0, 13);
34
35        values.extend(::std::iter::once(HeaderValue::from_static("13")));
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use super::super::{test_decode, test_encode};
42    use super::SecWebsocketVersion;
43
44    #[test]
45    fn decode_v13() {
46        assert_eq!(
47            test_decode::<SecWebsocketVersion>(&["13"]),
48            Some(SecWebsocketVersion::V13),
49        );
50    }
51
52    #[test]
53    fn decode_fail() {
54        assert_eq!(test_decode::<SecWebsocketVersion>(&["1"]), None,);
55    }
56
57    #[test]
58    fn encode_v13() {
59        let headers = test_encode(SecWebsocketVersion::V13);
60        assert_eq!(headers["sec-websocket-version"], "13");
61    }
62}