summaryrefslogtreecommitdiff
path: root/src/http/request.rs
diff options
context:
space:
mode:
authorTyler Murphy <tylerm@tylerm.dev>2023-07-02 18:45:41 -0400
committerTyler Murphy <tylerm@tylerm.dev>2023-07-02 18:45:41 -0400
commitcbb92993b592e6b68dbce7f283fb73d19fd1793e (patch)
tree975d41a0cd077cee9c0d9162b82256b4e8beb07b /src/http/request.rs
downloadbashttp-cbb92993b592e6b68dbce7f283fb73d19fd1793e.tar.gz
bashttp-cbb92993b592e6b68dbce7f283fb73d19fd1793e.tar.bz2
bashttp-cbb92993b592e6b68dbce7f283fb73d19fd1793e.zip
hi
Diffstat (limited to 'src/http/request.rs')
-rw-r--r--src/http/request.rs52
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 },
+ })
+ }
+}