Commit Diff


commit - 0b442ded38304c66eae70d68bdb0a9a4e7315017
commit + adea4eec23e155cdd58a4df7fbb7ddaba6c9fdfc
blob - d5a211436ecc7465cc57cb8f91d0e65308fa9347
blob + bf8b8b940ded5a9503b84a05128611eb8b13b52f
--- ChangeLog
+++ ChangeLog
@@ -1,5 +1,7 @@
 2021-07-16  Omar Polo  <op@omarpolo.com>
 
+	* telescope.c (do_load_url): handle unknown protocols gracefully
+
 	* defaults.c (load_default_keys): bind [ to tab-previous
 	(load_default_keys): bind ] to tab-next
 
blob - fdd2f730afb85fdf3d92826d6a126a5ec2bfb8ef
blob + 4fbb7ad31452beaf72937646a2d981c2597607c9
--- pages.c
+++ pages.c
@@ -139,6 +139,7 @@ const char *err_pages[70] = {
 	[TOO_MUCH_REDIRECTS]	= "# Too much redirects\n",
 	[MALFORMED_RESPONSE]	= "# Got a malformed response\n",
 	[UNKNOWN_TYPE_OR_CSET]	= "# Unsupported type or charset\n",
+	[UNKNOWN_PROTOCOL]	= "# Unknown protocol\n",
 
 	[10] = "# Input required\n",
 	[11] = "# Input required\n",
blob - d4cf3bdd308e7d2ca99b125c7100d4d982f74c00
blob + afae4746c7c58920c3d9d4b0b9727ab7494656fc
--- pages.h
+++ pages.h
@@ -26,6 +26,7 @@ extern const char	*about_new;
 #define TOO_MUCH_REDIRECTS	1
 #define MALFORMED_RESPONSE	2
 #define UNKNOWN_TYPE_OR_CSET	3
+#define UNKNOWN_PROTOCOL	4
 extern const char	*err_pages[70];
 
 #endif
blob - 11c9d552b44915fbbf3dea7bd236a14ef65d4c89
blob + 66c68f7af41101d93be01adda679992b77bec1af
--- telescope.c
+++ telescope.c
@@ -60,7 +60,7 @@ static void		 handle_imsg_save_cert_ok(struct imsg*, s
 static void		 handle_imsg_update_cert_ok(struct imsg *, size_t);
 static void		 handle_dispatch_imsg(int, short, void*);
 static void		 load_page_from_str(struct tab*, const char*);
-static void		 do_load_url(struct tab*, const char*);
+static int		 do_load_url(struct tab*, const char*);
 static pid_t		 start_child(enum telescope_process, const char *, int);
 static int		 ui_send_net(int, uint32_t, const void *, uint16_t);
 static int		 ui_send_fs(int, uint32_t, const void *, uint16_t);
@@ -552,7 +552,14 @@ load_via_proxy(struct tab *tab, const char *url, struc
 	    &req, sizeof(req));
 }
 
-static void
+/*
+ * Effectively load the given url in the given tab.  Return 1 when
+ * loading the page asynchronously, and thus when an erase_buffer can
+ * be done right after this function return, or 0 when loading the
+ * page synchronously.  In this last case, erase_buffer *MUST* be
+ * called by the handling function (such as load_page_from_str).
+ */
+static int
 do_load_url(struct tab *tab, const char *url)
 {
 	struct phos_uri	 uri;
@@ -579,7 +586,7 @@ do_load_url(struct tab *tab, const char *url)
 		strlcpy(tab->hist_cur->h, url, sizeof(tab->hist_cur->h));
 		load_page_from_str(tab, t);
 		free(t);
-		return;
+		return 0;
 	}
 
 	phos_serialize_uri(&tab->uri, tab->hist_cur->h,
@@ -588,18 +595,19 @@ do_load_url(struct tab *tab, const char *url)
 	for (p = protos; p->schema != NULL; ++p) {
 		if (!strcmp(tab->uri.scheme, p->schema)) {
 			p->loadfn(tab, url);
-                        return;
+                        return 1;
 		}
 	}
 
 	TAILQ_FOREACH(proxy, &proxies, proxies) {
 		if (!strcmp(tab->uri.scheme, proxy->match_proto)) {
 			load_via_proxy(tab, url, proxy);
-			return;
+			return 1;
 		}
 	}
 
-	protos[0].loadfn(tab, url);
+	load_page_from_str(tab, err_pages[UNKNOWN_PROTOCOL]);
+	return 0;
 }
 
 void
@@ -614,8 +622,8 @@ load_url(struct tab *tab, const char *url)
 	}
 
 	hist_push(&tab->hist, tab->hist_cur);
-	do_load_url(tab, url);
-	erase_buffer(&tab->buffer);
+	if (do_load_url(tab, url))
+		erase_buffer(&tab->buffer);
 }
 
 int