add route for gemini requests

This commit is contained in:
yggverse 2025-02-22 01:33:38 +02:00
parent a4f5c75bd0
commit 2532b3e11c

View file

@ -56,8 +56,12 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
let mut input = vec![0; 1024]; let mut input = vec![0; 1024];
match stream.read(&mut input) { match stream.read(&mut input) {
Ok(0) => println!("[{}] [warning] [{peer}] Connection closed by peer", now()), Ok(0) => println!("[{}] [warning] [{peer}] Connection closed by peer", now()),
Ok(l) => match request::Titan::from_bytes(&input[..l]) { Ok(l) => {
Ok(titan) => { match Request::from_bytes(&input[..l]) {
Ok(request) => {
match request {
Request::Gemini(gemini) => println!("request: {}", gemini.url), // @TODO
Request::Titan(titan) => {
// init memory pool // init memory pool
let mut data: Vec<u8> = Vec::with_capacity(titan.size); let mut data: Vec<u8> = Vec::with_capacity(titan.size);
loop { loop {
@ -65,7 +69,10 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
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) => { Ok(0) => {
println!("[{}] [warning] [{peer}] Connection closed by peer", now()) println!(
"[{}] [warning] [{peer}] Connection closed by peer",
now()
)
} }
Ok(l) => { Ok(l) => {
data.extend(&input[..l]); data.extend(&input[..l]);
@ -75,7 +82,8 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
// 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 = "Allowed max length limit reached"; const MESSAGE: &str =
"Allowed max length limit reached";
return send( return send(
&response::failure::permanent::BadRequest { &response::failure::permanent::BadRequest {
message: Some(MESSAGE.to_string()), message: Some(MESSAGE.to_string()),
@ -84,9 +92,14 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
stream, stream,
|result| match result { |result| match result {
Ok(()) => { Ok(()) => {
println!("[{}] [warning] [{peer}] {MESSAGE}", now()) println!(
"[{}] [warning] [{peer}] {MESSAGE}",
now()
)
}
Err(e) => {
println!("[{}] [error] [{peer}] {e}", now())
} }
Err(e) => println!("[{}] [error] [{peer}] {e}", now()),
}, },
); );
} }
@ -95,7 +108,8 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
if titan.size >= total { if titan.size >= total {
// validate client-side limits // validate client-side limits
if titan.size > total { if titan.size > total {
const MESSAGE: &str = "Data size mismatch header declaration"; const MESSAGE: &str =
"Data size mismatch header declaration";
return send( return send(
&response::failure::permanent::BadRequest { &response::failure::permanent::BadRequest {
message: Some(MESSAGE.to_string()), message: Some(MESSAGE.to_string()),
@ -104,9 +118,15 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
stream, stream,
|result| match result { |result| match result {
Ok(()) => { Ok(()) => {
println!("[{}] [warning] [{peer}] {MESSAGE}", now()) println!(
"[{}] [warning] [{peer}] {MESSAGE}",
now()
)
} }
Err(e) => println!("[{}] [error] [{peer}] {e}", now()), Err(e) => println!(
"[{}] [error] [{peer}] {e}",
now()
),
}, },
); );
} }
@ -213,6 +233,8 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
} }
} }
} }
}
}
Err(e) => send( Err(e) => send(
&response::failure::temporary::General { &response::failure::temporary::General {
message: Some("Internal server error".to_string()), message: Some("Internal server error".to_string()),
@ -224,7 +246,8 @@ fn handle(argument: Arc<Argument>, peer: SocketAddr, stream: &mut TlsStream<TcpS
Err(e) => println!("[{}] [error] [{peer}] {e}", now()), Err(e) => println!("[{}] [error] [{peer}] {e}", now()),
}, },
), ),
}, }
}
Err(e) => send( Err(e) => send(
&response::failure::temporary::General { &response::failure::temporary::General {
message: Some("Internal server error".to_string()), message: Some("Internal server error".to_string()),