send response on error

This commit is contained in:
yggverse 2025-02-22 01:25:10 +02:00
parent 04a276116d
commit a4f5c75bd0

View file

@ -38,8 +38,8 @@ fn main() -> Result<()> {
thread::spawn({
let argument = argument.clone();
let peer = stream.peer_addr()?;
let stream = acceptor.accept(stream)?;
move || handle(argument, peer, stream)
let mut stream = acceptor.accept(stream)?;
move || handle(argument, peer, &mut stream)
});
}
Err(e) => println!("[{}] [error] Failed to accept connection: {e}", now()),
@ -48,7 +48,7 @@ fn main() -> Result<()> {
Ok(())
}
fn handle(argument: Arc<Argument>, peer: SocketAddr, mut stream: TlsStream<TcpStream>) {
fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpStream>) {
use titanite::*;
println!("[{}] [info] [{peer}] New connection", now());
@ -129,44 +129,117 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, mut stream: TlsStream<TcpSt
now(),
pmt.path.to_string_lossy()
),
Err(e) => {
println!(
"[{}] [warning] [{peer}] {e}",
Err(e) => println!(
"[{}] [warning] [{peer}] {e}",
now()
),
},
),
Err((tmp, e)) => send(
&response::failure::temporary::General {
message: Some(
"Internal server error".to_string(),
),
}
.into_bytes(),
stream,
|result| {
match result {
Ok(()) => println!(
"[{}] [error] [{peer}] {e}",
now()
)
),
Err(e) => println!(
"[{}] [error] [{peer}] {e}",
now()
),
};
if let Err(e) = tmp.delete() {
println!(
"[{}] [error] [{peer}] {e}",
now()
);
}
},
),
Err((tmp, e)) => {
println!("[{}] [error] [{peer}] {e}", now());
},
Err(e) => send(
&response::failure::temporary::General {
message: Some("Internal server error".to_string()),
}
.into_bytes(),
stream,
|result| {
match result {
Ok(()) => {
println!("[{}] [error] [{peer}] {e}", now())
}
Err(e) => {
println!("[{}] [error] [{peer}] {e}", now())
}
};
if let Err(e) = tmp.delete() {
println!("[{}] [error] [{peer}] {e}", now());
}
}
},
Err(e) => {
println!("[{}] [error] [{peer}] {e}", now());
if let Err(e) = tmp.delete() {
println!("[{}] [error] [{peer}] {e}", now());
}
}
},
),
},
Err(e) => println!("[{}] [error] [{peer}] {e}", now()),
Err(e) => send(
&response::failure::temporary::General {
message: Some("Internal server error".to_string()),
}
.into_bytes(),
stream,
|result| match result {
Ok(()) => println!("[{}] [error] [{peer}] {e}", now()),
Err(e) => println!("[{}] [error] [{peer}] {e}", now()),
},
),
}
break;
}
}
Err(e) => todo!("{e}"),
Err(e) => send(
&response::failure::temporary::General {
message: Some("Internal server error".to_string()),
}
.into_bytes(),
stream,
|result| match result {
Ok(()) => println!("[{}] [error] [{peer}] {e}", now()),
Err(e) => println!("[{}] [error] [{peer}] {e}", now()),
},
),
}
}
}
Err(e) => todo!("{e}"),
Err(e) => send(
&response::failure::temporary::General {
message: Some("Internal server error".to_string()),
}
.into_bytes(),
stream,
|result| match result {
Ok(()) => println!("[{}] [error] [{peer}] {e}", now()),
Err(e) => println!("[{}] [error] [{peer}] {e}", now()),
},
),
},
Err(e) => todo!("{e}"),
Err(e) => send(
&response::failure::temporary::General {
message: Some("Internal server error".to_string()),
}
.into_bytes(),
stream,
|result| match result {
Ok(()) => println!("[{}] [error] [{peer}] {e}", now()),
Err(e) => println!("[{}] [error] [{peer}] {e}", now()),
},
),
}
}
fn send(data: &[u8], mut stream: TlsStream<TcpStream>, callback: impl FnOnce(Result<()>)) {
fn send(data: &[u8], stream: &mut TlsStream<TcpStream>, callback: impl FnOnce(Result<()>)) {
callback((|| {
stream.write_all(data)?;
stream.flush()?;