💾 Archived View for mozz.us › journal › 2023-07-30.gmi captured on 2023-11-04 at 11:35:21. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2023-09-08)
-=-=-=-=-=-=-
Published 2023-07-30
Lately, I have been getting interested in gopher+ again. I've been doing some research and reading through the spec, and trying to collect any information that I can find on the protocol. Unlike gopher classic, which is still comprehensively documented and talked about, secondary sources for gopher+ are practically non-existent on the internet. There are a few random magazine articles and educational materials in '94, but practically nothing after that point. Which makes sense I guess, since gopher declined pretty rapidly to WWW.
I wanted to do a survey of gopherspace to see if anyone is still out there, playing around with gopher+. I asked on the gopher-project mailing list but didn't get much of a response. Then I was looking at gopher and thinking about it some more, and I figured there are only 300-ish servers out there, so why not try them all and see for myself?
My message on the mailing list
So here are the statistics on gopher+ support on the public internet, July 2023.
I grabbed the list of gopher hosts from Mateusz's OGUP page, which gave me 311 URLs to check.
OBSERVABLE GOPHERSPACE UNIVERSE PROJECT (OGUP)
My plan was basically to go through each server and make a simple gopher+ request, and then check the response for a valid gopher+ header. If the header existed, it would indicate that the server had a least the bare minimum implementation of gopher+.
I used this gopher request, which asks for the root gopher menu and indicates that the client supports gopher+:
<tab><tab>+<newline>
And then I checked if the first byte of the response was a "+" or "-" character (which indicates success or failure in gopher+). If it was a match, I poked around the server by hand a bit more to profile the software it was running.
Here are the results:
Of the 311 servers, I was able to connect to 300 of them.
Of those 300 servers, I received a gopher+ response for 41 of them.
Of those 41 servers,
See the full results below. Please forgive the awful formatting, this was originally a log file and I went in and butchered it by-hand.
It ended up being super easy to profile which software the servers were running.
Pygopherd is one that I am intimately familiar with, since I did the work myself to upgrade it python 3 a few years ago. If you send pygopherd an invalid selector, it will respond with an error page formatted like this:
--2 1 Unconfigured Pygopherd Admin <pygopherd@nowhere.nowhere> '/hjdasdhjsahjdashjkdas' does not exist (no handler found)
Note: I didn't keep count, but I would say that about half of the servers had an unconfigured email address like above, and half of them had filled in the details in their pygopherd config.
--2 1 John Goerzen <jgoerzen@complete.org> '/hjdasdhjsahjdashjkdas' does not exist (no handler found)
Pygopherd source code in Github
Example pygopherd server, gopher://gopher.quux.org
Synchronet is one that I had never encountered before. Thankfully, the server name and version are helpfully indicated from the root gopher menu.
Synchronet Gopher Service 1.18 Synchronet Services 3.19b Synchronet BBS for Win32 Version 3.19b Compiled Jan 2 2022 16:00 with MSC 1928 JavaScript-C 1.8.5 2011-03-31 Windows NT Version 10.0
It's BBS software that also includes a handy gopher frontend, I guess.
Example synchronet server, gopher://centralontarioremote.com
Unfortunately, I found that synchronet responds to every single gopher+ request with exactly the same thing,
+-1 .
Which in gopher+ speak means "this is an empty file". I guess this was their attempt to indicate a lack of gopher+ support (Not that this makes much sense, as the whole gopher+ protocol was intentionally designed to be backwards compatible with old servers).
I'm aware that Bucktooth and Gophernicus (at least those two, possibly more) have a similar hack to indicate non-support to gopher+ clients.
Bucktooth: Gopher+ (non)support ------------------------------- Since few clients nowadays understand Gopher+ (except for, oddly, Internet Explorer [45] which seems to at least obtain the size of a resource that way), Bucktooth does not support it. Nevertheless, it does understand the $ attribute enough to present a warning to Gopher+ clients that the server is not Gopher+, and to please stop accessing it that way. The UMN gopher client is particularly blockheaded on this point. This is handled for you and no special configuration is needed. As of 0.2, erroneous gopher+ queries are placed in < > in the log file so that they can be identified for debugging purposes.
Bucktooth: Gopher+ (non)support
These responses weren't captured in my survey because I sent a "+" character instead of a "$" character. But I think they fall into the same bucket as synchronet, and shouldn't be considered as having any *actual* gopher+ support.
Even though I suspected this already, I'm disappointed to see that pygopherd is the only gopher server left out there. I was holding out hope that there would be a random gopher+ server still alive with an example +ASK query or something interesting in it. Or at least someone running the original gopherd software from UMN (I thought this was more widely used)?
Pygopherd is great as a static-file server, but its support for CGI and dynamic responses is lacking. It can't do +ASK forms or multiple +VIEWS for selectors. Which means if I want to play around with gopher+ properly (which I do), I'm going to have to write my own server. I guess this was inevitable. I'm hoping that Flask-Gopher (my own server) is easy enough to extend to support gopher+, because it would give me a flexible base to work with.
I'm not aware of any modern gopher clients supporting gopher+, although I haven't yet done a comprehensive search yet.
One gopher+ client that I did find is FORG from David Allen, circa 2001. It's written in a very old version of python using Tkinter.
There has been some recent work from Tom4hawk modernize it, which is how I found the repo.