headers/common/
sec_websocket_version.rs

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