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