mirror of
https://github.com/YGGverse/Yoda.git
synced 2026-04-01 09:05:27 +00:00
implement gemini redirection handler
This commit is contained in:
parent
983655e934
commit
4f7df8ea44
2 changed files with 56 additions and 56 deletions
|
|
@ -14,17 +14,20 @@ use gtk::{
|
|||
pub enum Request {
|
||||
Gemini {
|
||||
feature: Feature,
|
||||
referrer: Vec<Self>,
|
||||
referrer: Option<Box<Self>>,
|
||||
uri: Uri,
|
||||
},
|
||||
Titan {
|
||||
referrer: Option<Box<Self>>,
|
||||
uri: Uri,
|
||||
},
|
||||
Titan(Uri),
|
||||
}
|
||||
|
||||
impl Request {
|
||||
// Constructors
|
||||
|
||||
/// Create new `Self` from featured string
|
||||
pub fn parse(query: &str, referrer: Option<Vec<Self>>) -> Result<Self, Error> {
|
||||
pub fn parse(query: &str, referrer: Option<Box<Self>>) -> Result<Self, Error> {
|
||||
let (feature, request) = Feature::parse(query);
|
||||
|
||||
match Uri::parse(request, UriFlags::NONE) {
|
||||
|
|
@ -37,15 +40,15 @@ impl Request {
|
|||
pub fn from_uri(
|
||||
uri: Uri,
|
||||
feature: Option<Feature>,
|
||||
referrer: Option<Vec<Self>>,
|
||||
referrer: Option<Box<Self>>,
|
||||
) -> Result<Self, Error> {
|
||||
match uri.scheme().as_str() {
|
||||
"gemini" => Ok(Self::Gemini {
|
||||
feature: feature.unwrap_or_default(),
|
||||
referrer: referrer.unwrap_or_default(),
|
||||
referrer,
|
||||
uri,
|
||||
}),
|
||||
"titan" => Ok(Self::Titan(uri)),
|
||||
"titan" => Ok(Self::Titan { referrer, uri }),
|
||||
_ => Err(Error::Unsupported),
|
||||
}
|
||||
}
|
||||
|
|
@ -65,7 +68,10 @@ impl Request {
|
|||
referrer,
|
||||
uri,
|
||||
} => gemini::send(client, feature, uri, referrer, cancellable, callback),
|
||||
Self::Titan(_) => todo!(),
|
||||
Self::Titan {
|
||||
referrer: _,
|
||||
uri: _,
|
||||
} => todo!(),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -79,7 +85,19 @@ impl Request {
|
|||
referrer: _,
|
||||
uri,
|
||||
}
|
||||
| Self::Titan(uri) => uri,
|
||||
| Self::Titan { referrer: _, uri } => uri,
|
||||
}
|
||||
}
|
||||
|
||||
/// Recursively count referrers of `Self`
|
||||
/// * useful to apply redirection rules by protocol driver selected
|
||||
pub fn referrers(&self) -> usize {
|
||||
let count = match self {
|
||||
Request::Gemini { referrer, .. } => referrer,
|
||||
Request::Titan { referrer, .. } => referrer,
|
||||
}
|
||||
.as_ref()
|
||||
.map_or(0, |request| request.referrers());
|
||||
1 + count
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue