diff options
| author | David Lönnhager <david.l@mullvad.net> | 2023-10-21 01:01:11 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2023-10-23 18:48:02 +0200 |
| commit | 02100cfb7575e3bf5509716fd2b653977a20d61d (patch) | |
| tree | dc2a9f1520373f7eb625bb1e52a43dc2fb6cc420 /mullvad-api/src | |
| parent | 1104b747c3d899a0829042e7889fe6c0acc17d71 (diff) | |
| download | mullvadvpn-02100cfb7575e3bf5509716fd2b653977a20d61d.tar.xz mullvadvpn-02100cfb7575e3bf5509716fd2b653977a20d61d.zip | |
Improve error handling for API requests that failed to due being offline
Diffstat (limited to 'mullvad-api/src')
| -rw-r--r-- | mullvad-api/src/rest.rs | 17 |
1 files changed, 16 insertions, 1 deletions
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(); |
