commit 3585977376d9ec5282122fcf12f3b38e40c9def7 from: Aleksey Ryndin date: Thu Aug 17 14:05:31 2023 UTC Fixes reports/0.0.1.gmi commit - f81007da460fc686a3f17e156bc9202ddf9d8628 commit + 3585977376d9ec5282122fcf12f3b38e40c9def7 blob - 8750fabb0edd9ed2bb18cd373606cd821b950e4a blob + 9ae689ddbea5cf3aeec8bda0f194dde1a87eb259 --- reports/0.0.1.gmi +++ reports/0.0.1.gmi @@ -6,34 +6,30 @@ В целом мне очень понравилось то, что автор называет протокол простым и на самом деле протокол оказался несложным. Хотя и тут стоит отметить, что использование прослойки TLS в качестве транспортного уровня делает эту самую простоту весьма условной. В противовес этому, например, протокол Spartan работает поверх обычного TCP. Наверное, если бы я сейчас сел писать реализацию заново, то выбрал бы spartan. А может быть и до него дойдут когда-нибудь руки. => spartan://spartan.mozz.us The Spartan Protocol Homepage -## Сборка проекта - Что-то в спецификации протокола меня зацепило и я написал свою реализацию сервера Gemini на C++11 - vostok (Восток). Название отсылает к имени советского космического корабля "Восток-1", на котором Юрий Алексеевич Гагарин совершил первый полёт человека в космос. +## Сборка проекта + Итак, собственная реализация сервера Gemini. Язык выбран C++, точнее С++11. Причина выбора языка и его редакции - моя личная "вкусовщина". Целевая платформа: Unix-like, без привязки к какой-то конкретной реализации. Сам собираю-запускаю-проверяю на двух платформах: -* OpenBSD 7: сборка clang'ом с помощью BSD make -* Alpine Linux: сборка g++ с помощью GNU make +* OpenBSD 7.3: сборка clang'ом с помощью BSD make +* Alpine Linux 3.18: сборка g++ с помощью GNU make -Кстати, g++ не входит в базовую систему Alpine Linux, поэтому нужно установить его из одноименного пакета. +Кстати: g++ не входит в базовую систему Alpine Linux, поэтому нужно установить его из одноименного пакета. Единственная внешняя зависимость - libtls, так как я сторонник не городить свои "велосипеды" в области криптографии. libtls это библиотека из состава LibreSSL: => https://www.libressl.org/ LibreSSL На OpenBSD, соответственно, libtls есть "из коробки". А, например, в Alpine Linux требуется установить пакет libressl-dev. -Перед запуском серверу нужен ключ и сертификат, который можно сгенерировать в под-директории cert/ командой openssl: +Для запуска серверу нужен ключ и сертификат, которые можно сгенерировать в под-директории cert/ командой openssl: ``` $ mkdir cert $ openssl req -newkey rsa:4096 -nodes -keyout cert/server.key -x509 -days 36500 -out cert/server.crt ``` -После этого всё готово к тому, что бы собрать-запустить сервер командой "make run_server". +После этого всё готово к тому, что бы собрать-запустить сервер командой "make run_server". Если при сборке и запуске не произойдёт ошибок, то на экране появится строка, обозначающая, что сервер готов принимать входящие запросы: ``` $ make run_server -``` -Если при сборке-запуске не произойдёт ошибок, то на экране появится строка, обозначающая что сервер готов принимать входящие запросы: -``` -$ make run_server make -C vostok c++ -Wall -Wextra -std=c++11 -I../shared transport.cc error.cc gemini.cc args.cc parse_url.cc vostok.cc -ltls -o vostok ./vostok/vostok -c cert/server.crt -k cert/server.key -f ./ @@ -42,13 +38,13 @@ c++ -Wall -Wextra -std=c++11 -I../shared transport.cc ## Возможности сервера -Первая версия сервера vostok обладает весьма скромными возможностями. Это сервер, который который отдает содержимое статических файлов с файловой системы. Все файлы отдаются с пустой строкой META, что подразумевает содержимое в формате "text/gemini; charset=utf-8". +Первая версия сервера vostok обладает весьма скромными возможностями. Это сервер, который отдает содержимое статических файлов с файловой системы. Все файлы отдаются с пустой строкой META, что подразумевает содержимое в формате "text/gemini; charset=utf-8". -Запущенный исполняемый файл принимает следующие параметры командной строки: +Запускаемый исполняемый файл принимает следующие параметры командной строки: * -a ADDR: IPv4 адрес интерфейса, на котором сервер будет слушать входящие соединения. Значение по умолчанию - "127.0.0.1". * -p PORT: номер порта, на котором сервер будет слушать входящие соединения. Значение по умолчанию - "1965". * -c FILE: путь к файлу сертификата. -* -k FILE: путь к ключу файла сертификата. +* -k FILE: путь к файлу ключа сертификата. * -f PATH: путь к директории на файловой системе, откуда будут отдаваться файлы. На моем OpenBSD сервере я оформил демон запуска следующим образом: @@ -71,12 +67,12 @@ rc_cmd $1 ## Gemini клиент -Изначально я планировал проект vostok, как пару: сервер статики и собственный клиент (простой браузер). Но потом я понял, что лично для меня утилиты openssl в паре с less вполне хватает, что бы смотреть Gemini страницы. Что бы отобразить Gemini содержимое пользуюсь примерно такой командной строкой: +Изначально я планировал проект vostok, как пару: сервер статики и собственный клиент (простой браузер). Но потом я понял, что лично для меня утилиты openssl в паре с less вполне хватает, что бы смотреть Gemini страницы. Что бы отобразить Gemini содержимое я пользуюсь примерно такой командной строкой: ``` openssl s_client -crlf -quiet -connect -no_ssl3 -no_tls1 -no_tls1_1 -connect localhost:1965 <<< "gemini://vostok.any-key.press/reports/0.0.1.gmi" | less ``` -Если вам хочется более функциональный браузер, то я я рекомендую присмотреться к консольному amfora. +Если вам хочется более функциональный браузер, то я рекомендую присмотреться к консольному amfora. => https://github.com/makew0rld/amfora Браузеры для Gemini с графическим пользовательским интерфейсом я никогда не пробовал, поэтому посоветовать ничего не могу.