mirror of
https://github.com/YGGverse/Yoda.git
synced 2026-04-02 01:25:27 +00:00
move resolver features to client
This commit is contained in:
parent
6b02922f97
commit
22bfec8c24
2 changed files with 40 additions and 53 deletions
|
|
@ -117,3 +117,41 @@ impl Request {
|
|||
pub fn search(query: &str) -> Request {
|
||||
Request::from_uri(search::tgls(query), None, None).unwrap() // no handler as unexpected
|
||||
}
|
||||
|
||||
/// Asynchronously check request string contain resolvable query
|
||||
/// * useful for scheme-less requests, before do search redirect
|
||||
fn lookup(
|
||||
query: &str,
|
||||
cancellable: Option<&Cancellable>,
|
||||
callback: impl FnOnce(Request) + 'static,
|
||||
) {
|
||||
use gtk::{
|
||||
gio::{NetworkAddress, Resolver},
|
||||
prelude::{NetworkAddressExt, ResolverExt},
|
||||
};
|
||||
|
||||
const DEFAULT_SCHEME: &str = "gemini://";
|
||||
const DEFAULT_PORT: u16 = 1965;
|
||||
const TIMEOUT: u32 = 500;
|
||||
|
||||
let request = match query.trim().strip_prefix(DEFAULT_SCHEME) {
|
||||
Some(postfix) => format!("{DEFAULT_SCHEME}{postfix}"),
|
||||
None => query.to_string(),
|
||||
};
|
||||
|
||||
let resolver = Resolver::default();
|
||||
resolver.set_timeout(TIMEOUT);
|
||||
|
||||
match NetworkAddress::parse_uri(&request, DEFAULT_PORT) {
|
||||
Ok(connectable) => {
|
||||
resolver.lookup_by_name_async(&connectable.hostname(), cancellable, move |resolve| {
|
||||
callback(if resolve.is_ok() {
|
||||
search(&request) // @TODO begin direct request
|
||||
} else {
|
||||
search(&request)
|
||||
})
|
||||
})
|
||||
}
|
||||
Err(_) => callback(search(&request)),
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue