1#[derive(Debug, Clone)]
2pub enum HttpVersion {
3 Http09,
4 Http10,
5 Http11,
6 Http2,
7 Http3,
8}
9
10impl Default for HttpVersion {
11 fn default() -> Self {
12 HttpVersion::Http11
13 }
14}
15#[derive(Debug)]
16pub struct HttpVersionParsingError;
17
18impl std::fmt::Display for HttpVersionParsingError {
19 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
20 write!(f, "Error parsing http version from HTTP message")
21 }
22}
23
24impl std::str::FromStr for HttpVersion {
25 type Err = HttpVersionParsingError;
26
27 fn from_str(s: &str) -> Result<Self, Self::Err> {
28 match s {
29 "HTTP/0.9" => Ok(HttpVersion::Http09),
30 "HTTP/1.0" => Ok(HttpVersion::Http10),
31 "HTTP/1.1" => Ok(HttpVersion::Http11),
32 "HTTP/2.0" => Ok(HttpVersion::Http2),
33 "HTTP/3.0" => Ok(HttpVersion::Http3),
34 _ => Err(HttpVersionParsingError),
35 }
36 }
37}
38
39impl std::fmt::Display for HttpVersion {
40 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
41 let s = match self {
42 HttpVersion::Http09 => "HTTP/0.9",
43 HttpVersion::Http10 => "HTTP/1.0",
44 HttpVersion::Http11 => "HTTP/1.1",
45 HttpVersion::Http2 => "HTTP/2",
46 HttpVersion::Http3 => "HTTP/3",
47 };
48 write!(f, "{}", s)
49 }
50}