diff options
| author | Rutger Broekhoff | 2026-08-29 14:36:36 +0200 |
|---|---|---|
| committer | Rutger Broekhoff | 2026-08-29 14:36:36 +0200 |
| commit | 999d77a9bcfa90f002b0107ea5fc7e6abc51dd9c (patch) | |
| tree | 15f2154ba28139ab87602bcb53f1451e5b8bfd6b /server/src | |
| parent | 783ec01cbe2007c2ccf723635166c08f6d26abee (diff) | |
| download | routemon-999d77a9bcfa90f002b0107ea5fc7e6abc51dd9c.tar.gz routemon-999d77a9bcfa90f002b0107ea5fc7e6abc51dd9c.zip | |
Deployment preparations
Diffstat (limited to 'server/src')
| -rw-r--r-- | server/src/config.cpp | 3 | ||||
| -rw-r--r-- | server/src/config.cppm | 2 | ||||
| -rw-r--r-- | server/src/http_server.cppm | 43 | ||||
| -rw-r--r-- | server/src/main.cpp | 5 | ||||
| -rw-r--r-- | server/src/srv.cpp | 10 | ||||
| -rw-r--r-- | server/src/srv.cppm | 6 |
6 files changed, 43 insertions, 26 deletions
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( | |||
| 182 | [](object_reader& r) -> http_server | 182 | [](object_reader& r) -> http_server |
| 183 | { | 183 | { |
| 184 | return { | 184 | return { |
| 185 | .lax_cors = r.expect_at<bool>("lax_cors"), | 185 | .allow_origins = |
| 186 | r.expect_at<std::vector<std::string>>("allow_origins"), | ||
| 186 | }; | 187 | }; |
| 187 | }); | 188 | }); |
| 188 | } | 189 | } |
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 | |||
| 23 | 23 | ||
| 24 | export struct http_server | 24 | export struct http_server |
| 25 | { | 25 | { |
| 26 | bool lax_cors; | 26 | std::vector<std::string> allow_origins; |
| 27 | }; | 27 | }; |
| 28 | 28 | ||
| 29 | export struct logger | 29 | 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; | |||
| 15 | import std; | 15 | import std; |
| 16 | import :config; | 16 | import :config; |
| 17 | import :trace; | 17 | import :trace; |
| 18 | export import :http.common; | 18 | import :http.common; |
| 19 | import :problem; | 19 | import :problem; |
| 20 | 20 | ||
| 21 | namespace net = boost::asio; | 21 | namespace net = boost::asio; |
| @@ -157,14 +157,33 @@ using middleware_t = | |||
| 157 | ->net::awaitable<presponse>>; | 157 | ->net::awaitable<presponse>>; |
| 158 | 158 | ||
| 159 | template <class Ctx> | 159 | template <class Ctx> |
| 160 | auto lax_cors_middleware( | 160 | auto id_middleware( |
| 161 | Ctx ctx, bhttp::request_header<bhttp::fields>& req_hdr, | 161 | Ctx ctx, bhttp::request_header<bhttp::fields>&, next_handler_t<Ctx> next) |
| 162 | next_handler_t<Ctx> next) -> net::awaitable<presponse> | 162 | -> net::awaitable<presponse> |
| 163 | { | 163 | { |
| 164 | std::ignore = req_hdr; | 164 | co_return co_await next(std::move(ctx)); |
| 165 | auto prersp = co_await next(ctx); | 165 | } |
| 166 | prersp.header().set(bhttp::field::access_control_allow_origin, "*"); | 166 | |
| 167 | co_return std::move(prersp); | 167 | template <class Ctx> |
| 168 | auto cors_middleware(std::vector<std::string> const& allow_origins) | ||
| 169 | -> middleware_t<Ctx, Ctx> | ||
| 170 | { | ||
| 171 | if (allow_origins.empty()) | ||
| 172 | return id_middleware<Ctx>; | ||
| 173 | |||
| 174 | auto header_str = allow_origins | ||
| 175 | | std::views::join_with(std::string_view{", "}) | ||
| 176 | | std::ranges::to<std::string>(); | ||
| 177 | |||
| 178 | return [header_str = std::move(header_str)]( | ||
| 179 | Ctx ctx, bhttp::request_header<bhttp::fields>& req_hdr, | ||
| 180 | next_handler_t<Ctx> next) -> net::awaitable<presponse> | ||
| 181 | { | ||
| 182 | std::ignore = req_hdr; | ||
| 183 | auto prersp = co_await next(ctx); | ||
| 184 | prersp.header().set(bhttp::field::access_control_allow_origin, header_str); | ||
| 185 | co_return std::move(prersp); | ||
| 186 | }; | ||
| 168 | } | 187 | } |
| 169 | 188 | ||
| 170 | template <class InnerCtx> | 189 | template <class InnerCtx> |
| @@ -310,14 +329,6 @@ auto default_options_handler( | |||
| 310 | auto global_options_handler(base_ctx const& ctx, readable_request r) | 329 | auto global_options_handler(base_ctx const& ctx, readable_request r) |
| 311 | -> net::awaitable<presponse>; | 330 | -> net::awaitable<presponse>; |
| 312 | 331 | ||
| 313 | template <class Ctx> | ||
| 314 | auto id_middleware( | ||
| 315 | Ctx ctx, bhttp::request_header<bhttp::fields>&, next_handler_t<Ctx> next) | ||
| 316 | -> net::awaitable<presponse> | ||
| 317 | { | ||
| 318 | co_return co_await next(std::move(ctx)); | ||
| 319 | } | ||
| 320 | |||
| 321 | template <class A, class B, class C> | 332 | template <class A, class B, class C> |
| 322 | auto middleware_compose(middleware_t<A, B> ab, middleware_t<B, C> bc) | 333 | auto middleware_compose(middleware_t<A, B> ab, middleware_t<B, C> bc) |
| 323 | -> middleware_t<A, C> | 334 | -> middleware_t<A, C> |
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<char const*> args) -> exit_status | |||
| 105 | l.info("Loading situations finished in {}", dur_load); | 105 | l.info("Loading situations finished in {}", dur_load); |
| 106 | 106 | ||
| 107 | auto handler = routemon::api::handler{l, std::move(pub)}; | 107 | auto handler = routemon::api::handler{l, std::move(pub)}; |
| 108 | auto http_server = | 108 | auto http_server = routemon::srv::server{ |
| 109 | routemon::srv::server{l, std::move(lsel), std::move(handler)}; | 109 | l, config.http_server, std::move(lsel), std::move(handler) |
| 110 | }; | ||
| 110 | http_server.spawn(ioc); | 111 | http_server.spawn(ioc); |
| 111 | ioc.run(); | 112 | ioc.run(); |
| 112 | 113 | ||
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<http::routed_ctx<outer_ctx>> | |||
| 232 | }); | 232 | }); |
| 233 | } | 233 | } |
| 234 | 234 | ||
| 235 | auto server::make_global_middleware() | 235 | auto server::make_global_middleware(config::http_server const& cfg) |
| 236 | -> http::middleware_t<http::base_ctx, handler::outer_ctx> | 236 | -> http::middleware_t<http::base_ctx, handler::outer_ctx> |
| 237 | { | 237 | { |
| 238 | return http::middleware_compose< | 238 | return http::middleware_compose< |
| 239 | http::base_ctx, http::trace_id_ctx<http::base_ctx>, | 239 | http::base_ctx, http::trace_id_ctx<http::base_ctx>, |
| 240 | http::trace_id_ctx<http::base_ctx> | 240 | http::trace_id_ctx<http::base_ctx> |
| 241 | >(http::trace_id_middleware<http::base_ctx>, | 241 | >(http::trace_id_middleware<http::base_ctx>, |
| 242 | http::lax_cors_middleware<http::trace_id_ctx<http::base_ctx>>); | 242 | http::cors_middleware<http::trace_id_ctx<http::base_ctx>>( |
| 243 | cfg.allow_origins)); | ||
| 243 | } | 244 | } |
| 244 | 245 | ||
| 245 | server::server( | 246 | server::server( |
| 246 | log::logger const& l, locale::selector&& lsel, api::handler&& inner) | 247 | log::logger const& l, config::http_server const& cfg, |
| 248 | locale::selector&& lsel, api::handler&& inner) | ||
| 247 | : handler_{std::move(inner)}, | 249 | : handler_{std::move(inner)}, |
| 248 | srv_{ | 250 | srv_{ |
| 249 | l, http::router{ | 251 | l, http::router{ |
| 250 | std::move(lsel), make_global_middleware(), handler_.make_routes() | 252 | std::move(lsel), make_global_middleware(cfg), handler_.make_routes() |
| 251 | } | 253 | } |
| 252 | } | 254 | } |
| 253 | { | 255 | { |
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 | |||
| 35 | handler handler_; | 35 | handler handler_; |
| 36 | http::server srv_; | 36 | http::server srv_; |
| 37 | 37 | ||
| 38 | static auto make_global_middleware() | 38 | static auto make_global_middleware(config::http_server const& cfg) |
| 39 | -> http::middleware_t<http::base_ctx, handler::outer_ctx>; | 39 | -> http::middleware_t<http::base_ctx, handler::outer_ctx>; |
| 40 | 40 | ||
| 41 | public: | 41 | public: |
| 42 | server(log::logger const& l, locale::selector&& lsel, api::handler&& inner); | 42 | server( |
| 43 | log::logger const& l, config::http_server const& cfg, | ||
| 44 | locale::selector&& lsel, api::handler&& inner); | ||
| 43 | 45 | ||
| 44 | auto spawn(net::io_context& ioc) -> void; | 46 | auto spawn(net::io_context& ioc) -> void; |
| 45 | }; | 47 | }; |