http_async/
version.rs

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/// Protocol Version of Request and Response.
28#[allow(non_camel_case_types)]
29pub enum      Version
30{
31  /// Placeholder.
32  Dummy,
33  /// Version 0.9.
34  HTTP_09,
35  /// Version 1.0.
36  HTTP_10,
37  /// Version 1.1.
38  HTTP_11,
39  /// Version 2.0.
40  HTTP_2,
41  /// Version 3.0.
42  HTTP_3,
43}
44
45impl          Version
46{
47  /// Try to parse Hyper Text Transfer Protocol Version from Transmission Control Protocol Stream.
48  ///
49  /// # Arguments
50  /// * `stream`                        – Transmission Control Protocol Stream.
51  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}