# Gopher

## Що це таке

Gopher — це протокол для отримання документів і меню через інтернет: клієнт відкриває
TCP-з'єднання, надсилає один рядок із тим, що йому потрібно, читає відповідь і на цьому
закінчує. Офіційно він називається Internet Gopher Protocol, його адреси починаються з
`gopher://`, а сайт, опублікований через нього, зазвичай називають норою Gopher (gopher hole).
Протокол походить з 1991 року, а RFC 1436 описав його в березні 1993-го.

Обмін настільки короткий, що його можна набрати вручну. Клієнт під'єднується до порту 70,
надсилає селектор (рядок, який сервер видав раніше, можливо, порожній), а за ним символи
повернення каретки й переведення рядка, і сервер відповідає та закриває з'єднання. Між запитами
не зберігається нічого: ні сесії, ні cookie, ні заголовків. Порожній селектор просить у сервера
його головне меню.

Серце протоколу — меню. Кожен рядок меню є одним пунктом: один символ типу, текст для показу, а
далі селектор, хост і порт, розділені табуляціями. Рядок, у якому стоїть лише крапка, завершує
меню. Ось невелике меню, де кожну табуляцію записано як `<TAB>`:

```text
0Про цей сервер<TAB>/about.txt<TAB>example.org<TAB>70
1Звіти<TAB>/reports<TAB>example.org<TAB>70
7Пошук у звітах<TAB>/search<TAB>example.org<TAB>70
.
```

Символ типу повідомляє клієнтові, що він отримає, ще до запиту. RFC 1436 визначає `0` для
текстового файлу, `1` для іншого меню, `7` для пошуку, який приймає запит, `9` для двійкового
файлу, `g` для зображення GIF і ще кілька. Два типи, поширені сьогодні, прийшли з практики, а не з
RFC: `i` для рядка звичайного тексту всередині меню і `h` для документа HTML, через який клієнти
також передають вебадресу браузерові.

Протокол навмисно малий. У RFC 1436 є розділ під назвою «Simplicity is intentional», і це
інформаційний RFC, а не інтернет-стандарт. Формат адрес `gopher://` з'явився пізніше, в RFC 4266,
де перший символ шляху позначає тип пункту, а решта є селектором.

## Чому це важливо

Сьогодні Gopher важить не стільки як шлях до великої аудиторії, скільки як ясна картина того, що
потрібно документові, а без чого він обійдеться. Меню — це навігація, зведена до кістяка: кожен
вихід зі сторінки стоїть у списку, має тип і займає окремий рядок, і нічого не сховано за
наведенням курсора чи скриптом. Публікація туди змушує поставити питання, які HTML дозволяє
відкласти. Як називається ця сторінка? Які в неї справжні посилання? Чи має текст сенс, коли
посилання з нього вийняли?

Для організації нора Gopher — це додаткові вхідні двері, а не заміна вебу. Читачам потрібен
окремий клієнт, і їх небагато. Скільки коштують ці двері, залежить цілком від того, як їх
збудовано. Якщо підтримувати її вручну як другу копію сайту, вона розходиться з ним, щойно одну
копію відредагують, а про другу забудуть. Якщо генерувати її з того самого джерела в тому самому
збиранні, вона коштує один шаблон і трохи місця на диску, а найбільше користі дає як навантажувальне
випробування тексту.

Друге, що варто розуміти, стосується безпеки. Gopher не має шару шифрування. Кожен селектор, а
отже, кожна сторінка, яку просить читач, іде мережею відкритим текстом, і так само кожна
відповідь. У RFC 1436 немає механізму входу, а запит, який читач уводить у пункт пошуку, теж
передається відкритим текстом. Для публічних документів це прийнятно, для всього іншого ні, і
тому власні журнали оператора заслуговують на таку саму увагу, як і вміст.

Зате протокол дешево налагоджувати. Без TLS, заголовків і стану один командний рядок показує
точні байти, які отримує клієнт, тож копія в Gopher стає одним із найпростіших для перевірки
виходів сайту.

## Як це виглядає на практиці

Цей сайт є норою Gopher так само, як і вебсайтом. Сторінка
[Engineer у терміналі](/uk/cli/) наводить адресу, `gopher://engineer.company/`, описує Gopher як
протокол меню 1991 року з простим TCP, без шифрування й без скриптів і каже, що сайт там є набором
меню. Вона називає клієнти Lynx, Bombadillo і gopher-cli та показує запит, зроблений вручну за
допомогою `printf` і `nc` на порт 70: увесь протокол в одному рядку.

