💾 Archived View for any-key.press › vostok › reports › 0.0.2.gmi captured on 2024-03-21 at 15:10:21. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2023-09-08)

➡️ Next capture (2024-05-10)

-=-=-=-=-=-=-

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

Ого, энтузиазма хватила на вторую версию сервера? Это уже что-то значит... наверное)

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

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

Тесты

Начал покрывать код тестами. Для тестов выделена новая поддиректория tests/, со своим Makefile. В Makefile корневой директории проекта добавлена новая цель tests, которая собирает исполняемые файлы тестов и запускает их:

$ make tests
make -C tests
./test_parse_url
test_parse_url successfully passed!
./test_open_file
test_open_file successfully passed!

Для начала тестами покрыл наиболее чувствительный "велосипед" - разбор URL. Соответственно, файл tests/test_parse_url.cc тестирует vostok/parse_url.cc. В файле tests/tests.h набросал условный "фреймворк" для тестирования с тремя макросами: TEST_START(name), IS_TRUE(...) и TEST_END(). В результате тест выглядит как-то так:

#include "parse_url.h"
#include <string.h>
#include <iostream>

#include "tests.h"

namespace vostok
{
TEST_START(test_parse_url)
    zs_url_path_t zs_url_path;

    IS_TRUE(parse_url(cut_null("gemini://host"), zs_url_path) == url_ok
            && strcmp(zs_url_path.begin(), "") == 0);

    // <...>

    IS_TRUE(parse_url(cut_null("GeMiNi://host"), zs_url_path) == url_ok 
            && strcmp(zs_url_path.begin(), "") == 0);
TEST_END()
}   // namespace vostok

extern "C" int main(int, char **){ return vostok::test_parse_url(); }

Чувствительность к регистру схемы в URI

Сделан небольшой фикс, который позволяет работать серверу в соответствии с RFC 3986 (Uniform Resource Identifier). В разделе 3.1. Scheme недвусмысленно сказано, что сервера должны воспринимать схему (он же "протокол", а в нашем случае начало строки - "gemini://") в любом регистре:

An implementation should accept uppercase letters as equivalent to lowercase in scheme names (e.g., allow "HTTP" as well as "http") for the sake of robustness but should only produce lowercase scheme names for consistency.

Сказано - сделано. Благо именно этот код был покрыт тестами и вносить изменения в него теперь намного спокойнее.

Редирект на index.gmi

Перечитал документ "Best practices for Gemini implementations" и обнаружил там прямое указание на то, что попытка открытия директории должна перенаправляться на открытие файла "index.gmi", если он присутствует в этой самой директории.

Best practices for Gemini implementations

Following the convention for webservers, if a request is received for a path which maps to a directory in the server's filesystem and a file named index.gmi or index.gemini exists in that directory, it is served up for that path.

Раз такое дело, то решил добавить такую логику в vostok. Попутно код, открывающий файл по пути из URL, вынес в отдельный модуль. А для отдельного модуля уже грех и тесты не написать. В итоге: редирект добавил, новый модуль тестами покрыл.

Спасибо!

Отдельная большая благодарность всем, кто присылает патчи. В частности:

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