1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
extern crate alloc;
use alloc::vec::Vec;
use core::convert::{TryFrom, From};
use crate::error::HttpError;
#[derive(Debug, PartialEq)]
pub enum Version {
Http09,
Http10,
Http11,
Http20,
Http30,
}
impl TryFrom<&str> for Version {
type Error = HttpError;
fn try_from(src: &str) -> Result<Self, Self::Error> {
match src {
"HTTP/0.9" => Ok(Version::Http09),
"HTTP/1.0" => Ok(Version::Http10),
"HTTP/1.1" => Ok(Version::Http11),
"HTTP/2.0" => Ok(Version::Http20),
"HTTP/3.0" => Ok(Version::Http30),
_ => Err(HttpError::InvalidVersion),
}
}
}
impl From<Version> for Vec<u8> {
fn from(version: Version) -> Self {
match version {
Version::Http09 => b"HTTP/0.9".to_vec(),
Version::Http10 => b"HTTP/1.0".to_vec(),
Version::Http11 => b"HTTP/1.1".to_vec(),
Version::Http20 => b"HTTP/2.0".to_vec(),
Version::Http30 => b"HTTP/3.0".to_vec(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn from_str_http09_test() {
assert_eq!(Version::try_from("HTTP/0.9"), Ok(Version::Http09));
}
#[test]
fn to_bytes_http09_test() {
assert_eq!(Vec::<u8>::from(Version::Http09), b"HTTP/0.9".to_vec());
}
#[test]
fn from_str_http10_test() {
assert_eq!(Version::try_from("HTTP/1.0"), Ok(Version::Http10));
}
#[test]
fn to_bytes_http10_test() {
assert_eq!(Vec::<u8>::from(Version::Http10), b"HTTP/1.0".to_vec());
}
#[test]
fn from_str_http11_test() {
assert_eq!(Version::try_from("HTTP/1.1"), Ok(Version::Http11));
}
#[test]
fn to_bytes_http11_test() {
assert_eq!(Vec::<u8>::from(Version::Http11), b"HTTP/1.1".to_vec());
}
#[test]
fn from_str_http20_test() {
assert_eq!(Version::try_from("HTTP/2.0"), Ok(Version::Http20));
}
#[test]
fn to_bytes_http20_test() {
assert_eq!(Vec::<u8>::from(Version::Http20), b"HTTP/2.0".to_vec());
}
#[test]
fn from_str_http30_test() {
assert_eq!(Version::try_from("HTTP/3.0"), Ok(Version::Http30));
}
#[test]
fn to_bytes_http30_test() {
assert_eq!(Vec::<u8>::from(Version::Http30), b"HTTP/3.0".to_vec());
}
#[test]
fn from_str_invalid_version_test() {
assert_eq!(Version::try_from("HTTP/3.1"), Err(HttpError::InvalidVersion));
}
}