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