-- Leo's gemini proxy
-- Connecting to typed-hole.org:1965...
-- Connected
-- Sending request
-- Meta line: 20 text/gemini
commit a5f82a1bca8586d264f2570d312a03536a45c430
Author: Julien Blanchard <julien@sideburns.eu>
Date: Mon Aug 12 17:04:53 2019 +0200
Handle errors ans statuses
Gone, Certificate issues, Timeout, Redirections
diff --git a/src/main.rs b/src/main.rs
index 5c0ca56..fbf4dc5 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -24,8 +24,7 @@ use link::Link;
mod content;
mod history;
-const HELP: &str = "
-Welcome to Asuka Gemini browser!
+const HELP: &str = "Welcome to Asuka Gemini browser!
Press g to visit an URL
Press h to show/hide history
@@ -70,9 +69,7 @@ fn prompt_for_url(s: &mut Cursive) {
.title("Enter URL")
// Padding is (left, right, top, bottom)
.padding((1, 1, 1, 0))
- .content(EditView::new()
- .on_submit(goto_url)
- .fixed_width(20))
+ .content(EditView::new().on_submit(goto_url).fixed_width(20))
.with_id("url_popup"),
);
}
@@ -91,15 +88,15 @@ fn show_history(s: &mut Cursive) {
// Hide popup when pressing h on an opened popup
if s.find_id::<Dialog>("history_popup").is_some() {
s.pop_layer();
- return
+ return;
}
let mut select = SelectView::new();
- for url in history::content() {
+ for url in history::content() {
let url_s = url.as_str();
select.add_item_str(url_s);
- };
+ }
select.set_on_submit(|s, link| {
s.pop_layer();
@@ -139,48 +136,69 @@ fn draw_content(s: &mut Cursive, url: Url, content: String) {
let mut main_view = s.find_id::<SelectView>("main").unwrap();
let mut container = s.find_id::<Dialog>("container").unwrap();
+ // handle response status
+ if let Some(status_line) = content.lines().next() {
+ if let Ok(status) = Status::from_str(status_line) {
+ match status {
+ Status::Success(_meta) => {}
+ Status::Gone(_meta) => {
+ s.add_layer(Dialog::info("Sorry page is gone."));
+ return;
+ }
+ Status::RedirectTemporary(new_url) | Status::RedirectPermanent(new_url) => {
+ follow_link(s, &new_url)
+ }
+ Status::TransientCertificateRequired(_meta)
+ | Status::AuthorisedCertificatedRequired(_meta) => {
+ s.add_layer(Dialog::info(
+ "You need a valid certificate to access this page.",
+ ));
+ return;
+ }
+ other_status => {
+ s.add_layer(Dialog::info(format!("ERROR: {:?}", other_status)));
+ return;
+ }
+ }
+ }
+ }
+
+ // set title and clear old content
container.set_title(url.as_str());
main_view.clear();
- // handle statuses here
- match Status::from_str(content.lines().next().unwrap()) {
- Ok(_status) => {}
- Err(_) => {}
- }
-
+ // draw new content lines
for line in content.lines().skip(1) {
match Link::from_str(line) {
- Ok(link) => {
- match link {
- Link::Http(_url, label) => {
- let mut formatted = StyledString::new();
- let www_label = format!("[WWW] {}", label);
- formatted.append(StyledString::styled(www_label, Effect::Italic));
-
- main_view.add_item(formatted, String::from("0"))
- },
- Link::Gopher(_url, label) => {
- let mut formatted = StyledString::new();
- let gopher_label = format!("[Gopher] {}", label);
- formatted.append(StyledString::styled(gopher_label, Effect::Italic));
-
- main_view.add_item(formatted, String::from("0"))
- },
- Link::Gemini(url, label) => {
- let mut formatted = StyledString::new();
- formatted.append(StyledString::styled(label, Effect::Underline));
-
- main_view.add_item(formatted, url.to_string())
- },
- Link::Relative(url, label) => {
- let mut formatted = StyledString::new();
- formatted.append(StyledString::styled(label, Effect::Underline));
-
- main_view.add_item(formatted, url.to_string())
- },
- _ => ()
+ Ok(link) => match link {
+ Link::Http(_url, label) => {
+ let mut formatted = StyledString::new();
+ let www_label = format!("[WWW] {}", label);
+ formatted.append(StyledString::styled(www_label, Effect::Italic));
+
+ main_view.add_item(formatted, String::from("0"))
}
- }
+ Link::Gopher(_url, label) => {
+ let mut formatted = StyledString::new();
+ let gopher_label = format!("[Gopher] {}", label);
+ formatted.append(StyledString::styled(gopher_label, Effect::Italic));
+
+ main_view.add_item(formatted, String::from("0"))
+ }
+ Link::Gemini(url, label) => {
+ let mut formatted = StyledString::new();
+ formatted.append(StyledString::styled(label, Effect::Underline));
+
+ main_view.add_item(formatted, url.to_string())
+ }
+ Link::Relative(url, label) => {
+ let mut formatted = StyledString::new();
+ formatted.append(StyledString::styled(label, Effect::Underline));
+
+ main_view.add_item(formatted, url.to_string())
+ }
+ Link::Unknown(_, _) => (),
+ },
Err(_) => main_view.add_item(str::replace(line, "\t", " "), String::from("0")),
}
}
---
Served by Pollux Gemini Server.
-- Response ended
-- Page fetched on Sun May 19 09:27:11 2024