summaryrefslogtreecommitdiff
path: root/src/http/request.rs
blob: 286efa3b150910912b3f3936fbc834c27d09d6aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
use super::{method::Method, uri::URI, header::HeaderMap};

#[derive(Debug, Clone)]
pub struct Request {
    pub method: Method,
    pub uri: URI,
    pub headers: HeaderMap, 
    pub body: Option<String>
}

impl Request {
    pub fn serialize(req: &str) -> Option<Self> {
        let mut lines = req.split('\n').to_owned(); 
        
        let Some(head) = lines.next() else {
            eprintln!("missing head str");
            return None
        };

        let mut parts = head.trim().split(" ");

        let Some(method_str) = parts.next() else {
            eprintln!("missing method str");
            return None
        };

        let Some(method) = Method::serialize(method_str.trim()) else {
            eprintln!("invalid http method");
            return None
        };

        let Some(uri_str) = parts.next() else {
            eprintln!("missing uri str");
            return None
        };

        let Some(uri) = URI::serialize(uri_str.trim()) else {
            eprintln!("invalid http uri");
            return None
        };

        let mut headers = HeaderMap::new();
        headers.serialize(&mut lines);
        
        let body: String = lines.collect();

        Some(Self {
            method,
            uri,
            headers,
            body: if body.len() > 0 { Some(body) } else { None },
        })
    }
}