}
}
-pub fn push(headers: &Vec<String>) -> (String, String) {
+pub fn push(headers: &Vec<String>, body: String) -> (String, String) {
if !get_authorization(headers) {
(
String::from("403 FORBIDDEN"),
String::from("You are not authorized to view this endpoint"),
)
} else {
- if data::push_data(headers) {
+ if data::push_data(body) {
(
String::from("200 OK"),
String::from("Data successfully synced to server"),
false
}
- pub fn get_client_data(headers: &Vec<String>) -> Option<String> {
- for header in headers {
- if header.starts_with("Data: ") {
- return Some(header.replace("Data: ", ""));
+ pub fn handle_connection(mut stream: TcpStream) {
+ // Source - https://stackoverflow.com/a/72019105
+ let mut reader = BufReader::new(&stream);
+ let mut headers_raw = String::new();
+ loop {
+ let r = reader.read_line(&mut headers_raw).unwrap();
+ if r == 2 {
+ //detect empty line
+ break;
}
}
- None
- }
+ let mut size = 0;
+ let headers: Vec<String> = headers_raw
+ .split("\r\n")
+ .map(|line| String::from(line))
+ .collect::<Vec<String>>();
+ println!("{headers:#?}");
+ for header in &headers {
+ if header.starts_with("Content-Length: ") {
+ size = header
+ .replace("Content-Length: ", "")
+ .trim()
+ .parse::<usize>()
+ .unwrap();
+ }
+ }
- pub fn handle_connection(mut stream: TcpStream) {
- let buf_reader = BufReader::new(&stream);
- let request_data: Vec<_> = buf_reader
- .lines()
- .map(|result| result.unwrap())
- .take_while(|line| !line.is_empty())
- .collect();
+ let mut buffer = vec![0; size]; //New Vector with size of Content
+ reader.read_exact(&mut buffer).unwrap(); //Get the Body Content.
+
+ let body = String::from_utf8(buffer).unwrap();
- println!("{request_data:#?}");
+ println!("{}", body);
- let request_line = &request_data[0];
+ let request_line = &headers[0];
- let (status, response) = router(&request_data, &request_line);
+ let (status, response) = router(&headers, &request_line, body);
let status_line = format!("HTTP/1.1 {}", status);
let length = response.len();
stream.write_all(response.as_bytes()).unwrap();
}
- fn router(headers: &Vec<String>, request_line: &String) -> (String, String) {
+ fn router(headers: &Vec<String>, request_line: &String, body: String) -> (String, String) {
match request_line.as_str() {
"GET / HTTP/1.1" => routes::home(),
"GET /auth HTTP/1.1" => routes::auth(headers),
"GET /pull HTTP/1.1" => routes::pull(headers),
- "POST /push HTTP/1.1" => routes::push(headers),
+ "POST /push HTTP/1.1" => routes::push(headers, body),
_ => (
String::from("404 NOT FOUND"),
String::from("The provided endpoint was not found"),