# Gopher

## Hvad det er

Gopher er en protokol til at hente dokumenter og menuer over internettet, hvor en klient åbner en
TCP-forbindelse, sender én linje om, hvad den vil have, læser svaret og er færdig. Det formelle
navn er Internet Gopher-protokollen, adresserne begynder med `gopher://`, og et site, der udgives
over den, kaldes som regel et Gopher-hul (gopher hole). Protokollen stammer fra 1991, og RFC 1436
beskrev den i marts 1993.

Udvekslingen er så kort, at den kan tastes i hånden. Klienten forbinder til port 70, sender en
selector (en streng, serveren har udleveret tidligere, eventuelt tom) efterfulgt af vognretur og
linjeskift, og serveren svarer og lukker forbindelsen. Intet huskes mellem to forespørgsler: ingen
session, ingen cookie, ingen headere. En tom selector beder om serverens øverste menu.

Menuen er kernen. Hver linje i en menu er ét punkt, bygget af et enkelt typetegn, en visningstekst
og derefter en selector, en vært og en port, adskilt af tabulatorer. En linje med kun et punktum
afslutter menuen. Her er en lille menu, hvor hver tabulator er skrevet som `<TAB>`:

```text
0Om denne server<TAB>/om.txt<TAB>example.org<TAB>70
1Rapporter<TAB>/rapporter<TAB>example.org<TAB>70
7Søg i rapporterne<TAB>/soeg<TAB>example.org<TAB>70
.
```

Typetegnet fortæller klienten, hvad den får, før den spørger. RFC 1436 definerer `0` for en
tekstfil, `1` for en anden menu, `7` for en søgning, der tager imod en forespørgsel, `9` for en
binær fil, `g` for et GIF-billede og en håndfuld flere. To typer, der er meget udbredte i dag,
kommer fra praksis og ikke fra RFC'en: `i` for en linje almindelig tekst inde i en menu og `h` for
et HTML-dokument, som klienter også bruger til at give en webadresse videre til en browser.

Designet er bevidst lille. RFC 1436 har et afsnit med overskriften »Simplicity is intentional«,
og det er en informativ RFC, ikke en internetstandard. Adresseformatet `gopher://` kom senere, i
RFC 4266, hvor det første tegn i stien er punktets type, og resten er selectoren.

## Hvorfor det betyder noget

Gopher betyder i dag mindre som en vej til et stort publikum og mere som et klart billede af, hvad
et dokument har brug for, og hvad det kan undvære. En menu er navigation skåret ind til benet:
hver vej ud af en side står på listen, med type og på sin egen linje, uden noget gemt bag en
hover-effekt eller et script. At udgive dertil tvinger spørgsmål frem, som HTML lader en forfatter
udskyde. Hvad hedder siden? Hvilke links har den reelt? Giver teksten stadig mening, når linkene
er taget ud af den?

For en organisation er et Gopher-hul en ekstra hoveddør, aldrig en erstatning for webbet. Læserne
skal have en særlig klient, og de er få. Hvad døren koster, afhænger helt af, hvordan den er
bygget. Vedligeholdt i hånden som en ekstra kopi af sitet glider den væk, første gang den ene kopi
bliver rettet og den anden glemt. Genereret af den samme kilde i det samme build koster den en
skabelon og lidt diskplads, og den tjener mest af alt som en belastningsprøve på teksten.

Det andet, man skal forstå, er sikkerheden. Gopher har intet krypteringslag. Hver selector, og
dermed hver side, en læser beder om, krydser netværket i klartekst, og det samme gør hvert svar.
RFC 1436 har intet til at logge ind med, og den forespørgsel, en læser skriver i et søgepunkt,
rejser også i klartekst. Det er i orden for offentlige dokumenter og forkert for alt andet, og det
betyder, at operatørens egne logfiler fortjener lige så megen omtanke som indholdet.

Til gengæld er protokollen billig at fejlsøge. Uden TLS, headere og tilstand viser en enkelt
kommandolinje de præcise bytes, en klient modtager, og det gør en Gopher-kopi til et af de
nemmeste output fra et site at kontrollere.

## Sådan ser det ud i praksis

Dette site er et Gopher-hul såvel som et website. Siden
[Engineer i en terminal](/da/cli/) giver adressen, `gopher://engineer.company/`, beskriver Gopher
som en menuprotokol fra 1991 med ren TCP, ingen kryptering og ingen scripting og fortæller, at
sitet dér er et sæt menuer, én pr. mappe. Den nævner Lynx, Bombadillo og gopher-cli som klienter
og viser en forespørgsel lavet i hånden med `printf` og `nc` på port 70, hele protokollen på én
linje.

