bufreader
This commit is contained in:
parent
cda627cfb5
commit
ce0a1443dc
@ -1,13 +1,10 @@
|
|||||||
use std::{
|
use std::{
|
||||||
error::Error,
|
error::Error, net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6}, str::FromStr, sync::Arc
|
||||||
net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6},
|
|
||||||
str::FromStr,
|
|
||||||
sync::Arc
|
|
||||||
};
|
};
|
||||||
|
|
||||||
use ignore_result::Ignore;
|
use ignore_result::Ignore;
|
||||||
use tokio::{
|
use tokio::{
|
||||||
io::{AsyncReadExt, AsyncWriteExt},
|
io::{AsyncBufReadExt, AsyncReadExt, AsyncWriteExt, BufReader},
|
||||||
net::{TcpListener, TcpStream}
|
net::{TcpListener, TcpStream}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -146,20 +143,11 @@ impl FlowgateServer {
|
|||||||
) -> Option<Connection> {
|
) -> Option<Connection> {
|
||||||
let mut addr = addr;
|
let mut addr = addr;
|
||||||
|
|
||||||
|
let mut stream = BufReader::new(stream);
|
||||||
|
|
||||||
match &self.config.incoming_ip_forwarding {
|
match &self.config.incoming_ip_forwarding {
|
||||||
IpForwarding::Simple => {
|
IpForwarding::Simple => {
|
||||||
let mut header = Vec::new();
|
let header = read_until(&mut stream, b"\n").await?;
|
||||||
|
|
||||||
{
|
|
||||||
let mut buf = [0; 1];
|
|
||||||
|
|
||||||
while let Ok(1) = stream.read(&mut buf).await {
|
|
||||||
let byte = buf[0];
|
|
||||||
if byte == b'\n' { break }
|
|
||||||
header.push(byte);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
addr = SocketAddr::from_str(&String::from_utf8(header).ok()?).ok()?;
|
addr = SocketAddr::from_str(&String::from_utf8(header).ok()?).ok()?;
|
||||||
},
|
},
|
||||||
IpForwarding::Modern => {
|
IpForwarding::Modern => {
|
||||||
@ -183,30 +171,10 @@ impl FlowgateServer {
|
|||||||
}, _ => { return None },
|
}, _ => { return None },
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
_ => { }
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut head = Vec::new();
|
let mut head = read_until(&mut stream, b"\r\n\r\n").await?;
|
||||||
|
|
||||||
{
|
|
||||||
let mut buf = [0; 1];
|
|
||||||
let mut counter = 0;
|
|
||||||
|
|
||||||
while let Ok(1) = stream.read(&mut buf).await {
|
|
||||||
let byte = buf[0];
|
|
||||||
head.push(byte);
|
|
||||||
|
|
||||||
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; }
|
if head.is_empty() { return None; }
|
||||||
|
|
||||||
@ -353,6 +321,7 @@ impl FlowgateServer {
|
|||||||
} else if is_chunked {
|
} else if is_chunked {
|
||||||
loop {
|
loop {
|
||||||
let mut length = Vec::new();
|
let mut length = Vec::new();
|
||||||
|
|
||||||
{
|
{
|
||||||
let mut buf = [0; 1];
|
let mut buf = [0; 1];
|
||||||
let mut counter = 0;
|
let mut counter = 0;
|
||||||
@ -371,6 +340,7 @@ impl FlowgateServer {
|
|||||||
|
|
||||||
length.truncate(length.len() - 2);
|
length.truncate(length.len() - 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
let length = String::from_utf8(length).ok()?;
|
let length = String::from_utf8(length).ok()?;
|
||||||
let length = usize::from_str_radix(length.as_str(), 16).ok()?;
|
let length = usize::from_str_radix(length.as_str(), 16).ok()?;
|
||||||
let mut data = vec![0u8; length+2];
|
let mut data = vec![0u8; length+2];
|
||||||
@ -490,3 +460,28 @@ impl FlowgateServer {
|
|||||||
Some(conn)
|
Some(conn)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn read_until(stream: &mut (impl AsyncBufReadExt + Unpin), delimiter: &[u8]) -> Option<Vec<u8>> {
|
||||||
|
let mut data = Vec::new();
|
||||||
|
let mut counter = 0usize;
|
||||||
|
|
||||||
|
let mut buf = vec![0];
|
||||||
|
|
||||||
|
while let Ok(1) = stream.read(&mut buf).await {
|
||||||
|
let char = buf[0];
|
||||||
|
data.push(char);
|
||||||
|
|
||||||
|
if char == delimiter[counter] {
|
||||||
|
counter += 1;
|
||||||
|
if counter == delimiter.len() {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
counter = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data.truncate(data.len()-delimiter.len());
|
||||||
|
|
||||||
|
Some(data)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user