summaryrefslogtreecommitdiffstats
path: root/melib/src/backends
diff options
context:
space:
mode:
authorManos Pitsidianakis <el13635@mail.ntua.gr>2020-09-16 13:27:11 +0300
committerManos Pitsidianakis <el13635@mail.ntua.gr>2020-09-16 15:17:48 +0300
commite518b3f16d8d6d9b7334583b8e6fe8d6437daccd (patch)
tree3646f29661623e1819f74ef399823859e239c659 /melib/src/backends
parentd862e7bf53eb782a1a5637bbec418a73e513efe4 (diff)
melib/imap: use SystemTime for IMAP server timeout
Diffstat (limited to 'melib/src/backends')
-rw-r--r--melib/src/backends/imap.rs6
-rw-r--r--melib/src/backends/imap/connection.rs18
-rw-r--r--melib/src/backends/imap/managesieve.rs4
3 files changed, 15 insertions, 13 deletions
diff --git a/melib/src/backends/imap.rs b/melib/src/backends/imap.rs
index 60e3c381..39cc2e74 100644
--- a/melib/src/backends/imap.rs
+++ b/melib/src/backends/imap.rs
@@ -56,7 +56,7 @@ use std::hash::Hasher;
use std::pin::Pin;
use std::str::FromStr;
use std::sync::{Arc, Mutex, RwLock};
-use std::time::{Duration, Instant};
+use std::time::{Duration, SystemTime};
pub type ImapNum = usize;
pub type UID = ImapNum;
@@ -167,7 +167,7 @@ pub struct UIDStore {
reverse_modseq: Arc<Mutex<HashMap<MailboxHash, BTreeMap<ModSequence, EnvelopeHash>>>>,
highestmodseqs: Arc<Mutex<HashMap<MailboxHash, std::result::Result<ModSequence, ()>>>>,
mailboxes: Arc<FutureMutex<HashMap<MailboxHash, ImapMailbox>>>,
- is_online: Arc<Mutex<(Instant, Result<()>)>>,
+ is_online: Arc<Mutex<(SystemTime, Result<()>)>>,
event_consumer: BackendEventConsumer,
timeout: Option<Duration>,
}
@@ -197,7 +197,7 @@ impl UIDStore {
mailboxes: Arc::new(FutureMutex::new(Default::default())),
tag_index: Arc::new(RwLock::new(Default::default())),
is_online: Arc::new(Mutex::new((
- Instant::now(),
+ SystemTime::now(),
Err(MeliError::new("Account is uninitialised.")),
))),
event_consumer,
diff --git a/melib/src/backends/imap/connection.rs b/melib/src/backends/imap/connection.rs
index d13a5b7d..49f9a59d 100644
--- a/melib/src/backends/imap/connection.rs
+++ b/melib/src/backends/imap/connection.rs
@@ -34,7 +34,9 @@ use std::future::Future;
use std::iter::FromIterator;
use std::pin::Pin;
use std::sync::Arc;
-use std::time::{Duration, Instant};
+use std::time::{Duration, Instant, SystemTime};
+
+const IMAP_PROTOCOL_TIMEOUT: Duration = Duration::from_secs(60 * 28);
use super::protocol_parser;
use super::{Capabilities, ImapServerConf, UIDStore};
@@ -540,8 +542,8 @@ impl ImapConnection {
pub fn connect<'a>(&'a mut self) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'a>> {
Box::pin(async move {
- if let (instant, ref mut status @ Ok(())) = *self.uid_store.is_online.lock().unwrap() {
- if Instant::now().duration_since(instant) >= Duration::new(60 * 30, 0) {
+ if let (time, ref mut status @ Ok(())) = *self.uid_store.is_online.lock().unwrap() {
+ if SystemTime::now().duration_since(time).unwrap_or_default() >= IMAP_PROTOCOL_TIMEOUT {
let err = MeliError::new("Connection timed out").set_kind(ErrorKind::Timeout);
*status = Err(err.clone());
self.stream = Err(err);
@@ -569,7 +571,7 @@ impl ImapConnection {
if let Err(err) = new_stream.as_ref() {
self.uid_store.is_online.lock().unwrap().1 = Err(err.clone());
} else {
- *self.uid_store.is_online.lock().unwrap() = (Instant::now(), Ok(()));
+ *self.uid_store.is_online.lock().unwrap() = (SystemTime::now(), Ok(()));
}
let (capabilities, stream) = new_stream?;
self.stream = Ok(stream);
@@ -654,7 +656,7 @@ impl ImapConnection {
let mut response = Vec::new();
ret.clear();
self.stream.as_mut()?.read_response(&mut response).await?;
- *self.uid_store.is_online.lock().unwrap() = (Instant::now(), Ok(()));
+ *self.uid_store.is_online.lock().unwrap() = (SystemTime::now(), Ok(()));
match self.server_conf.protocol {
ImapProtocol::IMAP { .. } => {
@@ -756,7 +758,7 @@ impl ImapConnection {
}
Err(err)
} else {
- *self.uid_store.is_online.lock().unwrap() = (Instant::now(), Ok(()));
+ *self.uid_store.is_online.lock().unwrap() = (SystemTime::now(), Ok(()));
Ok(())
}
}
@@ -1052,7 +1054,7 @@ impl ImapBlockingConnection {
async fn read(
conn: &mut ImapBlockingConnection,
break_flag: &mut bool,
- prev_failure: &mut Option<Instant>,
+ prev_failure: &mut Option<SystemTime>,
) -> Option<Vec<u8>> {
let ImapBlockingConnection {
ref mut prev_res_length,
@@ -1080,7 +1082,7 @@ async fn read(
debug!(&_err);
*err = Some(Into::<MeliError>::into(_err).set_kind(crate::error::ErrorKind::Network));
*break_flag = true;
- *prev_failure = Some(Instant::now());
+ *prev_failure = Some(SystemTime::now());
}
}
None
diff --git a/melib/src/backends/imap/managesieve.rs b/melib/src/backends/imap/managesieve.rs
index 97f67655..4eb36955 100644
--- a/melib/src/backends/imap/managesieve.rs
+++ b/melib/src/backends/imap/managesieve.rs
@@ -29,7 +29,7 @@ use nom::{
};
use std::str::FromStr;
use std::sync::{Arc, Mutex};
-use std::time::Instant;
+use std::time::SystemTime;
pub fn managesieve_capabilities(input: &[u8]) -> Result<Vec<(&[u8], &[u8])>> {
let (_, ret) = separated_nonempty_list(
@@ -115,7 +115,7 @@ pub fn new_managesieve_connection(
};
let uid_store = Arc::new(UIDStore {
is_online: Arc::new(Mutex::new((
- Instant::now(),
+ SystemTime::now(),
Err(MeliError::new("Account is uninitialised.")),
))),
..UIDStore::new(