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({ thread::spawn({
let argument = argument.clone(); let argument = argument.clone();
let peer = stream.peer_addr()?; let peer = stream.peer_addr()?;
let stream = acceptor.accept(stream)?; let mut stream = acceptor.accept(stream)?;
move || handle(argument, peer, stream) move || handle(argument, peer, &mut stream)
}); });
} }
Err(e) => println!("[{}] [error] Failed to accept connection: {e}", now()), Err(e) => println!("[{}] [error] Failed to accept connection: {e}", now()),
@ -48,7 +48,7 @@ fn main() -> Result<()> {
Ok(()) 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::*; use titanite::*;
println!("[{}] [info] [{peer}] New connection", now()); println!("[{}] [info] [{peer}] New connection", now());
@ -129,44 +129,117 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, mut stream: TlsStream<TcpSt
now(), now(),
pmt.path.to_string_lossy() pmt.path.to_string_lossy()
), ),
Err(e) => { Err(e) => println!(
println!( "[{}] [warning] [{peer}] {e}",
"[{}] [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() 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() { if let Err(e) = tmp.delete() {
println!("[{}] [error] [{peer}] {e}", now()); 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; 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((|| { callback((|| {
stream.write_all(data)?; stream.write_all(data)?;
stream.flush()?; stream.flush()?;