У нас очередной релиз. Наша легковесная C++14 библиотека для встраивания асинхронного HTTP/WebSocket сервера в C++ приложения, RESTinio, обновилась до версии 0.4.8. Изменений не так много, но среди них можно выделить одно весьма важное: нотификаторы для операций записи.
Почему нотификаторы важны? Потому что когда фреймворк для вашего же удобства скрывает от вас всю механику операций ввода-вывода, то вы не знаете, когда именно часть вашего ответа клиенту будет записана в сокет. А это знание может потребоваться, если вы отсылаете большой ответ порциями и вам нужно выстроить эти порции в очередь, чтобы отправлять следующую порцию лишь после того, как уйдет предыдущая. Ну вот, скажем, нужно вам отдать 500MiB порциями по 5MiB, как вам это сделать? Отдать RESTinio все эти 500MiB сразу и пускай RESTinio с ними сам разбирается? А что, если вам нужно отдавать по 500MiB не одному клиенту, а сотне клиентов, или тысяче клиентов?
Вот тут-то нотификаторы и будут полезны. Вы пишете очередную порцию в response, затем вызываете flush() и передаете во flush() нотификатор. RESTinio запишет ваши данные и дернет ваш нотификатор когда запись закончится (положительно или отрицательно). И в этом нотификаторе вы сможете инициировать запись следующей порции.
Минималистичный пример использования нотификаторов:
#include <restinio/all.hpp>
#include <iostream>
int main()
{
restinio::run(
restinio::on_this_thread<>()
.port(8080)
.address("localhost")
.request_handler([](auto req) {
return req->create_response()
.set_body("Hello, World!")
.done( /* Notificator goes here */
[](const auto & ec ){
std::cout << "Sending response status: " << ec << std::endl;
});
}));
return 0;
}
|
Более актуальный пример можно найти в репозитории RESTinio.
В общем, не стесняемся, берем, пробуем, пользуемся, делимся впечатлениями. Любая конструктивная критика, соображения и предложения всячески приветствуются. Так же приветствуются лайки, плюсадынки и решары :) Кому не лень, можно плюсануть соответствующую тему на Reddit-е.