1#[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 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}