diff options
| author | David Lönnhager <david.l@mullvad.net> | 2023-10-23 18:49:12 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2023-10-23 18:49:12 +0200 |
| commit | f54f4b9fc6fb4b395cade93c096344717e56bb87 (patch) | |
| tree | dc2a9f1520373f7eb625bb1e52a43dc2fb6cc420 | |
| parent | 1104b747c3d899a0829042e7889fe6c0acc17d71 (diff) | |
| parent | 02100cfb7575e3bf5509716fd2b653977a20d61d (diff) | |
| download | mullvadvpn-f54f4b9fc6fb4b395cade93c096344717e56bb87.tar.xz mullvadvpn-f54f4b9fc6fb4b395cade93c096344717e56bb87.zip | |
Merge branch 'geoip-check'
| -rw-r--r-- | Cargo.lock | 1 | ||||
| -rw-r--r-- | mullvad-api/Cargo.toml | 1 | ||||
| -rw-r--r-- | mullvad-api/src/rest.rs | 17 | ||||
| -rw-r--r-- | mullvad-daemon/src/geoip.rs | 24 |
4 files changed, 22 insertions, 21 deletions
diff --git a/Cargo.lock b/Cargo.lock index 50f68e0cd9..42a0b4a559 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1793,6 +1793,7 @@ dependencies = [ "http", "hyper", "ipnetwork", + "libc", "log", "mullvad-fs", "mullvad-types", diff --git a/mullvad-api/Cargo.toml b/mullvad-api/Cargo.toml index 08db7de306..90ad8ac22d 100644 --- a/mullvad-api/Cargo.toml +++ b/mullvad-api/Cargo.toml @@ -13,6 +13,7 @@ publish.workspace = true api-override = [] [dependencies] +libc = "0.2" chrono = { workspace = true } err-derive = { workspace = true } futures = "0.3" diff --git a/mullvad-api/src/rest.rs b/mullvad-api/src/rest.rs index 3690f1450c..9211450cbb 100644 --- a/mullvad-api/src/rest.rs +++ b/mullvad-api/src/rest.rs @@ -19,6 +19,7 @@ use hyper::{ }; use mullvad_types::account::AccountToken; use std::{ + error::Error as StdError, future::Future, str::FromStr, sync::{Arc, Weak}, @@ -88,6 +89,21 @@ impl Error { matches!(self, Error::HyperError(_) | Error::TimeoutError) } + /// Return true if there was no route to the destination + pub fn is_offline(&self) -> bool { + match self { + Error::HyperError(error) if error.is_connect() => { + if let Some(cause) = error.source() { + if let Some(err) = cause.downcast_ref::<std::io::Error>() { + return err.raw_os_error() == Some(libc::ENETUNREACH); + } + } + false + } + _ => false, + } + } + pub fn is_aborted(&self) -> bool { matches!(self, Error::Aborted) } @@ -95,7 +111,6 @@ impl Error { /// Returns a new instance for which `abortable_stream::Aborted` is mapped to `Self::Aborted`. fn map_aborted(self) -> Self { if let Error::HyperError(error) = &self { - use std::error::Error; let mut source = error.source(); while let Some(error) = source { let io_error: Option<&std::io::Error> = error.downcast_ref(); diff --git a/mullvad-daemon/src/geoip.rs b/mullvad-daemon/src/geoip.rs index 2619939215..0939787e91 100644 --- a/mullvad-daemon/src/geoip.rs +++ b/mullvad-daemon/src/geoip.rs @@ -89,24 +89,8 @@ async fn send_location_request_internal( } fn log_network_error(err: Error, version: &'static str) { - use std::sync::Arc; - let err_message = &format!("Unable to fetch {version} GeoIP location"); - match err { - Error::HyperError(hyper_err) if hyper_err.is_connect() => { - if let Some(cause) = Arc::into_inner(hyper_err).and_then(|x| x.into_cause()) { - if let Some(err) = cause.downcast_ref::<std::io::Error>() { - // Don't log ENETUNREACH errors, they are not informative. - if err.raw_os_error() == Some(libc::ENETUNREACH) { - return; - } - log::debug!("{}: Hyper connect error: {}", err_message, cause); - } - } else { - log::error!("Hyper Connection error did not contain a cause!"); - } - } - any_other_error => { - log::debug!("{}", any_other_error.display_chain_with_msg(err_message)); - } - }; + if !err.is_offline() { + let err_message = &format!("Unable to fetch {version} GeoIP location"); + log::debug!("{}", err.display_chain_with_msg(err_message)); + } } |
