#include <so_5/all.hpp>
#include <random>
struct handle_request
{
};
struct timeout_elapsed
{
std::chrono::milliseconds m_pause;
};
void processing_thread_func(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()
.on_close([&stop](const auto &) { stop = true; })
.stop_on([&stop]{ return stop; }),
case_(req_ch,
[&](handle_request cmd) {
const std::chrono::milliseconds pause{pause_generator(generator)};
so_5::send_delayed<timeout_elapsed>(delayed_ch,
pause,
cmd.m_req,
pause);
}),
case_(delayed_ch,
[](timeout_elapsed cmd) {
cmd.m_req->create_response()
.set_body("Hello, World! (pause:"
+ "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
};
{
};
restinio::on_this_thread<traits_t>()
.port(8080)
.address("localhost")
.request_handler([req_ch](auto req) {
if(restinio::http_method_get() == req->header().method() &&
"/" == req->header().path())
{
so_5::send<handle_request>(req_ch, req);
}
else
})
.cleanup_func([&] {
so_5::close_drop_content(req_ch);
}));
return 0;
}