💾 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
⬅️ Previous capture (2023-09-08)
-=-=-=-=-=-=-
Ого, энтузиазма хватила на вторую версию сервера? Это уже что-то значит... наверное)
Предыдущая запись блога разработки
Что нового в версии 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(); }
Сделан небольшой фикс, который позволяет работать серверу в соответствии с 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.
Сказано - сделано. Благо именно этот код был покрыт тестами и вносить изменения в него теперь намного спокойнее.
Перечитал документ "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, вынес в отдельный модуль. А для отдельного модуля уже грех и тесты не написать. В итоге: редирект добавил, новый модуль тестами покрыл.
Отдельная большая благодарность всем, кто присылает патчи. В частности: