#include <so_5/all.hpp>
#include <random>
#if !defined(SO_5_VERSION) || SO_5_VERSION < SO_5_VERSION_MAKE(6ull, 0ull, 0ull)
decltype(auto) from_all()
{
return so_5::from_all();
}
#else
decltype(auto) from_all()
{
return so_5::from_all().handle_all();
}
#endif
#if !defined(SO_5_VERSION) || SO_5_VERSION < SO_5_VERSION_MAKE(7ull, 0ull, 0ull)
template< typename Handler >
decltype(auto) read_case( so_5::mchain_t chain, Handler && handler )
{
return so_5::case_(
std::move(chain), std::forward<Handler>(handler) );
}
#else
template< typename Handler >
decltype(auto) read_case( so_5::mchain_t chain, Handler && handler )
{
return so_5::receive_case(
std::move(chain), std::forward<Handler>(handler) );
}
#endif
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(
from_all()
.on_close([&stop](const auto &) { stop = true; })
.stop_on([&stop]{ return stop; }),
read_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);
}),
read_case(delayed_ch,
[](const 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);
return restinio::request_accepted();
}
else
})
.cleanup_func([&] {
so_5::close_drop_content(req_ch);
}));
return 0;
}
std::basic_string< CharT, Traits > to_string(basic_string_view< CharT, Traits > v)
RESTINIO_NODISCARD constexpr request_handling_status_t request_rejected() noexcept
ostream_logger_t< std::mutex > shared_ostream_logger_t
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.
std::shared_ptr< request_t > request_handle_t
An alias for handle for incoming request without additional extra-data.