handle Titan requests

This commit is contained in:
yggverse 2025-01-22 18:35:10 +02:00
parent caa61bb808
commit ee0216a1a0
2 changed files with 35 additions and 14 deletions

View file

@ -9,7 +9,7 @@ pub use response::Response;
// Local dependencies // Local dependencies
use gio::{ use gio::{
prelude::{IOStreamExt, OutputStreamExtManual, TlsConnectionExt}, prelude::{IOStreamExt, OutputStreamExt, OutputStreamExtManual, TlsConnectionExt},
Cancellable, IOStream, NetworkAddress, SocketConnection, TlsCertificate, TlsClientConnection, Cancellable, IOStream, NetworkAddress, SocketConnection, TlsCertificate, TlsClientConnection,
}; };
use glib::{ use glib::{
@ -60,23 +60,44 @@ impl Connection {
cancellable: Cancellable, cancellable: Cancellable,
callback: impl FnOnce(Result<Response, Error>) + 'static, callback: impl FnOnce(Result<Response, Error>) + 'static,
) { ) {
self.stream().output_stream().write_async( let output_stream = self.stream().output_stream();
output_stream.clone().write_async(
request.header().into_bytes(), request.header().into_bytes(),
priority, priority,
Some(&cancellable.clone()), Some(&cancellable.clone()),
move |result| match result { move |result| match result {
Ok(_) => { Ok(_) => match request {
// Read response Request::Gemini(..) => {
Response::from_connection_async(self, priority, cancellable, move |result| { Response::from_connection_async(self, priority, cancellable, |result| {
callback(match result { callback(match result {
Ok(response) => Ok(response), Ok(response) => Ok(response),
Err(e) => Err(Error::Response(e)), Err(e) => Err(Error::Response(e)),
}) })
}) })
} }
Err((b, e)) => callback(Err(Error::Request((b, e)))), Request::Titan(this) => output_stream.write_bytes_async(
&this.data,
priority,
Some(&cancellable.clone()),
move |result| match result {
Ok(_) => Response::from_connection_async(
self,
priority,
cancellable,
|result| {
callback(match result {
Ok(response) => Ok(response),
Err(e) => Err(Error::Response(e)),
})
}, },
); ),
Err(e) => callback(Err(Error::Request(e))),
},
),
},
Err((_, e)) => callback(Err(Error::Request(e))),
},
)
} }
// Getters // Getters

View file

@ -2,7 +2,7 @@ use std::fmt::{Display, Formatter, Result};
#[derive(Debug)] #[derive(Debug)]
pub enum Error { pub enum Error {
Request((Vec<u8>, glib::Error)), Request(glib::Error),
Response(crate::client::connection::response::Error), Response(crate::client::connection::response::Error),
TlsClientConnection(glib::Error), TlsClientConnection(glib::Error),
} }
@ -10,7 +10,7 @@ pub enum Error {
impl Display for Error { impl Display for Error {
fn fmt(&self, f: &mut Formatter) -> Result { fn fmt(&self, f: &mut Formatter) -> Result {
match self { match self {
Self::Request((_, e)) => { Self::Request(e) => {
write!(f, "Request error: {e}") write!(f, "Request error: {e}")
} }
Self::Response(e) => { Self::Response(e) => {