summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2023-10-23 18:49:12 +0200
committerDavid Lönnhager <david.l@mullvad.net>2023-10-23 18:49:12 +0200
commitf54f4b9fc6fb4b395cade93c096344717e56bb87 (patch)
treedc2a9f1520373f7eb625bb1e52a43dc2fb6cc420
parent1104b747c3d899a0829042e7889fe6c0acc17d71 (diff)
parent02100cfb7575e3bf5509716fd2b653977a20d61d (diff)
downloadmullvadvpn-f54f4b9fc6fb4b395cade93c096344717e56bb87.tar.xz
mullvadvpn-f54f4b9fc6fb4b395cade93c096344717e56bb87.zip
Merge branch 'geoip-check'
-rw-r--r--Cargo.lock1
-rw-r--r--mullvad-api/Cargo.toml1
-rw-r--r--mullvad-api/src/rest.rs17
-rw-r--r--mullvad-daemon/src/geoip.rs24
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));
+ }
}