fix header bytes read

This commit is contained in:
yggverse 2025-02-23 05:23:21 +02:00
parent cfeb6bb62a
commit 275abf3b39

View file

@ -59,14 +59,37 @@ fn handle(
//println!("[{}] [info] [{peer}] New connection", now());
match connection {
Ok(mut stream) => {
let mut input = vec![0; titanite::HEADER_MAX_LEN];
match stream.read(&mut input) {
Ok(0) => println!("[{}] [warning] [{peer}] Peer closed connection", now()),
Ok(s) => match Request::from_bytes(&input[..s]) {
Ok(request) => match request {
Request::Gemini(this) => gemini(this, argument, peer, &mut stream),
Request::Titan(this) => titan(this, argument, peer, &mut stream),
},
let mut header = Vec::with_capacity(HEADER_MAX_LEN);
loop {
let mut buffer = vec![0];
match stream.read(&mut buffer) {
Ok(0) => println!("[{}] [warning] [{peer}] Peer closed connection", now()),
Ok(_) => {
header.push(buffer[0]);
if header.len() > HEADER_MAX_LEN || buffer[0] == b'\n' {
return match Request::from_bytes(&header) {
Ok(request) => match request {
Request::Gemini(this) => {
gemini(this, &argument, &peer, &mut stream)
}
Request::Titan(this) => {
titan(this, &argument, &peer, &mut stream)
}
},
Err(e) => send(
&response::failure::temporary::General {
message: Some("Internal server error".to_string()),
}
.into_bytes(),
&mut stream,
|result| match result {
Ok(()) => println!("[{}] [warning] [{peer}] {e}", now()),
Err(e) => println!("[{}] [error] [{peer}] {e}", now()),
},
),
};
}
}
Err(e) => send(
&response::failure::temporary::General {
message: Some("Internal server error".to_string()),
@ -78,18 +101,7 @@ fn handle(
Err(e) => println!("[{}] [error] [{peer}] {e}", now()),
},
),
},
Err(e) => send(
&response::failure::temporary::General {
message: Some("Internal server error".to_string()),
}
.into_bytes(),
&mut stream,
|result| match result {
Ok(()) => println!("[{}] [warning] [{peer}] {e}", now()),
Err(e) => println!("[{}] [error] [{peer}] {e}", now()),
},
),
}
}
}
Err(e) => println!("[{}] [warning] [{peer}] Handshake issue: {e}", now()),
@ -98,8 +110,8 @@ fn handle(
fn gemini(
gemini: titanite::request::Gemini,
argument: Arc<Argument>,
peer: SocketAddr,
argument: &Argument,
peer: &SocketAddr,
stream: &mut TlsStream<TcpStream>,
) {
use titanite::*;
@ -119,7 +131,7 @@ fn gemini(
let l = item.file.read_at(&mut data, read as u64).unwrap();
stream.write_all(&data[..l]).unwrap();
read += l;
println!("[{}] [info] [{peer}] Chunk sent: {l} ({read} total)", now());
// println!("[{}] [info] [{peer}] Chunk sent: {l} ({read} total)", now());
// EOF
if l == 0 {
stream.flush().unwrap();
@ -147,8 +159,8 @@ fn gemini(
fn titan(
titan: titanite::request::Titan,
argument: Arc<Argument>,
peer: SocketAddr,
argument: &Argument,
peer: &SocketAddr,
stream: &mut TlsStream<TcpStream>,
) {
use titanite::*;