From 999d77a9bcfa90f002b0107ea5fc7e6abc51dd9c Mon Sep 17 00:00:00 2001 From: Rutger Broekhoff Date: Sat, 29 Aug 2026 14:36:36 +0200 Subject: Deployment preparations --- server/src/config.cpp | 3 ++- server/src/config.cppm | 2 +- server/src/http_server.cppm | 43 +++++++++++++++++++++++++++---------------- server/src/main.cpp | 5 +++-- server/src/srv.cpp | 10 ++++++---- server/src/srv.cppm | 6 ++++-- 6 files changed, 43 insertions(+), 26 deletions(-) (limited to 'server/src') diff --git a/server/src/config.cpp b/server/src/config.cpp index 5c1a161..200b873 100644 --- a/server/src/config.cpp +++ b/server/src/config.cpp @@ -182,7 +182,8 @@ auto tag_invoke( [](object_reader& r) -> http_server { return { - .lax_cors = r.expect_at("lax_cors"), + .allow_origins = + r.expect_at>("allow_origins"), }; }); } diff --git a/server/src/config.cppm b/server/src/config.cppm index 358a961..ab9b137 100644 --- a/server/src/config.cppm +++ b/server/src/config.cppm @@ -23,7 +23,7 @@ export struct database export struct http_server { - bool lax_cors; + std::vector allow_origins; }; export struct logger diff --git a/server/src/http_server.cppm b/server/src/http_server.cppm index dc8c183..b16f3a8 100644 --- a/server/src/http_server.cppm +++ b/server/src/http_server.cppm @@ -15,7 +15,7 @@ export module routemon:http.server; import std; import :config; import :trace; -export import :http.common; +import :http.common; import :problem; namespace net = boost::asio; @@ -157,14 +157,33 @@ using middleware_t = ->net::awaitable>; template -auto lax_cors_middleware( - Ctx ctx, bhttp::request_header& req_hdr, - next_handler_t next) -> net::awaitable +auto id_middleware( + Ctx ctx, bhttp::request_header&, next_handler_t next) + -> net::awaitable { - std::ignore = req_hdr; - auto prersp = co_await next(ctx); - prersp.header().set(bhttp::field::access_control_allow_origin, "*"); - co_return std::move(prersp); + co_return co_await next(std::move(ctx)); +} + +template +auto cors_middleware(std::vector const& allow_origins) + -> middleware_t +{ + if (allow_origins.empty()) + return id_middleware; + + auto header_str = allow_origins + | std::views::join_with(std::string_view{", "}) + | std::ranges::to(); + + return [header_str = std::move(header_str)]( + Ctx ctx, bhttp::request_header& req_hdr, + next_handler_t next) -> net::awaitable + { + std::ignore = req_hdr; + auto prersp = co_await next(ctx); + prersp.header().set(bhttp::field::access_control_allow_origin, header_str); + co_return std::move(prersp); + }; } template @@ -310,14 +329,6 @@ auto default_options_handler( auto global_options_handler(base_ctx const& ctx, readable_request r) -> net::awaitable; -template -auto id_middleware( - Ctx ctx, bhttp::request_header&, next_handler_t next) - -> net::awaitable -{ - co_return co_await next(std::move(ctx)); -} - template auto middleware_compose(middleware_t ab, middleware_t bc) -> middleware_t diff --git a/server/src/main.cpp b/server/src/main.cpp index d5fcd42..b0a9938 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -105,8 +105,9 @@ auto real_main(std::span args) -> exit_status l.info("Loading situations finished in {}", dur_load); auto handler = routemon::api::handler{l, std::move(pub)}; - auto http_server = - routemon::srv::server{l, std::move(lsel), std::move(handler)}; + auto http_server = routemon::srv::server{ + l, config.http_server, std::move(lsel), std::move(handler) + }; http_server.spawn(ioc); ioc.run(); diff --git a/server/src/srv.cpp b/server/src/srv.cpp index 00a2bb8..b70f05c 100644 --- a/server/src/srv.cpp +++ b/server/src/srv.cpp @@ -232,22 +232,24 @@ auto handler::make_routes() -> http::route_tree> }); } -auto server::make_global_middleware() +auto server::make_global_middleware(config::http_server const& cfg) -> http::middleware_t { return http::middleware_compose< http::base_ctx, http::trace_id_ctx, http::trace_id_ctx >(http::trace_id_middleware, - http::lax_cors_middleware>); + http::cors_middleware>( + cfg.allow_origins)); } server::server( - log::logger const& l, locale::selector&& lsel, api::handler&& inner) + log::logger const& l, config::http_server const& cfg, + locale::selector&& lsel, api::handler&& inner) : handler_{std::move(inner)}, srv_{ l, http::router{ - std::move(lsel), make_global_middleware(), handler_.make_routes() + std::move(lsel), make_global_middleware(cfg), handler_.make_routes() } } { diff --git a/server/src/srv.cppm b/server/src/srv.cppm index 1d082fb..063617e 100644 --- a/server/src/srv.cppm +++ b/server/src/srv.cppm @@ -35,11 +35,13 @@ export class server handler handler_; http::server srv_; - static auto make_global_middleware() + static auto make_global_middleware(config::http_server const& cfg) -> http::middleware_t; public: - server(log::logger const& l, locale::selector&& lsel, api::handler&& inner); + server( + log::logger const& l, config::http_server const& cfg, + locale::selector&& lsel, api::handler&& inner); auto spawn(net::io_context& ioc) -> void; }; -- cgit v1.3