#include <so_5/all.hpp>
#include <random>
struct handle_request
{
};
struct timeout_elapsed
{
std::chrono::milliseconds m_pause;
};
void processing_thread_func(const so_5::mchain_t& req_ch)
{
std::random_device rd;
std::mt19937 generator{rd()};
std::uniform_int_distribution<> pause_generator{350, 3500};
auto delayed_ch = so_5::create_mchain(req_ch->environment());
bool stop = false;
select(
so_5::from_all().handle_all()
.on_close([&stop](const auto &) { stop = true; })
.stop_on([&stop]{ return stop; }),
so_5::receive_case(req_ch,
[&](const handle_request& cmd) {
const std::chrono::milliseconds pause{pause_generator(generator)};
so_5::send_delayed<timeout_elapsed>(delayed_ch,
pause,
cmd.m_req,
pause);
}),
so_5::receive_case(delayed_ch,
[](const timeout_elapsed& cmd) {
cmd.m_req->create_response()
.set_body("Hello, World! (pause:"
+ std::to_string(cmd.m_pause.count())
+ "ms)")
.done();
})
);
}
int main()
{
so_5::wrapped_env_t sobj;
std::thread processing_thread;
auto processing_thread_joiner = so_5::auto_join(processing_thread);
auto req_ch = so_5::create_mchain(sobj);
auto ch_closer = so_5::auto_close_drop_content(req_ch);
processing_thread = std::thread{
processing_thread_func, req_ch
};
{
};
.port(8080)
.address("localhost")
.request_handler([req_ch](auto req) {
"/" == req->header().path())
{
so_5::send<handle_request>(req_ch, req);
return restinio::request_accepted();
}
else
})
.cleanup_func([&] {
so_5::close_drop_content(so_5::terminate_if_throws, req_ch);
}));
return 0;
}
Include all core header files in one.
std::shared_ptr< request_t > request_handle_t
An alias for handle for incoming request without additional extra-data.
run_on_this_thread_settings_t< Traits > on_this_thread()
A special marker for the case when http_server must be run on the context of the current thread.
void run(asio_ns::io_context &ioctx, run_on_this_thread_settings_t< Traits > &&settings)
Helper function for running http server until ctrl+c is hit.
constexpr request_handling_status_t request_rejected() noexcept
ostream_logger_t< std::mutex > shared_ostream_logger_t