87 lines
4.2 KiB
Markdown
87 lines
4.2 KiB
Markdown
# Gopher
|
|
Gopher is an hypertext protocol, similar to [HTTP](http.md) but far more simpler and [KISS](kiss.md).
|
|
|
|
Pages using the Gopher protocol are known as "Gopherholes". As of writing this, there are about 200~300 active gopherholes.
|
|
|
|
## Protocol
|
|
Compared to other protocols, like HTTP, Gopher is a simple text-based protocol, described in [RFC 1436](https://datatracker.ietf.org/doc/html/rfc1436).
|
|
Gopher does not use encryption, but extensions to it add optional encryption, see below.
|
|
|
|
Gopher has the port 70 assigned to for its use, and the `gopher://` URI protocol. To request a document to a Gopher server,
|
|
first a TCP connection is opened at port 70 and the called *selector* string is sent along with a CRLF (`\r\n`) at the end
|
|
(servers may also accept a simple `\n`), then the server should reply with the requested document. The selector is the
|
|
path of the document on the server. When no selector is specified (so only a CRLF is sent),
|
|
a default selector is sent to the client, usually a menu (gophermap).
|
|
|
|
With just netcat, printf and a pipe we can have a minimal client as a proof of concept, like this:
|
|
```sh
|
|
printf '\r\n' | nc 'khzae.net' 70
|
|
```
|
|
|
|
### Gophermap
|
|
A Gopher menu (also called Gophermap) follows a basic format, lines with tab separated fields:
|
|
```
|
|
type text selector hostname port
|
|
```
|
|
Here is an example of a line describing a selector:
|
|
| Type | Text | Selector | Hostname | Port |
|
|
| :----: |-------------------|----------|--------------| :--: |
|
|
| 1 | Bitreich Projects | /scm | bitreich.org | 70 |
|
|
|
|
The type field can be any of the following:
|
|
| Type | Description |
|
|
| :--: |-----------------------------------------------------|
|
|
| 0 | File |
|
|
| 1 | Directory |
|
|
| 2 | CSO phonebook server (?) |
|
|
| 3 | Error |
|
|
| 4 | BinHex Machintosh (?) |
|
|
| 5 | DOS binary |
|
|
| 6 | uuencoded file |
|
|
| 7 | Index-search server |
|
|
| 8 | Text Telnet session |
|
|
| 9 | Binary file (EOF when server closes the connection) |
|
|
| + | Redundant server |
|
|
| T | Telnet 3270 |
|
|
| g | GIF image |
|
|
| I | Image, file format unspecified. |
|
|
|
|
And some common extension types:
|
|
| Type | Description |
|
|
| :--: |-----------------------------------------------------|
|
|
| d | .doc file |
|
|
| h | HTML document |
|
|
| i | Informational message |
|
|
| p | PNG image |
|
|
| r | RTF document |
|
|
| s | Sound file, usually .wav |
|
|
| P | PDF document |
|
|
| X | XML document |
|
|
|
|
A relative link to a document in the same server:
|
|
```
|
|
1About /about khzae.net 70
|
|
```
|
|
|
|
Paragraphs can be made with the `i` type:
|
|
```
|
|
i___[ News Aggregator ] Err bitreich.org 70
|
|
```
|
|
The selector (marked here with a placeholder "Err"), server address and port are ignored.
|
|
|
|
Finally, a gophermap must end in a `.` followed by a CRLF on its own line.
|
|
|
|
|
|
## Protocol extensions
|
|
TODO list extensions
|
|
|
|
## Accessing
|
|
"Modern" web browsers are so advanced that can't bother implementing such a trivial protocol, so if you're using a web browser you
|
|
can use a proxy like <https://gopher.floodgap.com/gopher/> that works over HTTP.
|
|
But for the true experience, you want a text based browser with native support for Gopher such as [Lynx](https://lynx.invisible-island.net/)
|
|
or [Bitreich's](bitreich.md) [sacc](gopher://bitreich.org/1/scm/sacc) browser.
|
|
|
|
## Notable Gopherholes
|
|
- [Bitreich](gopher://bitreich.org/1)
|
|
- [Veronica-2](gopher://gopher.floodgap.com/1/v2): a search engine for the gopherspace, indexing is limited to titles, however.
|
|
- <gopher://khzae.net>
|