Redirection ----------- I'm pretty convinced that, as outlined in earlier posts, I want Gemini to feature some very lightweight equivalent to HTTP's status codes. Compared to in-band "special values" of the kind recently discussed by ratfactor[1], signalling error conditions unambiguously in a machine-readable fashion allows human niceties like clients which report errors in the user's native language, and also allow robust access by scripts, bots, etc. Given that status codes are going to be in there, Gemini's philosophy of maximing power to weight ratio means that we should use them for as many cool things as we can, since they're in there anyway. HTTP does a lot of things with status codes. I don't want to copy them all blindly, but rather think about which ones could be useful in scenarios that I imagine could be typical for Gemini, and then implement them if I think they can be done in a way that's sufficiently simple and harmless from a privacy perspective. One possibility is redirection. Briefly, in HTTP, this is used to let servers respond to a request by saying "Hey, that document you want is actually now at *this* URL". Your browser will then automatically, without telling you, fetch that new URL. One common application of this is to redirect insecure HTTP URLs to secure HTTPS URLs. If you connect to sdf.org on port 80 and request the "/" path, you'll receive this response: ---------- HTTP/1.1 301 Moved Permanently Date: Fri, 21 Jun 2019 18:49:45 GMT Server: Apache/2.2.34 (Unix) mod_ssl/2.2.34 OpenSSL/1.0.2p Location: https://sdf.org/ Content-Length: 325 Connection: close Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>301 Moved Permanently</title> </head><body> <h1>Moved Permanently</h1> <p>The document has moved <a href="https://sdf.org/">here</a>.</p> <hr> <address>Apache/2.2.34 (Unix) mod_ssl/2.2.34 OpenSSL/1.0.2p Server at sdf.org Port 80</address> </body></html> ---------- The 301 status means, like the rest of the first line of the header says, "Moved permanently". The "Location:" header indicates that http://sdf.org has moved to https://sdf.org. It would be very easy to add this to Gemini. Instead of an "everything okay" response header like this: ---------- 2 text/plain ---------- a server could send: ---------- 3 <NEW ADDRESS> ---------- Piece of cake, parsed in exactly the same way as the "all okay" header. So, we could have this, the question is do we want it? Nobody using gopher can deny that this functionality would be handy. logout recently changed the selector for the Bongusta phlog aggregator (or, more accurately, after changing the selector at the start of 2019, this month he finally removed the symlink from the old selector). I am *not* criticising logout here, let me be clear. He did absolutely everything 100% right. He gave advance notice[2] before making the change, and kept the old selector working for 6 months afterwards. In gopher, that's all you can do. But lazy people like me didn't update my bookmarks everywhere (particularly, not on PocketGopher on my phone) and for a few days I was confused by the "Forbidden!" message before I rememebered the change. Scripts like moku-pona also would have been confused, as they can't read the warning which logout put in the menu. And now all old links to Bongusta in people's old phlog posts are broken forever. So, redirects could solve real headaches which actually happen in gopherspace. Why isn't it a slam-dunk that we should want them? In HTTP, redirects are also the magic behind URL shorteners. I am on record as thinking that URL shorteners are evil[3], and I stand by that. I am loathe to make the worst evils of the web easily possible in Gemini, and so I am pretty deeply conflicted about redirects, which can be used for good *and* for evil. Maybe the worst evil of URL shorteners for the web is their surveillence function. I am pretty convinced that this is actually the main motivation for most of these services being set up. They are a sort of man-in-the-middle attack. Thanks to HTTP's stupid Referer header, they know where you've come to them from. By their very nature, they know where you leave from them to. Thanks to cookies, each time you use one, they know it's you. This lets them build up profiles of the navigation routes that users take through the web. The design of Gemini thus far actually defuses this to quite an extent. There are no Referer headers and no cookies, so even if somebody were to build a Gemini URL shortener, it wouldn't be anywhere near as functional as a surveillance tool as the web equivalent. Maybe this is a reason not to be so afraid of redirects? They would break other nice properties, though, especially the simple transparency and predictability that gopher offers in that you know in advance *exactly* which one and *only one* server your computer will connect to when you follow a link. This feature maximises a user's autonomy and decision-making ability in their online behaviour, and I value that deeply (as I have written about previously[4]). I'm really not sure what I want here. In the face of such uncertainty, I'm inclined to play it safe and leave redirection out. I can always add it later if it proves that leaving it out was a mistake, but it's *much* harder to remove a feature. But I'm really interested in hearing what people think about this. I could use the guidance. Here are some half-baked ideas on how to possibly implement this: * The <NEW ADDRESS> could be interpreted strictly as a new path to be sent to the same host on the same port as the original request. This would be enough to solve logout's Bongusta move and similar problems, but you couldn't possibly build a useful URL-shortener around it. It also retains perfect predictability of which host you'll be connecting to. I acknowledge that redirects to new hosts can be perfectly legitimate, so this is a bit of a compromise solution. * <NEW ADDRESS> could be a full URL, allowing redirection to new hosts, but the spec could explicitly specify that clients for interactive use by humans MUST ask for confirmation before following redirects to new hosts. [1] gopher://sdf.org:70/0/users/ratfactor/phlog/2019-06-18-protocol-pondering-x-solderpunk [2] gopher://i-logout.cz:70/0/phlog/posts/2018-12-12_im_gonna_break_things.txt [3] gopher://zaibatsu.circumlunar.space:70/0/~solderpunk/phlog/url-shorteners-are-evil.txt [4] gopher://zaibatsu.circumlunar.space:70/0/~solderpunk/phlog/on-gopher-conservatism.txt