Запись дневника разработки yah2g: версия 0.7

Накопилось прилично изменений в main'е, плюс исправил ошибку рендеринга. Время новой версии.

Предыдущая запись дневника разработки yah2g

Усмиряем роботов (продолжение)

Как я писал в предыдущей записи дневника разработки, meta начала активно индексировать Gemini через мой экземпляр прокси. Я добавил robots.txt и... и ничего. Ни через сутки, ни через неделю. Как индексировали, так и продолжают индексировать. В документации нашлась интересная ремарка о том, что их бот может игнорировать robots.txt:

https://developers.facebook.com/docs/sharing/webmasters/web-crawlers/?_fb_noscript=1

Note that the FacebookExternalHit crawler might bypass robots.txt when performing security or integrity checks, such as checking for malware or malicious content.

Раз кравлеры от meta могут игнорировать robots.txt, значит я могу банить их по значению в User-Agent. Хорошо бы когда-нибудь сделать это настройкой.

Проксирование не-gemini файлов

В версии 0.6 не-gemini файлы (которые отдаются "как есть") сначала целиком читались в память, а затем так же целиком отсылались HTTP клиенту. Некрасиво и расточительно. Сделал чтение-запись кусками по 64 килобайта.

Честно говоря, какой-то ощутимой разницы на файлах в десятки мегабайт я не заметил. Но мне так спокойнее.

Использование ThreadingHTTPServer

@vlnst@shitpost.poridge.club, администратор bloat.cat, заметил на своём экземпляре, что сервер довольно просто "завалить" запросами. Начали разбираться: действительно сервер переставал отвечать от нескольких параллельных запросов.

Я с самого начал был уверен, что выбрал базовый класс ThreadingHTTPServer для реализации HTTP сервера. Но, внимательно осмотрев код, выяснилось что это не так. Наследование от нужного базового класса решило проблему.

Исправление рендеринга заголовков без пробела

Буквально сегодня обнаружил проблему неправильного рендеринга заголовков, если после символа # нет пробела. Сверился со спецификацией - все "по стандарту". Значит правим код.

Кстати: по новому алгоритму обработки заголовков (в соответствии со спецификацией Gemini разметки) обрабатываются только заголовки первого, второго и третьего уровней. Заголовок "четвёртого" уровня станет заголовком третьего, а четвертый от начала строки символ # пойдет в текст заголовка.