Збирання, яке за цим стоїть, описано в
[розповіді про віддзеркалення сайту в Gemini і Gopher](/uk/portfolio/mirrored-the-site-to-gemini-and-gopher-137/).
Те саме збирання, що пише HTML, пише й 777 меню Gopher, розгорнутих у те саме дерево, і віддає їх
невеликий демон на тому самому хості. Розповідь називає найжорсткіше обмеження: рядок меню є
набором полів, розділених табуляціями, тож посилання не може стояти всередині речення, а текст
жорстко переноситься на шістдесяти восьми колонках під час збирання сайту. Робота в цих межах
загострила текст.

Шаблони показують, як кожна сторінка стає меню. Посилання в тексті зберігають слова й втрачають
адреси, заголовки втрачають свої решітки, пункти списків стають зірочками з відступом, а текст
переноситься на 68 колонках. Код є винятком і проходить без перенесення, бо рядок коду, розірваний
на колонці 68, стає іншою програмою. Категорії та послуги стають пунктами типу `1`, що ведуть до
їхніх власних меню, а внизу кожної сторінки стоїть пункт `h`, чий селектор `URL:` веде до
вебверсії тієї самої сторінки.

Нора Gopher навчила сайт і дечого про журнали. Сторінка
[Конфіденційність](/uk/privacy/) пояснює, що з вересня 2026 року сайт рахує лише кількість
запитів, на які щодня відповіли копії в Gemini і Gopher, без адреси, сторінки й відвідувача. У
день, коли почався підрахунок, з'ясувалося, що операційна система запускає копію в Gopher наново
для кожного відвідувача й називає цей запуск за адресою, з якої відвідувач прийшов, у власному
журналі. Тепер записи в тому журналі видаляються через тридцять днів, як і все інше, що зберігає
сайт.

## Де виникають проблеми

### Сторінка уривається посередині й показує вміст теки

Читач відкриває сторінку й отримує її першу половину, а за нею список файлів у теці. Сервери на
кшталт Gophernicus читають gophermap перед тим, як її надіслати, і рядок без табуляцій, перший
символ якого збігається з однією з їхніх директив, сприймається як інструкція: `#` ховає рядок як
коментар, `=` вставляє інший файл, а `*` чи `.` зупиняє меню. Цей сайт натрапив на це, коли рядок
CSS в українській нотатці про підкреслення в Safari почався із зірочки, що закриває коментар CSS,
і робочий сервер обрізав сторінку в цьому місці й показав замість решти index.html, index.md та
index.gmi. Записуйте кожен такий рядок як явний пункт `i` і зупиняйте збирання на будь-якому
голому рядку, що досі починається із символу директиви.

### Розмітка й сутності приходять як текст

Абзац з'являється одним дуже довгим рядком, повним кутових дужок, або з амперсандом, який досі
записаний як сутність HTML. Конвертер скопіював HTML у формат, який нічого не знає про HTML.
Прибирайте теги, зберігаючи текст посилань, декодуйте сутності й не чіпайте код у тексті, щоб його
символи вціліли.

### Рядки виходять за правий край

Текст вилазить за межі екрана, або тексти для показу обрізано посеред слова. Клієнти Gopher не
зобов'язані нічого переносити, а RFC 1436 просить тримати тексти для показу коротшими за 70
символів. Переносьте текст під час збирання, свідомо скорочуйте підписи в меню й не пускайте код
у перенесення.

### Посилання відкриває не те

Адреса `gopher://` відкриває помилку або сторонній пункт. RFC 4266 читає перший символ шляху як
тип пункту, тож `gopher://example.org/reports` просить тип `r` і селектор `eports`. Ставте тип
перед селектором, як у `gopher://example.org/1/reports`, і копіюйте адреси з робочого меню, а не
набирайте їх вручну.

### Список прочитаного йде відкритим текстом

Кожну сторінку, яку відкриває читач, бачить будь-хто на шляху мережею, і вона, можливо, потрапляє
в журнали, яких ніхто не збирався вести. Публікуйте лише те, що могло б стояти на листівці,
читайте журнали всієї машини, а не тільки демона, і давайте кожному з них строк зберігання.

## Що почитати далі

- [RFC 1436: The Internet Gopher Protocol](https://www.rfc-editor.org/rfc/rfc1436)
  — первинний опис: запит і відповідь, рядки меню, типи пунктів і причини тримати все простим.
- [RFC 4266: The gopher URI Scheme](https://www.rfc-editor.org/rfc/rfc4266)
  — як адреса `gopher://` кодує хост, порт, тип пункту й селектор.
- [IANA Service Name and Transport Protocol Port Number Registry](https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml)
  — офіційний реєстр, де порт 70 записано за Gopher.
- [Gophernicus](https://github.com/gophernicus/gophernicus) — вихідний код і документація
  сучасного сервера Gopher, зокрема формат gophermap, який він читає.

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