vostok: сервер Gemini, версия 0.1.2

Вот и прошло более четырех месяцев с предыдущего релиза. Этот проект мне нравится, надеюсь я найду силы на то, что бы возвращаться к нему не только при обнаружении проблем.

Предыдущая запись блога разработки

Что нового в версии 0.1.2:

Открытие директорий без разделительного слеша в конце URL

В своей капсуле я использую относительные ссылки. Например ссылка на эту страницу из index.gmi в этой же директории будет выглядеть просто указанием имени файла:

=> 0.1.2.gmi v0.1.2 (2024-01-14)

Но если открыть директорию без слеша на конце, то Gemini клиент (ни AV-98, ни amfora) не сможет корректно обработать такую ссылку:

$ av98 gemini://any-key.press/vostok/reports
Welcome to AV-98!
Enjoy your patrol through Geminispace...
Блог разработки сервера vostok

[1] v0.1.2 (2024-01-14)
[1] v0.1.1 (2023-10-07)
[2] v0.1.0 (2023-09-06)
[3] v0.0.2 (2023-08-23)
[4] v0.0.1 (2023-08-17)
AV-98> 1
ERROR: Not found

Проблема проявляется, например, при использовании команды up у Gemini клиента AV-98:

$ av98 gemini://any-key.press/vostok/reports/
<...>
AV-98> up
<...>
AV-98> url
gemini://any-key.press/vostok

Поэтому Gemini сервер на своей стороне должен реагировать на открытие директории без разделителя (слеша) на конце и перенаправлять Gemini клиент на корректный URL. Как, например, это делает geminiprotocol.net:

$ echo "gemini://geminiprotocol.net/docs" | openssl s_client -crlf -quiet -connect geminiprotocol.net:1965 2> /dev/null
31 gemini://geminiprotocol.net/docs/

Постоянно забываю: как называется когнитивное искажение, когда начав вариться в какой-то проблеме начинает казаться, что все вокруг только о ней и говорят?) Часто ловлю себя на этом и текущий случай не исключение. Omar Polo, автор Gemini сервера gmid, в самый разгар моей работы над фиксом прокомментировал проблему в независимом треде:

my server returns absolute URIs (again, without the hostname) for redirects to directories (i.e. /posts -> /posts/)

https://bsd.network/@op/111917977768163064

Сделать небольшой фикс для сервера Vostok не получилось. Нужно сохранять признак наличия разделителя (слеша) на конце URL из запроса. Я реализовал это оставлением слеша в конце пути запроса, если он там был до нормализации URL. Функция открытия файл была упрощена до небольшой обёртки над openat. Это приводит к тому, что код сервера вызывает её дважды для директорий: первый раз для открытия самой директории, а второй раз для относительного открытия файла index.gmi. Это позволило между первым и вторым вызовами, если открывается директория и запрашиваемый URL не имеет на конце слеша, вернуть код перенаправления (31), но указав путь с разделителем на конце в meta.

Комментарии через ActivityPub (Fediverse) можно оставить здесь:

https://honk.any-key.press/u/continue/h/v5Gw81q1k7lx416YFt

Следующая запись блога разработки