diff --git a/src/app/browser/window/tab/item/page.rs b/src/app/browser/window/tab/item/page.rs index 81f722c2..cc735fc7 100644 --- a/src/app/browser/window/tab/item/page.rs +++ b/src/app/browser/window/tab/item/page.rs @@ -169,13 +169,20 @@ impl Page { // Try **take** request value from Redirect holder first let request = if let Some(redirect) = self.meta.take_redirect() { - // Increase redirect counter - self.meta.set_redirect_count(self.meta.redirect_count() + 1); - - // Prevent infinitive redirection by global settings - if self.meta.redirect_count() > DEFAULT_MAX_REDIRECT_COUNT { - todo!(); - } + // Update redirect counter + self.meta + .set_redirect_count(match self.meta.redirect_count() { + Some(value) => { + // Prevent infinitive redirection + if value > DEFAULT_MAX_REDIRECT_COUNT { + todo!() + } + // Increase + Some(value + 1) + } + // Set initial value + None => Some(1), + }); // Update navigation on redirect `is_foreground` if redirect.is_foreground() { @@ -198,8 +205,8 @@ impl Page { None => self.navigation.history_add(value), } - // Reset redirect counter as value taken from user input - self.meta.set_redirect_count(0); + // Reset redirect counter as request value taken from user input + self.meta.unset_redirect_count(); // Return value from navigation entry self.navigation.request_text() @@ -715,7 +722,7 @@ impl Page { ) ); // Client MUST limit the number of redirects they follow to 5 (by protocol specification) - } else if meta.redirect_count() >= 5 { + } else if meta.redirect_count() > Some(5) { // Update meta meta.set_status(Status::Failure) .set_title(&"Oops"); diff --git a/src/app/browser/window/tab/item/page/meta.rs b/src/app/browser/window/tab/item/page/meta.rs index d00e34ac..bba62b82 100644 --- a/src/app/browser/window/tab/item/page/meta.rs +++ b/src/app/browser/window/tab/item/page/meta.rs @@ -27,7 +27,7 @@ pub struct Meta { status: RefCell, title: RefCell, redirect: RefCell>, - redirect_count: RefCell, + redirect_count: RefCell>, } impl Meta { @@ -38,7 +38,7 @@ impl Meta { status: RefCell::new(status), title: RefCell::new(title), redirect: RefCell::new(None), - redirect_count: RefCell::new(0), + redirect_count: RefCell::new(None), }) } @@ -60,11 +60,18 @@ impl Meta { self } - pub fn set_redirect_count(&self, redirect_count: i8) -> &Self { + pub fn set_redirect_count(&self, redirect_count: Option) -> &Self { self.redirect_count.replace(redirect_count); self } + pub fn unset_redirect_count(&self) -> &Self { + if self.redirect_count.borrow().is_some() { + self.set_redirect_count(None); + } + self + } + /* @TODO not in use pub fn unset_redirect(&self) -> &Self { self.redirect.replace(None); @@ -81,7 +88,7 @@ impl Meta { self.title.borrow().clone() } - pub fn redirect_count(&self) -> i8 { + pub fn redirect_count(&self) -> Option { self.redirect_count.borrow().clone() }