actualize info member by commit, make update_page_info scope-dependent, set_request globally where it is possible

This commit is contained in:
yggverse 2025-03-22 20:37:30 +02:00
parent 3d7818fbd6
commit 12df902983
2 changed files with 54 additions and 43 deletions

View file

@ -177,16 +177,28 @@ fn handle(
let redirects = redirects.clone();
move |result| match result {
Ok((response, connection)) => {
/// Common page info pattern for some cases in the current scope
/// * includes commit action!
fn update_page_info(page: &Page, event_name: &str) {
let mut i = page.navigation.request.info.borrow_mut();
i.add_event(event_name.to_string())
.set_mime(None)
.set_size(None)
.commit()
}
// Update socket info at the point, where the connection is active yet
// * also, actualize `request` as same everywhere below
{
use gtk::prelude::SocketConnectionExt;
let mut i = page.navigation.request.info.borrow_mut();
i.set_socket(
connection.socket_connection.local_address().unwrap(),
connection.socket_connection.remote_address().unwrap()
);
// * unwrap fails only on `connection.socket_connection.is_closed()`
// drop the panic as unexpected.
i
.set_request(Some(uri.to_string()))
.set_socket(
connection.socket_connection.local_address().unwrap(),
connection.socket_connection.remote_address().unwrap()
);
// * unwrap fails only on `connection.socket_connection.is_closed()`
// drop the panic as unexpected.
}
// Handle response
match response {
@ -199,7 +211,7 @@ fn handle(
page.snap_history();
}
redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED);
update_page_info(&page, EVENT_COMPLETED);
match input {
// https://geminiprotocol.net/docs/protocol-specification.gmi#status-10
Input::Default { message } => page.input.set_new_response(
@ -310,7 +322,6 @@ fn handle(
i
.add_event("Parsing".to_string())
.set_mime(Some(success.mime().to_string()))
.set_request(Some(uri.to_string()))
.set_size(Some(data.len()));
let w = if matches!(*feature, Feature::Source) {
page.content.to_text_source(data)
@ -336,7 +347,9 @@ fn handle(
page.snap_history();
}
redirects.replace(0); // reset
i.add_event(EVENT_COMPLETED.to_string());
i
.add_event(EVENT_COMPLETED.to_string())
.commit();
},
Err(e) => {
let s = page.content.to_status_failure();
@ -347,7 +360,7 @@ fn handle(
page.snap_history();
}
redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED);
update_page_info(&page, EVENT_COMPLETED);
},
},
Err((_, e)) => {
@ -359,7 +372,7 @@ fn handle(
page.snap_history();
}
redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED);
update_page_info(&page, EVENT_COMPLETED);
}
}
),
@ -372,7 +385,7 @@ fn handle(
page.snap_history();
}
redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED);
update_page_info(&page, EVENT_COMPLETED);
},
}
)
@ -413,8 +426,8 @@ fn handle(
i
.add_event(EVENT_COMPLETED.to_string())
.set_mime(Some(success.mime().to_string()))
.set_request(Some(uri.to_string()))
.set_size(Some(buffer.byte_length()));
.set_size(Some(buffer.byte_length()))
.commit();
}
}
Err(e) => {
@ -426,8 +439,8 @@ fn handle(
i
.add_event(EVENT_COMPLETED.to_string())
.set_mime(Some(success.mime().to_string()))
.set_request(Some(uri.to_string()))
.set_size(None);
.set_size(None)
.commit();
}
}
}
@ -453,8 +466,8 @@ fn handle(
i
.add_event(EVENT_COMPLETED.to_string())
.set_mime(Some(success.mime().to_string()))
.set_request(Some(uri.to_string()))
.set_size(None);
.set_size(None)
.commit();
}
}
}
@ -478,8 +491,8 @@ fn handle(
i
.add_event(EVENT_COMPLETED.to_string())
.set_mime(Some(mime.to_string()))
.set_request(Some(uri.to_string()))
.set_size(None);
.set_size(None)
.commit();
}
},
}
@ -498,7 +511,7 @@ fn handle(
page.set_progress(0.0);
page.set_title(&s.title());
redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED);
update_page_info(&page, EVENT_COMPLETED);
// Disallow external redirection by default as potentially unsafe
// even not specified, require follow confirmation @TODO optional
} else if uri.host() != target.host() {
@ -523,7 +536,7 @@ fn handle(
page.set_progress(0.0);
page.set_title(t);
redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED);
update_page_info(&page, EVENT_COMPLETED);
} else {
let t = target.to_string();
if matches!(redirect, Redirect::Permanent { .. }) {
@ -535,8 +548,8 @@ fn handle(
i
.add_event(EVENT_COMPLETED.to_string())
.set_mime(None)
.set_request(Some(uri.to_string()))
.set_size(None);
.set_size(None)
.commit();
page.navigation.request.info.replace(i.into_redirect());
}
@ -549,7 +562,7 @@ fn handle(
page.set_progress(0.0);
page.set_title(&s.title());
redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED);
update_page_info(&page, EVENT_COMPLETED);
}
}
Response::Certificate(ref certificate) => match certificate {
@ -567,7 +580,7 @@ fn handle(
page.snap_history();
}
redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED);
update_page_info(&page, EVENT_COMPLETED);
}
}
Response::Failure(failure) => match failure {
@ -585,7 +598,7 @@ fn handle(
page.snap_history();
}
redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED);
update_page_info(&page, EVENT_COMPLETED);
if let Some(callback) = on_failure {
callback()
}
@ -605,7 +618,7 @@ fn handle(
page.snap_history();
}
redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED);
update_page_info(&page, EVENT_COMPLETED);
if let Some(callback) = on_failure {
callback()
}
@ -623,18 +636,16 @@ fn handle(
page.snap_history();
}
redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED)
{
let mut i = page.navigation.request.info.borrow_mut();
i.add_event(EVENT_COMPLETED.to_string())
.set_request(Some(uri.to_string()))
.set_mime(None)
.set_size(None)
.commit()
}
}
}
},
)
}
/// Apply common page info pattern
fn update_page_info(page: &Page, uri: &Uri, event_name: &str) {
let mut i = page.navigation.request.info.borrow_mut();
i.add_event(event_name.to_string())
.set_mime(None)
.set_request(Some(uri.to_string()))
.set_size(None);
}

View file

@ -53,6 +53,11 @@ impl Info {
PreferencesDialog::info(self).present(parent)
}
/// Actualize `Self`
pub fn commit(&mut self) {
self.is_deprecated = false;
}
/// Mark `Self` as deprecated
/// * tip: usually called on page handler begin
pub fn deprecate(&mut self) {
@ -73,13 +78,11 @@ impl Info {
pub fn add_event(&mut self, name: String) -> &mut Self {
self.event.push(Event::now(name));
self.is_deprecated = false;
self
}
pub fn set_mime(&mut self, mime: Option<String>) -> &mut Self {
self.mime = mime;
self.is_deprecated = false;
self
}
@ -92,19 +95,16 @@ impl Info {
local_address,
remote_address,
});
self.is_deprecated = false;
self
}
pub fn set_request(&mut self, request: Option<String>) -> &mut Self {
self.request = request;
self.is_deprecated = false;
self
}
pub fn set_size(&mut self, size: Option<usize>) -> &mut Self {
self.size = size;
self.is_deprecated = false;
self
}