-- Leo's gemini proxy

-- Connecting to any-key.press:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini

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


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


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


Что нового в версии 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(); }

Чувствительность к регистру схемы в 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, вынес в отдельный модуль. А для отдельного модуля уже грех и тесты не написать. В итоге: редирект добавил, новый модуль тестами покрыл.


Спасибо!


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

la-ninpre <aaoth () aaoth ! xyz>, Makefile: compile files separately


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

-- Response ended

-- Page fetched on Mon May 20 11:25:39 2024