ref: 0ce20bd09df8ea923078920978339a42d2e98092
parent: 3cb37109edadc4df79607f55d06f3be7556d89d5
	author: telephil9 <telephil9@gmail.com>
	date: Sat Nov 28 01:21:14 EST 2020
	
Proper gopher:// url handling (thanks nicolagi) As per RFC4266, the gopher url scheme is supposed to include the gophertype before the selector. Add a new urltolink() function to properly parse urls accordingly. Change url creation functions to include the gophertype.
--- a/gopher.c
+++ b/gopher.c
@@ -242,6 +242,37 @@
flushimage(display, 1);
}
+Link*
+urltolink(char *url)
+{+ char *a, *sel, *hostport, *p;
+ int type;
+ Link *l;
+
+ a = strdup(url);
+ hostport = a;
+ if(strncmp(a, "gopher://", 9) == 0)
+ hostport += 9;
+ p = strchr(hostport, '/');
+	if(p){+ *p++ = 0;
+ type = *p ? seltype(*p++) : Tmenu;
+ sel = *p ? p : "";
+	}else{+ type = Tmenu;
+ sel = "";
+ }
+ p = strchr(hostport, ':');
+	if(p){+ *p++ = 0;
+ l = mklink(netmkaddr(hostport, "tcp", p), sel, type);
+	}else{+ l = mklink(netmkaddr(hostport, "tcp", "70"), sel, type);
+ }
+ free(a);
+ return l;
+}
+
char*
linktourl(Link *l)
 {@@ -251,11 +282,11 @@
a = strdup(l->addr);
n = getfields(a, f, 3, 0, "!");
if(n != 3)
-		s = smprint("Url: gopher://%s%s", l->addr, l->sel);+		s = smprint("Url: gopher://%s/%d%s", l->addr, l->type, l->sel);else if(atoi(f[2])!=70)
-		s = smprint("Url: gopher://%s:%s%s", f[1], f[2], l->sel);+		s = smprint("Url: gopher://%s:%s/%d%s", f[1], f[2], l->type, l->sel);else
-		s = smprint("Url: gopher://%s%s", f[1], l->sel);+		s = smprint("Url: gopher://%s/%d%s", f[1], l->type, l->sel);free(a);
return s;
}
@@ -344,12 +375,6 @@
}
void
-visitaddr(char *addr)
-{- visit(mklink(netmkaddr(addr, "tcp", "70"), "", Tmenu), 1);
-}
-
-void
plumburl(char *u)
 {int fd;
@@ -610,6 +635,8 @@
void
entryhit(Panel *p, char *t)
 {+ Link *l;
+
USED(p);
 	switch(strlen(t)){case 0:
@@ -631,7 +658,11 @@
}
break;
default:
- visitaddr(t);
+ l = urltolink(t);
+ if(l==nil)
+			message("invalid url %s", t);+ else
+ visit(l, 1);
}
plinitentry(entryp, PACKN|FILLX, 0, "", entryhit);
pldraw(root, screen);
@@ -727,6 +758,7 @@
main(int argc, char *argv[])
 {Event e;
+ Link *l;
char *url;
if(argc == 2)
@@ -740,7 +772,11 @@
plinit(screen->depth);
loadicons();
mkpanels();
- visitaddr(url);
+ l = urltolink(url);
+ if(l==nil)
+		message("invalid url %s", url);+ else
+ visit(l, 1);
eresized(0);
 	for(;;){ 		switch(event(&e)){--
⑨