LINUX.ORG.RU

RESTinio-0.5.0. Обновление встраиваемого в C++ приложения HTTP/WebSockets сервера

 , , ,


0

1

RESTinio — это небольшая C++14 библиотека, которая позволяет встраивать HTTP/WebSockets сервер в C++ приложения. В своей реализации использует http-parser (из nodejs) и Asio (как standalone, так и Boost-овский вариант). В последний раз мы о RESTinio рассказывали здесь.

Со времени последнего анонса в RESTinio было исправлено несколько ошибок и было добавлено несколько новых фич. В частности, в версии 0.5.0 добавлена возможность работы RESTinio с кастомизированными версиями библиотеки http-parser. Это позволяет реализовать обработку в RESTinio нестандартных HTTP-методов.

Допустим, что следует написать REST-сервис, который должен реагировать на нестандартные методы ENCODE и DECODE. Для этого потребуется:

  • сделать форк http-parser, в котором реализуется распознавание методов ENCODE и DECODE (в результате чего в кастомизированном http-parser появляются значения HTTP_ENCODE и HTTP_DECODE);
  • определить в своем коде две константы типа restinio::http_method_id_t:
    constexpr const restinio::http_method_id_t http_encode{HTTP_ENCODE, "ENCODE"};
    constexpr const restinio::http_method_id_t http_decode{HTTP_DECODE, "DECODE"};
    
  • определить собственный тип, внутри которого должен быть единственный статический метод from_nodejs следующего вида:
    struct my_http_mehods_mapping {
    	inline static constexpr restinio::http_method_id_t
    	from_nodejs(int method_code) noexcept {
    		switch(method_code) {
    			case HTTP_ENCODE: return http_encode;
    			case HTTP_DECODE: return http_decode;
    			default: return restinio::default_http_methods_t::from_nodejs(method_code);
    		}
    	}
    };
    
  • указать имя собственного типа с методом from_nodejs в свойствах HTTP-сервера:
    struct my_server_traits : public restinio::default_traits_t {
    	using http_methods_mapper_t = my_http_methods_mapping;
    };
    

После этого можно будет использовать константы http_encode и http_decode при работе с RESTinio, например:

auto make_request_handler() {
	auto router = std::make_unique< restinio::router::express_router_t<> >();

	router->add_handler(http_encode, "/data", [](auto req, auto params) {...});
	router->add_handler(http_decode, "/data", [](auto req, auto params) {...});
	...
	return router;
}

Примечание. Для реализации этой функциональности из RESTinio был удален тип http_method_t, а вместо него введен тип http_method_id_t. Если в вашем коде использовался http_method_t, то при обновлении на v.0.5.0 вам придется внести изменения в свой код.

Также в версии 0.5.0 был удален ряд вещей, которые были помечены как «deprecated» в предыдущих версиях RESTinio.

Сам RESTinio живет на BitBucket-е с зеркалом на GitHub.

Документацию можно найти здесь, а здесь находится сгенерированный Doxygen-ом справочник по API.

В общем-то, в последнее время в RESTinio попадает то, о чем просят пользователи. Так что если вы хотите увидеть что-то в RESTinio, то дайте нам знать.

★★★★★

Ответ на: комментарий от xpahos

А почему выбран nodejs парсер?

ХЗ, это было 2.5 года назад, сейчас уже всего не вспомнить. Но про picohttp мы узнали уже спустя несколько месяцев после того, как у нас был работающий прототип.

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

На этом фоне не суть важно насколько picohttp опережает http-parser.

К тому же http-parser один из самых широкоиспользуемых и отлаженных парсеров.

eao197 ★★★★★ ()

RESTinio-0.5.1

На днях RESTinio обновился еще раз. Нововведения:

  • можно слушать состояния подключений и реагировать, например, на отключение клиента;
  • можно назначить IP-blocker, проверять адреса входящих подключений и блокировать нежелательные подключения;
  • еще один вариант restinio::run и вспомогательный класс on_pool_runner_t для упрощения работы с RESTinio в случаях, когда нужно использовать именно объект http_server_t.

На этом работы над RESTinio на ближайшее время приостанавливаются до накопления следующего пула хотелок. Но если кто-то столкнется с проблемами при использовании RESTinio, то дайте нам знать (на GitHub-е или BitBucket-е), мы постараемся исправить как только, так сразу.

eao197 ★★★★★ ()
Последнее исправление: eao197 (всего исправлений: 1)

Версия 0.6.0

RESTinio обновился до версии 0.6.0.

Изменений немного, но все-таки:

  • изменился API для connection state listener-ов. Из-за этого RESTinio 0.6 не совместима с 0.5, в тех местах, где используются connection state listener-ы потребуется поправить свой код;
  • зато connection state listener теперь может получить доступ к параметрам TLS-подключений;
  • в коде начал использоваться атрибут [[nodiscard]], если компилятор этот атрибут поддерживает. Пока всего в нескольких местах, но по мере развития RESTinio этот атрибут будет использоваться все чаще;
  • добавлен макрос RESTINIO_VERSION (и несколько сопутствующих ему макросов);
  • обновлены зависимости: Asio 1.14.0 (Asio 1.12 так же поддерживается), optional-lite 3.2.0, variant-lite 1.2.2. Добавлена поддержка fmtlib-6.0.0, но сам RESTinio пока использует fmtlib-5.3.0.

Взять RESTinio-0.6.0 можно с GitHub-а. Или через плюсовые менеджеры зависимостей Conan и vcpkg.

Дальнейшая разработка RESTinio будет вестись на GitHub-е, старые Hg-репозитории оставлены просто для истории.

eao197 ★★★★★ ()