headers/common/
sec_websocket_version.rs1use http::{HeaderName, HeaderValue};
2
3use crate::{Error, Header};
4
5#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
7pub struct SecWebsocketVersion(u8);
8
9impl SecWebsocketVersion {
10 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}