1use
2{
3 super::
4 {
5 request::
6 {
7 Request,
8 },
9 },
10 async_std::
11 {
12 net::
13 {
14 TcpStream,
15 },
16 },
17 std::
18 {
19 fmt::
20 {
21 self,
22 Display,
23 },
24 },
25};
26
27#[allow(non_camel_case_types)]
29pub enum Version
30{
31 Dummy,
33 HTTP_09,
35 HTTP_10,
37 HTTP_11,
39 HTTP_2,
41 HTTP_3,
43}
44
45impl Version
46{
47 pub async fn parse
52 (
53 mut stream: &mut TcpStream,
54 )
55 -> Option < Version >
56 {
57 match Some ( Version::Dummy )
58 .and_then ( | version | Request::ifChar ( 'H', &mut stream, version ) )
59 .and_then ( | version | Request::ifChar ( 'T', &mut stream, version ) )
60 .and_then ( | version | Request::ifChar ( 'T', &mut stream, version ) )
61 .and_then ( | version | Request::ifChar ( 'P', &mut stream, version ) )
62 .and_then ( | version | Request::ifChar ( '/', &mut stream, version ) )
63 {
64 Some ( _ )
65 => match Request::readChar ( &mut stream )
66 {
67 Some ( '0' )
68 => Some ( Version::HTTP_09 )
69 .and_then ( | version | Request::ifChar ( '.', &mut stream, version ) )
70 .and_then ( | version | Request::ifChar ( '9', &mut stream, version ) ),
71 Some ( '1' )
72 => match Request::readChar ( &mut stream )
73 {
74 Some ( '.' )
75 => match Request::readChar ( &mut stream )
76 {
77 Some ( '0' )
78 => Some ( Version::HTTP_10 ),
79 Some ( '1' )
80 => Some ( Version::HTTP_11 ),
81 _
82 => None,
83 },
84 _
85 => None,
86 },
87 Some ( '2' )
88 => Some ( Version::HTTP_2 )
89 .and_then ( | version | Request::ifChar ( '.', &mut stream, version ) )
90 .and_then ( | version | Request::ifChar ( '0', &mut stream, version ) ),
91 Some ( '3' )
92 => Some ( Version::HTTP_3 )
93 .and_then ( | version | Request::ifChar ( '.', &mut stream, version ) )
94 .and_then ( | version | Request::ifChar ( '0', &mut stream, version ) ),
95 _
96 => None,
97 }
98 None
99 => None,
100 }
101 .and_then ( | version | Request::ifChar ( '\r', &mut stream, version ) )
102 .and_then ( | version | Request::ifChar ( '\n', &mut stream, version ) )
103 }
104}
105
106impl Display for Version
107{
108 fn fmt
109 (
110 &self,
111 formatter: &mut fmt::Formatter<'_>
112 )
113 -> fmt::Result
114 {
115 formatter
116 .write_str
117 (
118 &format!
119 (
120 "HTTP/{}",
121 match self
122 {
123 Version::Dummy => "?.?",
124 Version::HTTP_09 => "0.9",
125 Version::HTTP_10 => "1.0",
126 Version::HTTP_11 => "1.1",
127 Version::HTTP_2 => "2.0",
128 Version::HTTP_3 => "3.0",
129 }
130 )
131 )
132 }
133}