mirror of
https://github.com/YGGverse/titanit.git
synced 2026-03-31 17:15:30 +00:00
record stream directly to file
This commit is contained in:
parent
f62153ac91
commit
69b0186d01
1 changed files with 107 additions and 129 deletions
78
src/main.rs
78
src/main.rs
|
|
@ -51,7 +51,8 @@ fn main() -> Result<()> {
|
||||||
fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut 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());
|
||||||
|
// validate totals
|
||||||
|
let mut total = 0;
|
||||||
// read header bytes
|
// read header bytes
|
||||||
let mut input = vec![0; 1024];
|
let mut input = vec![0; 1024];
|
||||||
match stream.read(&mut input) {
|
match stream.read(&mut input) {
|
||||||
|
|
@ -92,21 +93,20 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Request::Titan(titan) => {
|
Request::Titan(titan) => match storage::Item::create(&argument.directory) {
|
||||||
// init memory pool
|
Ok(mut tmp) => loop {
|
||||||
let mut data: Vec<u8> = Vec::with_capacity(titan.size);
|
|
||||||
loop {
|
|
||||||
// read data bytes
|
|
||||||
let mut input = vec![0; argument.chunk];
|
let mut input = vec![0; argument.chunk];
|
||||||
match stream.read(&mut input) {
|
match stream.read(&mut input) {
|
||||||
Ok(0) => println!(
|
Ok(0) => println!(
|
||||||
"[{}] [warning] [{peer}] Connection closed by peer",
|
"[{}] [warning] [{peer}] Connection closed by peer",
|
||||||
now()
|
now()
|
||||||
),
|
),
|
||||||
Ok(l) => {
|
Ok(l) => match tmp.file.write(&input[..l]) {
|
||||||
data.extend(&input[..l]);
|
Ok(s) => {
|
||||||
// calculate once
|
total += s;
|
||||||
let total = data.len();
|
if s != l {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
// validate server-side limits
|
// validate server-side limits
|
||||||
if argument.size.is_some_and(|limit| total > limit) {
|
if argument.size.is_some_and(|limit| total > limit) {
|
||||||
const MESSAGE: &str =
|
const MESSAGE: &str =
|
||||||
|
|
@ -123,7 +123,10 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
|
||||||
now()
|
now()
|
||||||
),
|
),
|
||||||
Err(e) => {
|
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
|
// @TODO detect/validate/cache mime based on data received
|
||||||
// success
|
// success
|
||||||
match storage::Item::create(&argument.directory) {
|
match tmp.commit() {
|
||||||
Ok(mut tmp) => match tmp.file.write(&data) {
|
|
||||||
Ok(_) => match tmp.commit() {
|
|
||||||
Ok(pmt) => send(
|
Ok(pmt) => send(
|
||||||
&response::redirect::Permanent {
|
&response::redirect::Permanent {
|
||||||
target: match argument.redirect {
|
target: match argument.redirect {
|
||||||
|
|
@ -171,12 +172,13 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
|
||||||
"gemini://{}/{}",
|
"gemini://{}/{}",
|
||||||
argument.bind,
|
argument.bind,
|
||||||
pmt.to_uri(&argument.directory)
|
pmt.to_uri(&argument.directory)
|
||||||
)
|
),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
.into_bytes(),
|
.into_bytes(),
|
||||||
stream,
|
stream,
|
||||||
|result| match result {
|
|result| {
|
||||||
|
match result {
|
||||||
Ok(()) => println!(
|
Ok(()) => println!(
|
||||||
"[{}] [info] [{peer}] Data saved to {}",
|
"[{}] [info] [{peer}] Data saved to {}",
|
||||||
now(),
|
now(),
|
||||||
|
|
@ -186,6 +188,7 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
|
||||||
"[{}] [warning] [{peer}] {e}",
|
"[{}] [warning] [{peer}] {e}",
|
||||||
now()
|
now()
|
||||||
),
|
),
|
||||||
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
Err((tmp, e)) => send(
|
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(
|
Err(e) => send(
|
||||||
&response::failure::temporary::General {
|
&response::failure::temporary::General {
|
||||||
|
|
@ -222,50 +230,20 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
|
||||||
}
|
}
|
||||||
.into_bytes(),
|
.into_bytes(),
|
||||||
stream,
|
stream,
|
||||||
|result| {
|
|result| match result {
|
||||||
match result {
|
|
||||||
Ok(()) => {
|
Ok(()) => {
|
||||||
println!("[{}] [error] [{peer}] {e}", now())
|
println!("[{}] [error] [{peer}] {e}", now())
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
println!("[{}] [error] [{peer}] {e}", now())
|
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(
|
Err(e) => send(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue