http_async/
header.rs

1use
2{
3  super::
4  {
5    KeyValuePair,
6    request::
7    {
8      Request,
9    },
10  },
11  async_std::
12  {
13    net::
14    {
15      TcpStream,
16    },
17  },
18};
19
20/// A struct-stub as a Nmespace.
21pub struct    Header                    ();
22
23impl          Header
24{
25  /// Try to parse Header from from Transmission Control Protocol Stream.
26  ///
27  /// # Arguments
28  /// * `stream`                        – Transmission Control Protocol Stream.
29  pub async fn  parse
30  (
31    mut stream:                         &mut TcpStream,
32  )
33  ->  Result
34      <
35        Option  < KeyValuePair  >,
36        (),
37      >
38  {
39    let mut result                      =   Err ( ( ) );
40    let mut key                         =   "".to_owned ( );
41    let mut value                       =   "".to_owned ( );
42    let mut state                       =   HeaderState::Key;
43    while let Some  ( char  )           =   Request::readChar ( &mut stream )
44    {
45      match state
46      {
47        HeaderState::Key
48        =>  match char
49            {
50              ':'
51              =>  if  let Some  ( ' ' )
52                          =   Request::readChar ( &mut stream )
53                  {
54                    state               =   HeaderState::Value;
55                  }
56                  else
57                  {
58                    break;
59                  },
60              '\r'
61              =>  {
62                    if  let Some  ( '\n'  )
63                          =   Request::readChar ( &mut stream )
64                    {
65                      result            =   Ok  ( None  );
66                    }
67                    break;
68                  },
69              _
70              =>  key.push    ( char  ),
71            },
72        HeaderState::Value
73        =>  match char
74            {
75              '\r'
76              =>  {
77                    if  let Some  ( '\n'  )
78                          =   Request::readChar ( &mut stream )
79                    {
80                      result
81                      =   Ok
82                          (
83                            Some
84                            (
85                              KeyValuePair
86                              {
87                                key,
88                                value,
89                              }
90                            )
91                          );
92                    }
93                    break;
94                  },
95              _
96              =>  value.push  ( char  ),
97            },
98      }
99    }
100    result
101  }
102}
103
104/// State of the Parser parsing a Header.
105enum          HeaderState
106{
107  Key,
108  Value,
109}