mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-07-06 04:45:24 +02:00
Add custom DNS resolver for *.localhost (#280)
This commit is contained in:
Generated
+6
-4
@@ -1259,7 +1259,7 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
"option-ext",
|
"option-ext",
|
||||||
"redox_users",
|
"redox_users",
|
||||||
"windows-sys 0.60.2",
|
"windows-sys 0.61.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -2352,9 +2352,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hyper-util"
|
name = "hyper-util"
|
||||||
version = "0.1.14"
|
version = "0.1.17"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb"
|
checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
"bytes",
|
"bytes",
|
||||||
@@ -2368,7 +2368,7 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"socket2 0.5.10",
|
"socket2 0.6.1",
|
||||||
"system-configuration",
|
"system-configuration",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tower-service",
|
"tower-service",
|
||||||
@@ -7816,6 +7816,7 @@ dependencies = [
|
|||||||
"cookie",
|
"cookie",
|
||||||
"eventsource-client",
|
"eventsource-client",
|
||||||
"http",
|
"http",
|
||||||
|
"hyper-util",
|
||||||
"log",
|
"log",
|
||||||
"md5 0.8.0",
|
"md5 0.8.0",
|
||||||
"mime_guess",
|
"mime_guess",
|
||||||
@@ -7841,6 +7842,7 @@ dependencies = [
|
|||||||
"thiserror 2.0.17",
|
"thiserror 2.0.17",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-stream",
|
"tokio-stream",
|
||||||
|
"tower-service",
|
||||||
"ts-rs",
|
"ts-rs",
|
||||||
"uuid",
|
"uuid",
|
||||||
"yaak-common",
|
"yaak-common",
|
||||||
|
|||||||
@@ -68,6 +68,8 @@ tauri-plugin-shell = { workspace = true }
|
|||||||
tauri-plugin-single-instance = { version = "2.3.4", features = ["deep-link"] }
|
tauri-plugin-single-instance = { version = "2.3.4", features = ["deep-link"] }
|
||||||
tauri-plugin-updater = "2.9.0"
|
tauri-plugin-updater = "2.9.0"
|
||||||
tauri-plugin-window-state = "2.4.0"
|
tauri-plugin-window-state = "2.4.0"
|
||||||
|
hyper-util = { version = "0.1.17", default-features = false, features = ["client-legacy"] }
|
||||||
|
tower-service = "0.3.3"
|
||||||
thiserror = { workspace = true }
|
thiserror = { workspace = true }
|
||||||
tokio = { workspace = true, features = ["sync"] }
|
tokio = { workspace = true, features = ["sync"] }
|
||||||
tokio-stream = "0.1.17"
|
tokio-stream = "0.1.17"
|
||||||
|
|||||||
@@ -0,0 +1,54 @@
|
|||||||
|
use hyper_util::client::legacy::connect::dns::{
|
||||||
|
GaiResolver as HyperGaiResolver, Name as HyperName,
|
||||||
|
};
|
||||||
|
use reqwest::dns::{Addrs, Name, Resolve, Resolving};
|
||||||
|
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
|
||||||
|
use std::str::FromStr;
|
||||||
|
use std::sync::Arc;
|
||||||
|
use tower_service::Service;
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub(crate) struct LocalhostResolver {
|
||||||
|
fallback: HyperGaiResolver,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl LocalhostResolver {
|
||||||
|
pub fn new() -> Arc<Self> {
|
||||||
|
let resolver = HyperGaiResolver::new();
|
||||||
|
Arc::new(Self { fallback: resolver })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Resolve for LocalhostResolver {
|
||||||
|
fn resolve(&self, name: Name) -> Resolving {
|
||||||
|
let host = name.as_str().to_lowercase();
|
||||||
|
|
||||||
|
let is_localhost = host.ends_with(".localhost");
|
||||||
|
if is_localhost {
|
||||||
|
// Port 0 is fine; reqwest replaces it with the URL's explicit
|
||||||
|
// port or the scheme’s default (80/443, etc.).
|
||||||
|
// (See docs note below.)
|
||||||
|
let addrs: Vec<SocketAddr> = vec![
|
||||||
|
SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 0),
|
||||||
|
SocketAddr::new(IpAddr::V6(Ipv6Addr::LOCALHOST), 0),
|
||||||
|
];
|
||||||
|
|
||||||
|
return Box::pin(async move {
|
||||||
|
Ok::<Addrs, Box<dyn std::error::Error + Send + Sync>>(Box::new(addrs.into_iter()))
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut fallback = self.fallback.clone();
|
||||||
|
let name_str = name.as_str().to_string();
|
||||||
|
Box::pin(async move {
|
||||||
|
match HyperName::from_str(&name_str) {
|
||||||
|
Ok(n) => fallback
|
||||||
|
.call(n)
|
||||||
|
.await
|
||||||
|
.map(|addrs| Box::new(addrs) as Addrs)
|
||||||
|
.map_err(|err| Box::new(err) as Box<dyn std::error::Error + Send + Sync>),
|
||||||
|
Err(e) => Err(Box::new(e) as Box<dyn std::error::Error + Send + Sync>),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -33,6 +33,7 @@ use yaak_plugins::events::{
|
|||||||
use yaak_plugins::manager::PluginManager;
|
use yaak_plugins::manager::PluginManager;
|
||||||
use yaak_plugins::template_callback::PluginTemplateCallback;
|
use yaak_plugins::template_callback::PluginTemplateCallback;
|
||||||
use yaak_templates::{RenderErrorBehavior, RenderOptions};
|
use yaak_templates::{RenderErrorBehavior, RenderOptions};
|
||||||
|
use crate::dns::LocalhostResolver;
|
||||||
|
|
||||||
pub async fn send_http_request<R: Runtime>(
|
pub async fn send_http_request<R: Runtime>(
|
||||||
window: &WebviewWindow<R>,
|
window: &WebviewWindow<R>,
|
||||||
@@ -110,6 +111,7 @@ pub async fn send_http_request<R: Runtime>(
|
|||||||
.gzip(true)
|
.gzip(true)
|
||||||
.brotli(true)
|
.brotli(true)
|
||||||
.deflate(true)
|
.deflate(true)
|
||||||
|
.dns_resolver(LocalhostResolver::new())
|
||||||
.referer(false)
|
.referer(false)
|
||||||
.tls_info(true);
|
.tls_info(true);
|
||||||
|
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ mod updates;
|
|||||||
mod uri_scheme;
|
mod uri_scheme;
|
||||||
mod window;
|
mod window;
|
||||||
mod window_menu;
|
mod window_menu;
|
||||||
|
mod dns;
|
||||||
|
|
||||||
#[derive(serde::Serialize)]
|
#[derive(serde::Serialize)]
|
||||||
#[serde(default, rename_all = "camelCase")]
|
#[serde(default, rename_all = "camelCase")]
|
||||||
|
|||||||
Reference in New Issue
Block a user