diff options
Diffstat (limited to 'server/src/http_server.cppm')
| -rw-r--r-- | server/src/http_server.cppm | 43 |
1 files changed, 27 insertions, 16 deletions
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> |