Buildet bag er beskrevet i
[beskrivelsen af, hvordan sitet blev spejlet til Gemini og Gopher](/da/portfolio/mirrored-the-site-to-gemini-and-gopher-137/).
Det samme build, der skriver HTML'en, skriver også 777 Gopher-menuer, udrullet til det samme træ og
leveret af en lille dæmon på den samme vært. Beskrivelsen nævner den hårdeste begrænsning: en
menulinje er et sæt felter adskilt af tabulatorer, så et link kan ikke stå inde i en sætning, og
brødteksten bliver hårdt ombrudt ved otteogtres kolonner, mens sitet bygges. At arbejde inden for
den ramme skærpede teksten.

Skabelonerne viser, hvordan hver side bliver til en menu. Links i teksten beholder deres ord og
mister deres mål, overskrifter mister deres havelåger, punkter bliver til indrykkede stjerner, og
brødteksten ombrydes ved 68 kolonner. Kode er undtagelsen og går igennem uden ombrydning, fordi en
kodelinje, der knækkes ved kolonne 68, er et andet program. Kategorier og ydelser bliver til
punkter af type `1`, der peger på deres egne menuer, og nederst på hver side står et `h`-punkt,
hvis `URL:`-selector fører til webversionen af den samme side.

Gopher-hullet lærte også sitet noget om logfiler. Siden
[Privatliv](/da/privacy/) forklarer, at sitet siden september 2026 kun tæller, hvor mange
forespørgsler Gemini- og Gopher-kopierne besvarede hver dag, uden adresse, side eller besøgende.
Den dag optællingen begyndte, viste det sig, at styresystemet starter Gopher-kopien forfra for hver
besøgende og navngiver det øjeblik efter den adresse, den besøgende kom fra, i en log for sig.
Den log udløber nu efter tredive dage, som alt andet, sitet gemmer.

## Hvor det går galt

### En side stopper halvvejs og viser mappens indhold

En læser åbner en side og får den første halvdel, efterfulgt af en liste over filerne i mappen.
Servere som Gophernicus læser en gophermap, før de sender den, og en linje uden tabulatorer, hvis
første tegn er et af deres direktiver, bliver behandlet som en instruktion: `#` skjuler den som en
kommentar, `=` indsætter en anden fil, og `*` eller `.` stopper menuen. Dette site mødte det, da
en linje CSS i den ukrainske note om understregninger i Safari begyndte med den stjerne, der lukker
en CSS-kommentar, og den kørende server klippede siden over dér og viste index.html, index.md og
index.gmi i stedet. Skriv hver sådan linje som et eksplicit `i`-punkt, og lad buildet fejle på
enhver bar linje, der stadig begynder med et direktivtegn.

### Markup og entiteter når frem som tekst

Et afsnit dukker op som én meget lang linje fuld af vinkelparenteser, eller med et og-tegn, der
stadig står skrevet som sin HTML-entitet. Konverteren kopierede HTML ind i et format, der ikke aner,
hvad HTML er. Fjern tags og behold linkteksten, afkod entiteter, og lad kode i teksten være, så
dens tegn overlever.

### Linjer løber ud over højre kant

Brødteksten flyder ud over skærmen, eller visningstekster bliver klippet midt i et ord.
Gopher-klienter har ingen pligt til at ombryde noget, og RFC 1436 beder om visningstekster på under
70 tegn. Ombryd brødteksten under buildet, afkort menuteksterne med vilje, og hold koden uden for
ombrydningen.

### Et link henter det forkerte

En `gopher://`-adresse åbner en fejl eller et punkt, der intet har med sagen at gøre. RFC 4266
læser det første tegn i stien som punktets type, så `gopher://example.org/rapporter` beder om type
`r` og selectoren `apporter`. Sæt typen foran selectoren, som i
`gopher://example.org/1/rapporter`, og kopiér adresser fra en menu, der virker, frem for at taste
dem.

### Læselisten rejser i klartekst

Hver side, en læser åbner, kan ses af alle på netværksvejen og havner måske i logfiler, ingen havde
tænkt sig at gemme. Udgiv kun det, der kunne stå på et postkort, læs logfilerne for hele maskinen
og ikke kun for dæmonen, og giv hver af dem en udløbsdato.

## Læs mere

- [RFC 1436: The Internet Gopher Protocol](https://www.rfc-editor.org/rfc/rfc1436)
  — den oprindelige beskrivelse: forespørgsel og svar, menulinjer, punkttyper og grundene til at
  holde det enkelt.
- [RFC 4266: The gopher URI Scheme](https://www.rfc-editor.org/rfc/rfc4266)
  — hvordan en `gopher://`-adresse rummer vært, port, punkttype og selector.
- [IANA Service Name and Transport Protocol Port Number Registry](https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml)
  — det officielle register, hvor port 70 står som Gophers port.
- [Gophernicus](https://github.com/gophernicus/gophernicus) — kildekode og dokumentation for en
  nutidig Gopher-server, herunder det gophermap-format, den læser.

<https://engineer.company/da/glossary/gopher/>
