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(); let redirects = redirects.clone();
move |result| match result { move |result| match result {
Ok((response, connection)) => { 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 // Update socket info at the point, where the connection is active yet
// * also, actualize `request` as same everywhere below
{ {
use gtk::prelude::SocketConnectionExt; use gtk::prelude::SocketConnectionExt;
let mut i = page.navigation.request.info.borrow_mut(); let mut i = page.navigation.request.info.borrow_mut();
i.set_socket( i
connection.socket_connection.local_address().unwrap(), .set_request(Some(uri.to_string()))
connection.socket_connection.remote_address().unwrap() .set_socket(
); connection.socket_connection.local_address().unwrap(),
// * unwrap fails only on `connection.socket_connection.is_closed()` connection.socket_connection.remote_address().unwrap()
// drop the panic as unexpected. );
// * unwrap fails only on `connection.socket_connection.is_closed()`
// drop the panic as unexpected.
} }
// Handle response // Handle response
match response { match response {
@ -199,7 +211,7 @@ fn handle(
page.snap_history(); page.snap_history();
} }
redirects.replace(0); // reset redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED); update_page_info(&page, EVENT_COMPLETED);
match input { match input {
// https://geminiprotocol.net/docs/protocol-specification.gmi#status-10 // https://geminiprotocol.net/docs/protocol-specification.gmi#status-10
Input::Default { message } => page.input.set_new_response( Input::Default { message } => page.input.set_new_response(
@ -310,7 +322,6 @@ fn handle(
i i
.add_event("Parsing".to_string()) .add_event("Parsing".to_string())
.set_mime(Some(success.mime().to_string())) .set_mime(Some(success.mime().to_string()))
.set_request(Some(uri.to_string()))
.set_size(Some(data.len())); .set_size(Some(data.len()));
let w = if matches!(*feature, Feature::Source) { let w = if matches!(*feature, Feature::Source) {
page.content.to_text_source(data) page.content.to_text_source(data)
@ -336,7 +347,9 @@ fn handle(
page.snap_history(); page.snap_history();
} }
redirects.replace(0); // reset redirects.replace(0); // reset
i.add_event(EVENT_COMPLETED.to_string()); i
.add_event(EVENT_COMPLETED.to_string())
.commit();
}, },
Err(e) => { Err(e) => {
let s = page.content.to_status_failure(); let s = page.content.to_status_failure();
@ -347,7 +360,7 @@ fn handle(
page.snap_history(); page.snap_history();
} }
redirects.replace(0); // reset redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED); update_page_info(&page, EVENT_COMPLETED);
}, },
}, },
Err((_, e)) => { Err((_, e)) => {
@ -359,7 +372,7 @@ fn handle(
page.snap_history(); page.snap_history();
} }
redirects.replace(0); // reset 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(); page.snap_history();
} }
redirects.replace(0); // reset redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED); update_page_info(&page, EVENT_COMPLETED);
}, },
} }
) )
@ -413,8 +426,8 @@ fn handle(
i i
.add_event(EVENT_COMPLETED.to_string()) .add_event(EVENT_COMPLETED.to_string())
.set_mime(Some(success.mime().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) => { Err(e) => {
@ -426,8 +439,8 @@ fn handle(
i i
.add_event(EVENT_COMPLETED.to_string()) .add_event(EVENT_COMPLETED.to_string())
.set_mime(Some(success.mime().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 i
.add_event(EVENT_COMPLETED.to_string()) .add_event(EVENT_COMPLETED.to_string())
.set_mime(Some(success.mime().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 i
.add_event(EVENT_COMPLETED.to_string()) .add_event(EVENT_COMPLETED.to_string())
.set_mime(Some(mime.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_progress(0.0);
page.set_title(&s.title()); page.set_title(&s.title());
redirects.replace(0); // reset 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 // Disallow external redirection by default as potentially unsafe
// even not specified, require follow confirmation @TODO optional // even not specified, require follow confirmation @TODO optional
} else if uri.host() != target.host() { } else if uri.host() != target.host() {
@ -523,7 +536,7 @@ fn handle(
page.set_progress(0.0); page.set_progress(0.0);
page.set_title(t); page.set_title(t);
redirects.replace(0); // reset redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED); update_page_info(&page, EVENT_COMPLETED);
} else { } else {
let t = target.to_string(); let t = target.to_string();
if matches!(redirect, Redirect::Permanent { .. }) { if matches!(redirect, Redirect::Permanent { .. }) {
@ -535,8 +548,8 @@ fn handle(
i i
.add_event(EVENT_COMPLETED.to_string()) .add_event(EVENT_COMPLETED.to_string())
.set_mime(None) .set_mime(None)
.set_request(Some(uri.to_string())) .set_size(None)
.set_size(None); .commit();
page.navigation.request.info.replace(i.into_redirect()); page.navigation.request.info.replace(i.into_redirect());
} }
@ -549,7 +562,7 @@ fn handle(
page.set_progress(0.0); page.set_progress(0.0);
page.set_title(&s.title()); page.set_title(&s.title());
redirects.replace(0); // reset redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED); update_page_info(&page, EVENT_COMPLETED);
} }
} }
Response::Certificate(ref certificate) => match certificate { Response::Certificate(ref certificate) => match certificate {
@ -567,7 +580,7 @@ fn handle(
page.snap_history(); page.snap_history();
} }
redirects.replace(0); // reset redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED); update_page_info(&page, EVENT_COMPLETED);
} }
} }
Response::Failure(failure) => match failure { Response::Failure(failure) => match failure {
@ -585,7 +598,7 @@ fn handle(
page.snap_history(); page.snap_history();
} }
redirects.replace(0); // reset redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED); update_page_info(&page, EVENT_COMPLETED);
if let Some(callback) = on_failure { if let Some(callback) = on_failure {
callback() callback()
} }
@ -605,7 +618,7 @@ fn handle(
page.snap_history(); page.snap_history();
} }
redirects.replace(0); // reset redirects.replace(0); // reset
update_page_info(&page, &uri, EVENT_COMPLETED); update_page_info(&page, EVENT_COMPLETED);
if let Some(callback) = on_failure { if let Some(callback) = on_failure {
callback() callback()
} }
@ -623,18 +636,16 @@ fn handle(
page.snap_history(); page.snap_history();
} }
redirects.replace(0); // reset 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) PreferencesDialog::info(self).present(parent)
} }
/// Actualize `Self`
pub fn commit(&mut self) {
self.is_deprecated = false;
}
/// Mark `Self` as deprecated /// Mark `Self` as deprecated
/// * tip: usually called on page handler begin /// * tip: usually called on page handler begin
pub fn deprecate(&mut self) { pub fn deprecate(&mut self) {
@ -73,13 +78,11 @@ impl Info {
pub fn add_event(&mut self, name: String) -> &mut Self { pub fn add_event(&mut self, name: String) -> &mut Self {
self.event.push(Event::now(name)); self.event.push(Event::now(name));
self.is_deprecated = false;
self self
} }
pub fn set_mime(&mut self, mime: Option<String>) -> &mut Self { pub fn set_mime(&mut self, mime: Option<String>) -> &mut Self {
self.mime = mime; self.mime = mime;
self.is_deprecated = false;
self self
} }
@ -92,19 +95,16 @@ impl Info {
local_address, local_address,
remote_address, remote_address,
}); });
self.is_deprecated = false;
self self
} }
pub fn set_request(&mut self, request: Option<String>) -> &mut Self { pub fn set_request(&mut self, request: Option<String>) -> &mut Self {
self.request = request; self.request = request;
self.is_deprecated = false;
self self
} }
pub fn set_size(&mut self, size: Option<usize>) -> &mut Self { pub fn set_size(&mut self, size: Option<usize>) -> &mut Self {
self.size = size; self.size = size;
self.is_deprecated = false;
self self
} }