diff options
author | Tyler Murphy <tylerm@tylerm.dev> | 2023-07-02 18:45:41 -0400 |
---|---|---|
committer | Tyler Murphy <tylerm@tylerm.dev> | 2023-07-02 18:45:41 -0400 |
commit | cbb92993b592e6b68dbce7f283fb73d19fd1793e (patch) | |
tree | 975d41a0cd077cee9c0d9162b82256b4e8beb07b /src/http/request.rs | |
download | bashttp-cbb92993b592e6b68dbce7f283fb73d19fd1793e.tar.gz bashttp-cbb92993b592e6b68dbce7f283fb73d19fd1793e.tar.bz2 bashttp-cbb92993b592e6b68dbce7f283fb73d19fd1793e.zip |
hi
Diffstat (limited to 'src/http/request.rs')
-rw-r--r-- | src/http/request.rs | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/http/request.rs b/src/http/request.rs new file mode 100644 index 0000000..5ba72c9 --- /dev/null +++ b/src/http/request.rs @@ -0,0 +1,52 @@ +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 headers = HeaderMap::serialize(&mut lines); + let body: String = lines.collect(); + + Some(Self { + method, + uri, + headers, + body: if body.len() > 0 { Some(body) } else { None }, + }) + } +} |