chore: much better readable code
This commit is contained in:
+21
-37
@@ -1,5 +1,10 @@
|
||||
//! # Tuxcord Reverse Proxy Header Authenthication
|
||||
#![feature(rwlock_downgrade, try_blocks)]
|
||||
#![feature(
|
||||
rwlock_downgrade,
|
||||
try_blocks,
|
||||
iterator_try_collect,
|
||||
anonymous_lifetime_in_impl_trait
|
||||
)]
|
||||
|
||||
use std::{
|
||||
fs::File,
|
||||
@@ -11,10 +16,13 @@ use std::{
|
||||
|
||||
use clap::Parser;
|
||||
|
||||
use crate::utils::headers::HeadersExt;
|
||||
|
||||
pub mod args;
|
||||
pub mod config;
|
||||
#[cfg(feature = "ipc")]
|
||||
pub mod ipc;
|
||||
pub mod utils;
|
||||
|
||||
use args::Args;
|
||||
|
||||
@@ -78,54 +86,30 @@ fn handle_client(client: &mut TcpStream, config: &config::Schema) -> Result<(),
|
||||
let mut header_buf = [0u8; 1024 * 8];
|
||||
let mut read_pos = 0usize;
|
||||
|
||||
let pos = loop {
|
||||
let mut headers;
|
||||
let (pos, req) = loop {
|
||||
headers = [httparse::EMPTY_HEADER; 16];
|
||||
let mut req = httparse::Request::new(&mut headers);
|
||||
|
||||
let Ok(n) = client.read(&mut header_buf[read_pos..]) else {
|
||||
return Err("error reading stream");
|
||||
};
|
||||
read_pos += n;
|
||||
|
||||
let pos = header_buf
|
||||
.windows(b"\r\n\r\n".len())
|
||||
.position(|w| w == b"\r\n\r\n");
|
||||
if let Some(pos) = pos {
|
||||
break pos;
|
||||
};
|
||||
if let Ok(httparse::Status::Complete(n)) = req.parse(&header_buf[0..read_pos]) {
|
||||
break (n - b"\r\n\r\n".len(), req);
|
||||
}
|
||||
};
|
||||
|
||||
let mut headers = [httparse::EMPTY_HEADER; 16];
|
||||
let mut req = httparse::Request::new(&mut headers);
|
||||
let Ok(httparse::Status::Complete(_)) =
|
||||
httparse::Request::parse(&mut req, &header_buf[0..(pos + b"\r\n\r\n".len())])
|
||||
else {
|
||||
return Err("parsing request was not complete");
|
||||
};
|
||||
let theres_body = req.headers.has_any(["conten-length", "transfer-encoding"]);
|
||||
|
||||
let theres_body = req
|
||||
.headers
|
||||
.iter()
|
||||
.any(|header| header.name.to_lowercase() == "content-length")
|
||||
|| req
|
||||
.headers
|
||||
.iter()
|
||||
.any(|header| header.name.to_lowercase() == "transfer-encoding");
|
||||
|
||||
let Some(header) = req
|
||||
.headers
|
||||
.iter()
|
||||
.find(|header| header.name.to_lowercase() == "host")
|
||||
else {
|
||||
let Some(host_header) = req.headers.get("host") else {
|
||||
return Err("failed to find \"host\" header");
|
||||
};
|
||||
|
||||
let Ok(host_header) = String::from_utf8(header.value.to_vec()) else {
|
||||
return Err("\"host\" header is not valid UTF-8");
|
||||
};
|
||||
|
||||
// Now find that header and pas everything
|
||||
let Ok(read_hosts) = config.hosts.read() else {
|
||||
return Err("poisoned RwLock");
|
||||
};
|
||||
let Some(addr) = read_hosts.get(&host_header) else {
|
||||
let read_hosts = config.hosts.read();
|
||||
let Some((addr, _, _)) = read_hosts.get(host_header.as_ref()) else {
|
||||
return Err("host not in hashmap");
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user