From 15ba9b6295ca3a527f7a4120cb703408d643ec26 Mon Sep 17 00:00:00 2001 From: Alexander Krotov Date: Mon, 2 Dec 2019 02:50:40 +0100 Subject: [PATCH] Resultify outlk_autodiscover --- src/configure/auto_outlook.rs | 39 +++++++++++++++++++++-------------- src/configure/mod.rs | 4 ++-- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/configure/auto_outlook.rs b/src/configure/auto_outlook.rs index cdd162439..8a251ffb7 100644 --- a/src/configure/auto_outlook.rs +++ b/src/configure/auto_outlook.rs @@ -22,10 +22,22 @@ pub enum Error { #[fail(display = "Bad or incomplete autoconfig")] IncompleteAutoconfig(LoginParam), + + #[fail(display = "Failed to get URL {}", _0)] + ReadUrlError(#[cause] super::read_url::Error), + + #[fail(display = "Number of redirection is exceeded")] + RedirectionError, } pub type Result = std::result::Result; +impl From for Error { + fn from(err: super::read_url::Error) -> Error { + Error::ReadUrlError(err) + } +} + struct OutlookAutodiscover { pub out: LoginParam, pub out_imap_set: bool, @@ -42,7 +54,7 @@ enum ParsingResult { RedirectUrl(String), } -fn parse_xml(xml_raw: &str) -> Result { +fn parse_xml(xml_raw: &str) -> Result { let mut outlk_ad = OutlookAutodiscover { out: LoginParam::new(), out_imap_set: false, @@ -133,26 +145,21 @@ pub fn outlk_autodiscover( context: &Context, url: &str, _param_in: &LoginParam, -) -> Option { +) -> Result { let mut url = url.to_string(); /* Follow up to 10 xml-redirects (http-redirects are followed in read_url() */ for _i in 0..10 { - if let Ok(xml_raw) = read_url(context, &url) { - match parse_xml(&xml_raw) { - Err(err) => { - warn!(context, "{}", err); - return None; - } - Ok(res) => match res { - ParsingResult::RedirectUrl(redirect_url) => url = redirect_url, - ParsingResult::LoginParam(login_param) => return Some(login_param), - }, - } - } else { - return None; + let xml_raw = read_url(context, &url)?; + let res = parse_xml(&xml_raw); + if let Err(err) = &res { + warn!(context, "{}", err); + } + match res? { + ParsingResult::RedirectUrl(redirect_url) => url = redirect_url, + ParsingResult::LoginParam(login_param) => return Ok(login_param), } } - None + Err(Error::RedirectionError) } fn outlk_autodiscover_endtag_cb(event: &BytesEnd, outlk_ad: &mut OutlookAutodiscover) { diff --git a/src/configure/mod.rs b/src/configure/mod.rs index 55a5ddf05..c6009f535 100644 --- a/src/configure/mod.rs +++ b/src/configure/mod.rs @@ -193,7 +193,7 @@ pub fn JobConfigureImap(context: &Context) { "https://{}{}/autodiscover/autodiscover.xml", "", param_domain ); - param_autoconfig = outlk_autodiscover(context, &url, ¶m); + param_autoconfig = outlk_autodiscover(context, &url, ¶m).ok(); } true } @@ -204,7 +204,7 @@ pub fn JobConfigureImap(context: &Context) { "https://{}{}/autodiscover/autodiscover.xml", "autodiscover.", param_domain ); - param_autoconfig = outlk_autodiscover(context, &url, ¶m); + param_autoconfig = outlk_autodiscover(context, &url, ¶m).ok(); } true }