record stream directly to file

This commit is contained in:
yggverse 2025-02-22 06:48:13 +02:00
parent f62153ac91
commit 69b0186d01

View file

@ -51,7 +51,8 @@ fn main() -> Result<()> {
fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpStream>) {
use titanite::*;
println!("[{}] [info] [{peer}] New connection", now());
// validate totals
let mut total = 0;
// read header bytes
let mut input = vec![0; 1024];
match stream.read(&mut input) {
@ -92,21 +93,20 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
),
}
}
Request::Titan(titan) => {
// init memory pool
let mut data: Vec<u8> = Vec::with_capacity(titan.size);
loop {
// read data bytes
Request::Titan(titan) => match storage::Item::create(&argument.directory) {
Ok(mut tmp) => loop {
let mut input = vec![0; argument.chunk];
match stream.read(&mut input) {
Ok(0) => println!(
"[{}] [warning] [{peer}] Connection closed by peer",
now()
),
Ok(l) => {
data.extend(&input[..l]);
// calculate once
let total = data.len();
Ok(l) => match tmp.file.write(&input[..l]) {
Ok(s) => {
total += s;
if s != l {
todo!()
}
// validate server-side limits
if argument.size.is_some_and(|limit| total > limit) {
const MESSAGE: &str =
@ -123,7 +123,10 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
now()
),
Err(e) => {
println!("[{}] [error] [{peer}] {e}", now())
println!(
"[{}] [error] [{peer}] {e}",
now()
)
}
},
);
@ -156,9 +159,7 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
}
// @TODO detect/validate/cache mime based on data received
// success
match storage::Item::create(&argument.directory) {
Ok(mut tmp) => match tmp.file.write(&data) {
Ok(_) => match tmp.commit() {
match tmp.commit() {
Ok(pmt) => send(
&response::redirect::Permanent {
target: match argument.redirect {
@ -171,12 +172,13 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
"gemini://{}/{}",
argument.bind,
pmt.to_uri(&argument.directory)
)
),
},
}
.into_bytes(),
stream,
|result| match result {
|result| {
match result {
Ok(()) => println!(
"[{}] [info] [{peer}] Data saved to {}",
now(),
@ -186,6 +188,7 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
"[{}] [warning] [{peer}] {e}",
now()
),
}
},
),
Err((tmp, e)) => send(
@ -215,6 +218,11 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
}
},
),
}
break;
}
}
Err(e) => todo!(),
},
Err(e) => send(
&response::failure::temporary::General {
@ -222,50 +230,20 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
}
.into_bytes(),
stream,
|result| {
match result {
|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) => 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) => 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!(),
},
}
}
Err(e) => send(