GOPHER 2.0 - THE PROTOCOL I think this is going to be post 2 of 4. At the outset, I want to be clear about one thing: I like Gopher just fine the way it is and I value that it still works on old machines. I hope we'll be able to visit Gopher sites *as they are now* for many more decades to come. Having said that, I have some fanciful ideas about what Gopher *could* be if it were born today. I think there are three main perspectives when considering a con- tent delivery system: developers, content creators, and end-users (I would use the term "consumer", but that feels negative): 1. Developers (the person who writes the client and server appli- cations) The current Gopher protocol is very developer friendly. I'm not sure I can improve upon it *much*. 2. Content creators There's not much about the Gopher protocol itself that either helps nor hinders a content creator. 3. End-users The only thing about the protocol which I think really affects end-users at all is the selector string format. The Gopher RFC, 1436 says this about the selector string: The selector string should mean nothing to the client software; it should never be modified by the client. This is interesting. As the end-user of Web browsers, I often manipulate URLs to navigate websites when the site's own naviga- tion scheme has failed me. I find that Gopher selectors are far less friendly for manual ma- nipulation, particularly since they also encode the item type at the beginning of the selector (so you have to think about whether you're trying to get a directory listing, text document, etc.). Changes ================================================================= What would a utopian Gopher protocol look like? Pretty similar to what we have now: It would still be stateless - one connection per transaction. Stateless is easy to build, easy to debug, easy to think about, and good for privacy. I'm not convinced there's any need for Gopher to end text trans- actions with a single dot '.' on a line. It's not super reliable or definitive. The workaround for send- ing a document with actual single dots on their own lines is to send two dots! (Do you then send *three* dots if there are al- ready *two* and so forth?) How would you ever be sure this document had completed success- fully: .................. ... Hello, ....... ... I like ....... ... dots ......... ..... '.' ........ .................. Further, Gopher uses no '.' to end binary files, so the client simply receives until the connection closes. Nope, I prefer just closing the connection when we're done with each transaction for *all* types. Simple is GOOD. In fact, I might go one step further and say, look, this simply isn't the right protocol for sending "big" files. There's no content length header, no resume feature, no peer-to-peer. You should really be using something else like HTTP, SFTP, or BitTor- rent for big files. In fact, I wouldn't be opposed at all to capping all content to some limit like 1Mb, 5Mb, maybe 10Mb. That would allow (huge) text content, (huge) images, song-length audio, and even short video. Again, the idea being that there are *far* better ways to trans- fer large files than Gopher. I'm a little torn on the idea of having the selector type in the selector string. In *principal*, I do see the value in saying here's a directory ("menu"), here's a document, here's search: gopher://example.com/1/my_rantings gopher://example.com/0/my_rantings/rant001 gopher://example.com/7/veronica9000 But in practice, I find it annoying to have the most specific in- formation about the selector at opposite ends of the string. As a newbie, I initially found Gopher selector strings to be far less intuitive and discoverable than a *good* Web URL. I also much prefer non-Gopher protocols to be specified in the URI style: [0] scheme:[//authority]path[?query][#fragment] sftp://example.com/big_files/huge.tar.gz And as to whether I'm viewing a menu (1) vs document (0), well, I don't really care *at the protocol level*. Just give me whatever you've got at that location and assume I know what to do with it. (Mind you, I *do* care what you're linking to at the docu- ment/client level - so more on that later.) And the server is already going to have to check what it's serv- ing at a given path - so having it double-check the type is adding no benefit on that end. Simple is GOOD. Finally, I do think the next generation protocol would not just support encryption, but would require it at the outset for sim- plicity's sake. No certificates - just public keys! SSH works without central- ized certificate authorities. Use a known_hosts file just like SSH. I might remember to speak more of this when talking about the client, later. That's it for the protocol. Less is more! I find that I have a *lot* more to say about a next-gen content format and next-gen client. Summary ================================================================= In my imagination, a next-gen protocol is: Still stateless. Remove Selector 'type' from selector string. Simply close the connection after a transfer is complete. Consider a file size cap. Require public key encryption to preserve privacy and guard against man-in-the-middle manipulation of data. [0] https://en.wikipedia.org/wiki/Uniform_Resource_Identifier