some keep alive rewrite
This commit is contained in:
parent
5180979d6b
commit
4bcce84631
@ -216,7 +216,7 @@ impl FlowgateServer {
|
|||||||
https: bool,
|
https: bool,
|
||||||
connected: Option<(TcpStream, SiteConfig, bool, String)>
|
connected: Option<(TcpStream, SiteConfig, bool, String)>
|
||||||
) -> Option<(TcpStream, SiteConfig, bool, String)> {
|
) -> Option<(TcpStream, SiteConfig, bool, String)> {
|
||||||
let mut head = Vec::with_capacity(4096);
|
let mut head = Vec::new();
|
||||||
|
|
||||||
{
|
{
|
||||||
let mut buf = [0; 1];
|
let mut buf = [0; 1];
|
||||||
@ -238,6 +238,8 @@ impl FlowgateServer {
|
|||||||
head.truncate(head.len() - 4);
|
head.truncate(head.len() - 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// println!("read client head");
|
||||||
|
|
||||||
if head.is_empty() { return None; }
|
if head.is_empty() { return None; }
|
||||||
|
|
||||||
let head_str = String::from_utf8(head.clone()).ok()?;
|
let head_str = String::from_utf8(head.clone()).ok()?;
|
||||||
@ -272,14 +274,13 @@ impl FlowgateServer {
|
|||||||
connected?
|
connected?
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut content_length = 0;
|
let content_length = headers
|
||||||
|
.iter()
|
||||||
for (key, value) in &headers {
|
.filter(|(k, _)| k.to_lowercase() == "content-length")
|
||||||
match key.to_lowercase().as_str() {
|
.next()
|
||||||
"content-length" => content_length = value.parse().ok()?,
|
.map(|o| o.1.parse().ok())
|
||||||
_ => {}
|
.flatten()
|
||||||
}
|
.unwrap_or(0usize);
|
||||||
}
|
|
||||||
|
|
||||||
let mut reqbuf: Vec<u8> = Vec::new();
|
let mut reqbuf: Vec<u8> = Vec::new();
|
||||||
|
|
||||||
@ -308,19 +309,79 @@ impl FlowgateServer {
|
|||||||
|
|
||||||
connected.0.write_all(&reqbuf).ok()?;
|
connected.0.write_all(&reqbuf).ok()?;
|
||||||
|
|
||||||
|
// println!("wrote client head to server");
|
||||||
|
|
||||||
if content_length > 0 {
|
if content_length > 0 {
|
||||||
let mut buf = Vec::with_capacity(content_length);
|
let mut read = 0usize;
|
||||||
stream.read_exact(&mut buf).ok()?;
|
let mut buf = vec![0; 4096];
|
||||||
|
while let Ok(size) = stream.read(&mut buf) {
|
||||||
|
if size == 0 { break }
|
||||||
|
read += size;
|
||||||
|
buf.truncate(size);
|
||||||
connected.0.write_all(&buf).ok()?;
|
connected.0.write_all(&buf).ok()?;
|
||||||
|
buf = vec![0; 4096];
|
||||||
|
if read == content_length { break }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut buf = Vec::new();
|
// println!("wrote client body to server");
|
||||||
while let Ok(size) = connected.0.read_to_end(&mut buf) {
|
|
||||||
if size == 0 { break }
|
{
|
||||||
|
let mut head = Vec::new();
|
||||||
|
|
||||||
|
{
|
||||||
|
let mut buf = [0; 1];
|
||||||
|
let mut counter = 0;
|
||||||
|
|
||||||
|
while let Ok(1) = connected.0.read(&mut buf) {
|
||||||
|
let byte = buf[0];
|
||||||
|
head.push(byte);
|
||||||
|
|
||||||
stream.write_all(&buf).ok()?;
|
stream.write_all(&buf).ok()?;
|
||||||
buf = Vec::new();
|
|
||||||
|
counter = match (counter, byte) {
|
||||||
|
(0, b'\r') => 1,
|
||||||
|
(1, b'\n') => 2,
|
||||||
|
(2, b'\r') => 3,
|
||||||
|
(3, b'\n') => break,
|
||||||
|
_ => 0,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
head.truncate(head.len() - 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
if head.is_empty() { return None; }
|
||||||
|
|
||||||
|
let head_str = String::from_utf8(head.clone()).ok()?;
|
||||||
|
let head_str = head_str.trim_matches(char::from(0));
|
||||||
|
|
||||||
|
let content_length = head_str.split("\r\n")
|
||||||
|
.skip(1)
|
||||||
|
.filter(|l| l.contains(": "))
|
||||||
|
.map(|l| l.split_once(": ").unwrap())
|
||||||
|
.filter(|(k, _)| k.to_lowercase() == "content-length")
|
||||||
|
.next()
|
||||||
|
.map(|o| o.1.parse().ok())
|
||||||
|
.flatten()
|
||||||
|
.unwrap_or(0usize);
|
||||||
|
|
||||||
|
if content_length > 0 {
|
||||||
|
let mut read = 0usize;
|
||||||
|
let mut buf = vec![0; 4096];
|
||||||
|
while let Ok(size) = connected.0.read(&mut buf) {
|
||||||
|
if size == 0 { break }
|
||||||
|
read += size;
|
||||||
|
buf.truncate(size);
|
||||||
|
stream.write_all(&buf).ok()?;
|
||||||
|
buf = vec![0; 4096];
|
||||||
|
if read == content_length { break }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// println!("wrote server response to client");
|
||||||
|
|
||||||
info!("{addr} > {} {}://{}{}", status_seq[0], if https { "https" } else { "http" }, connected.3, status_seq[1]);
|
info!("{addr} > {} {}://{}{}", status_seq[0], if https { "https" } else { "http" }, connected.3, status_seq[1]);
|
||||||
|
|
||||||
Some(connected)
|
Some(connected)
|
||||||
|
Loading…
Reference in New Issue
Block a user