Gopher
Thursday, December 18, 2014
The Gopher protocol is relatively dated now, but when it was first released in 1991, it had a number of modern features that we would later enjoy in the World Wide Web. In particular, in RFC 1436, it lists these features:
- A file-like hierarchical arrangement that would be familiar to users.
- A simple syntax.
- A system that can be created quickly and inexpensively.
- Extending the file system metaphor, such as searches.
We’re going to build a simple word to let us look through Gopherspace using Factor.
Using the URLs vocabulary, we will build a tool to fetch documents from a Gopher server using a URL that looks like this:
gopher://gopher.floodgap.com/0/gopher/proxy
This specifies a host, an optional port (defaulting to 70 if not specified), and a path which includes an item type and a selector identifying the document to obtain.
Once a network connection is opened, we can retrieve the specified document by sending the selector followed by a CRLF (carriage return and line feed, ASCII bytes 13 and 10 respectively), and then reading the response:
: get-selector ( selector -- document )
"/" split1 "" or nip write "\r\n" write flush contents ;
: gopher ( url -- document )
>url {
[ host>> ]
[ port>> 70 or <inet> ascii ]
[ path>> rest ]
} cleave '[ _ get-selector ] with-client ;
The item type, which we are ignoring in the code above, can be used a bit like a filename extension to handle documents of different types in particular ways. Some common types that you might see:
- 0 - plain text
- 1 - menus
- 9 - binary
- s - sound
- g - GIF images
Right now, our code assumes that all the documents we will fetch are ASCII, and it doesn’t have any special handling for menus, or support for a query string that would allow using Gopher “search servers”. I added some basic support for those items in the new gopher vocabulary that I committed yesterday. In addition, I built a simple Gopher browser complete with history support and ability to view GIF images in the gopher.ui vocabulary.
Here’s how you would use it:
IN: scratchpad USE: gopher.ui
IN: scratchpad "gopher://gopher.floodgap.com/1"
open-gopher-window
That will pop up a window that looks like this, with clickable links and everything:
It’s neat using some of these early protocols, both because they tend to be simpler, but especially when you see that they have a passionate following. As of December 2014, Veronica-2 has indexed 150 gopher servers with over 3 million unique selectors. You can see current stats by going to:
gopher://gopher.floodgap.com/0/v2/vstat
Check it out!