summaryrefslogtreecommitdiffhomepage
path: root/mullvad-api/src/lib.rs
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2024-11-27 15:09:05 +0100
committerDavid Lönnhager <david.l@mullvad.net>2024-12-02 16:00:38 +0100
commit94ce8fb753f7441243d9281416632ce7ed4b6cd6 (patch)
tree8fa86e98b4b50ecd70ebf6468d222cad8e6cf552 /mullvad-api/src/lib.rs
parente07c12a5f14a11051fa086c97cc22413e431a1c8 (diff)
downloadmullvadvpn-94ce8fb753f7441243d9281416632ce7ed4b6cd6.tar.xz
mullvadvpn-94ce8fb753f7441243d9281416632ce7ed4b6cd6.zip
Remove DNS fallback except for conncheck
Diffstat (limited to 'mullvad-api/src/lib.rs')
-rw-r--r--mullvad-api/src/lib.rs66
1 files changed, 29 insertions, 37 deletions
diff --git a/mullvad-api/src/lib.rs b/mullvad-api/src/lib.rs
index 3f67709242..5d46534c44 100644
--- a/mullvad-api/src/lib.rs
+++ b/mullvad-api/src/lib.rs
@@ -308,7 +308,7 @@ impl ApiEndpoint {
#[async_trait]
pub trait DnsResolver: 'static + Send + Sync {
- async fn resolve(&self, host: String) -> io::Result<Vec<IpAddr>>;
+ async fn resolve(&self, host: String) -> io::Result<Vec<SocketAddr>>;
}
/// DNS resolver that relies on `ToSocketAddrs` (`getaddrinfo`).
@@ -316,14 +316,14 @@ pub struct DefaultDnsResolver;
#[async_trait]
impl DnsResolver for DefaultDnsResolver {
- async fn resolve(&self, host: String) -> io::Result<Vec<IpAddr>> {
+ async fn resolve(&self, host: String) -> io::Result<Vec<SocketAddr>> {
use std::net::ToSocketAddrs;
// Spawn a blocking thread, since `to_socket_addrs` relies on `libc::getaddrinfo`, which
// blocks and either has no timeout or a very long one.
let addrs = tokio::task::spawn_blocking(move || (host, 0).to_socket_addrs())
.await
.expect("DNS task panicked")?;
- Ok(addrs.map(|addr| addr.ip()).collect())
+ Ok(addrs.collect())
}
}
@@ -332,7 +332,7 @@ pub struct NullDnsResolver;
#[async_trait]
impl DnsResolver for NullDnsResolver {
- async fn resolve(&self, _host: String) -> io::Result<Vec<IpAddr>> {
+ async fn resolve(&self, _host: String) -> io::Result<Vec<SocketAddr>> {
Ok(vec![])
}
}
@@ -342,7 +342,6 @@ pub struct Runtime {
handle: tokio::runtime::Handle,
address_cache: AddressCache,
api_availability: availability::ApiAvailability,
- dns_resolver: Arc<dyn DnsResolver>,
#[cfg(target_os = "android")]
socket_bypass_tx: Option<mpsc::Sender<SocketBypassRequest>>,
}
@@ -364,13 +363,9 @@ pub enum Error {
impl Runtime {
/// Create a new `Runtime`.
- pub fn new(
- handle: tokio::runtime::Handle,
- dns_resolver: impl DnsResolver,
- ) -> Result<Self, Error> {
+ pub fn new(handle: tokio::runtime::Handle) -> Result<Self, Error> {
Self::new_inner(
handle,
- dns_resolver,
#[cfg(target_os = "android")]
None,
)
@@ -381,21 +376,18 @@ impl Runtime {
Runtime {
handle,
address_cache: AddressCache::with_static_addr(address),
- dns_resolver: Arc::new(NullDnsResolver),
api_availability: ApiAvailability::default(),
}
}
fn new_inner(
handle: tokio::runtime::Handle,
- dns_resolver: impl DnsResolver,
#[cfg(target_os = "android")] socket_bypass_tx: Option<mpsc::Sender<SocketBypassRequest>>,
) -> Result<Self, Error> {
Ok(Runtime {
handle,
- address_cache: AddressCache::new(None)?,
+ address_cache: AddressCache::new(None),
api_availability: ApiAvailability::default(),
- dns_resolver: Arc::new(dns_resolver),
#[cfg(target_os = "android")]
socket_bypass_tx,
})
@@ -404,7 +396,6 @@ impl Runtime {
/// Create a new `Runtime` using the specified directories.
/// Try to use the cache directory first, and fall back on the bundled address otherwise.
pub async fn with_cache(
- dns_resolver: impl DnsResolver,
cache_dir: &Path,
write_changes: bool,
#[cfg(target_os = "android")] socket_bypass_tx: Option<mpsc::Sender<SocketBypassRequest>>,
@@ -415,7 +406,6 @@ impl Runtime {
if API.disable_address_cache {
return Self::new_inner(
handle,
- dns_resolver,
#[cfg(target_os = "android")]
socket_bypass_tx,
);
@@ -439,7 +429,7 @@ impl Runtime {
)
);
}
- AddressCache::new(write_file)?
+ AddressCache::new(write_file)
}
};
@@ -449,30 +439,11 @@ impl Runtime {
handle,
address_cache,
api_availability,
- dns_resolver: Arc::new(dns_resolver),
#[cfg(target_os = "android")]
socket_bypass_tx,
})
}
- /// Creates a new request service and returns a handle to it.
- fn new_request_service<T: ConnectionModeProvider + 'static>(
- &self,
- sni_hostname: Option<String>,
- connection_mode_provider: T,
- #[cfg(target_os = "android")] socket_bypass_tx: Option<mpsc::Sender<SocketBypassRequest>>,
- ) -> rest::RequestServiceHandle {
- rest::RequestService::spawn(
- sni_hostname,
- self.api_availability.clone(),
- self.address_cache.clone(),
- connection_mode_provider,
- self.dns_resolver.clone(),
- #[cfg(target_os = "android")]
- socket_bypass_tx,
- )
- }
-
/// Returns a request factory initialized to create requests for the master API
pub fn mullvad_rest_handle<T: ConnectionModeProvider + 'static>(
&self,
@@ -481,6 +452,7 @@ impl Runtime {
let service = self.new_request_service(
Some(API.host().to_string()),
connection_mode_provider,
+ Arc::new(self.address_cache.clone()),
#[cfg(target_os = "android")]
self.socket_bypass_tx.clone(),
);
@@ -495,6 +467,7 @@ impl Runtime {
let service = self.new_request_service(
Some(hostname.clone()),
ApiConnectionMode::Direct.into_provider(),
+ Arc::new(self.address_cache.clone()),
#[cfg(target_os = "android")]
self.socket_bypass_tx.clone(),
);
@@ -505,15 +478,34 @@ impl Runtime {
}
/// Returns a new request service handle
- pub fn rest_handle(&self) -> rest::RequestServiceHandle {
+ pub fn rest_handle(&self, dns_resolver: impl DnsResolver) -> rest::RequestServiceHandle {
self.new_request_service(
None,
ApiConnectionMode::Direct.into_provider(),
+ Arc::new(dns_resolver),
#[cfg(target_os = "android")]
None,
)
}
+ /// Creates a new request service and returns a handle to it.
+ fn new_request_service<T: ConnectionModeProvider + 'static>(
+ &self,
+ sni_hostname: Option<String>,
+ connection_mode_provider: T,
+ dns_resolver: Arc<dyn DnsResolver>,
+ #[cfg(target_os = "android")] socket_bypass_tx: Option<mpsc::Sender<SocketBypassRequest>>,
+ ) -> rest::RequestServiceHandle {
+ rest::RequestService::spawn(
+ sni_hostname,
+ self.api_availability.clone(),
+ connection_mode_provider,
+ dns_resolver,
+ #[cfg(target_os = "android")]
+ socket_bypass_tx,
+ )
+ }
+
pub fn handle(&mut self) -> &mut tokio::runtime::Handle {
&mut self.handle
}