websocket/header/
version.rs1use hyper;
2use hyper::header::parsing::from_one_raw_str;
3use hyper::header::{Header, HeaderFormat};
4use std::fmt::{self, Debug};
5
6#[derive(PartialEq, Clone)]
8pub enum WebSocketVersion {
9 WebSocket13,
11 Unknown(String),
13}
14
15impl fmt::Debug for WebSocketVersion {
16 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
17 match *self {
18 WebSocketVersion::WebSocket13 => write!(f, "13"),
19 WebSocketVersion::Unknown(ref value) => write!(f, "{}", value),
20 }
21 }
22}
23
24impl Header for WebSocketVersion {
25 fn header_name() -> &'static str {
26 "Sec-WebSocket-Version"
27 }
28
29 fn parse_header(raw: &[Vec<u8>]) -> hyper::Result<WebSocketVersion> {
30 from_one_raw_str(raw).map(|s: String| match &s[..] {
31 "13" => WebSocketVersion::WebSocket13,
32 _ => WebSocketVersion::Unknown(s),
33 })
34 }
35}
36
37impl HeaderFormat for WebSocketVersion {
38 fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
39 self.fmt(fmt)
40 }
41}
42
43impl fmt::Display for WebSocketVersion {
44 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
45 self.fmt_header(fmt)
46 }
47}
48
49#[cfg(all(feature = "nightly", test))]
50mod tests {
51 use super::*;
52 use hyper::header::Header;
53 use test;
54
55 #[test]
56 fn test_websocket_version() {
57 use crate::header::Headers;
58
59 let version = WebSocketVersion::WebSocket13;
60 let mut headers = Headers::new();
61 headers.set(version);
62
63 assert_eq!(&headers.to_string()[..], "Sec-WebSocket-Version: 13\r\n");
64 }
65
66 #[bench]
67 fn bench_header_version_parse(b: &mut test::Bencher) {
68 let value = vec![b"13".to_vec()];
69 b.iter(|| {
70 let mut version: WebSocketVersion = Header::parse_header(&value[..]).unwrap();
71 test::black_box(&mut version);
72 });
73 }
74
75 #[bench]
76 fn bench_header_version_format(b: &mut test::Bencher) {
77 let value = vec![b"13".to_vec()];
78 let val: WebSocketVersion = Header::parse_header(&value[..]).unwrap();
79 b.iter(|| {
80 format!("{}", val);
81 });
82 }
83}