-- Leo's gemini proxy
-- Connecting to any-key.press:1965...
-- Connected
-- Sending request
-- Meta line: 20 text/gemini
Ого, энтузиазма хватила на вторую версию сервера? Это уже что-то значит... наверное)
Что нового в версии 0.0.2:
открытие директории перенаправляется на открытие файла index.gmi в этой диреткории;
в URL запроса схема (протокол) теперь регистро независимы;
код начал покрываться тестами.
Начал покрывать код тестами. Для тестов выделена новая поддиректория 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", если он присутствует в этой самой директории.
> 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, вынес в отдельный модуль. А для отдельного модуля уже грех и тесты не написать. В итоге: редирект добавил, новый модуль тестами покрыл.
Отдельная большая благодарность всем, кто присылает патчи. В частности:
la-ninpre <aaoth () aaoth ! xyz>, Makefile: compile files separately
-- Response ended
-- Page fetched on Mon May 20 11:25:39 2024