rustigo/
request.rs

1/// Request struct
2#[derive(Debug)]
3pub struct Request {
4    pub user_agent: String,
5    pub resource: String,
6    pub mode: String,
7    pub content_length: Option<usize>,
8}
9
10impl Request {
11    /// Create a new Request struct.
12    /// This will "parse" the raw request and create a Request struct.
13    pub fn new(raw: Vec<String>) -> Result<Self, String> {
14        let user_agent = raw
15            .iter()
16            .find(|x| x.contains("User-Agent: "))
17            .ok_or("No user agent.")?
18            .strip_prefix("User-Agent: ")
19            .ok_or("Failed to strip.")?
20            .to_string();
21
22        let resource = raw
23            .first()
24            .ok_or("No mode")?
25            .split(' ')
26            .nth(1)
27            .ok_or("Failed to get resource.")?
28            .to_string();
29
30        let mode = raw
31            .first()
32            .ok_or("No mode")?
33            .split(' ')
34            .nth(0)
35            .ok_or("Failed to get resource.")?
36            .to_string();
37
38        let content_length = raw
39            .iter()
40            .find(|x| x.contains("Content-Length: "))
41            .and_then(|x| {
42                x.strip_prefix("Content-Length: ")
43                    .and_then(|x| x.parse::<usize>().ok())
44            });
45
46        Ok(Self {
47            user_agent,
48            resource,
49            mode,
50            content_length,
51        })
52    }
53}