websocket/header/
version.rs

1use hyper;
2use hyper::header::parsing::from_one_raw_str;
3use hyper::header::{Header, HeaderFormat};
4use std::fmt::{self, Debug};
5
6/// Represents a Sec-WebSocket-Version header
7#[derive(PartialEq, Clone)]
8pub enum WebSocketVersion {
9	/// The version of WebSocket defined in RFC6455
10	WebSocket13,
11	/// An unknown version of WebSocket
12	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}