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}