diff options
| author | Rutger Broekhoff | 2026-09-10 01:30:43 +0200 |
|---|---|---|
| committer | Rutger Broekhoff | 2026-09-10 01:30:43 +0200 |
| commit | 4031e77edd2abd694114be698312d086bce6b425 (patch) | |
| tree | 85f13a278339841cacc81314170b59c97587fa27 /server/src/http_server.cppm | |
| parent | 1417e6cf41d27c594d2bdc92f87746d2383a1b1d (diff) | |
| download | routemon-4031e77edd2abd694114be698312d086bce6b425.tar.gz routemon-4031e77edd2abd694114be698312d086bce6b425.zip | |
More tracing stuff
Diffstat (limited to 'server/src/http_server.cppm')
| -rw-r--r-- | server/src/http_server.cppm | 66 |
1 files changed, 35 insertions, 31 deletions
diff --git a/server/src/http_server.cppm b/server/src/http_server.cppm index b16f3a8..12c83db 100644 --- a/server/src/http_server.cppm +++ b/server/src/http_server.cppm | |||
| @@ -164,6 +164,19 @@ auto id_middleware( | |||
| 164 | co_return co_await next(std::move(ctx)); | 164 | co_return co_await next(std::move(ctx)); |
| 165 | } | 165 | } |
| 166 | 166 | ||
| 167 | struct base_ctx | ||
| 168 | { | ||
| 169 | std::locale locale; | ||
| 170 | trace::id trace_id; | ||
| 171 | }; | ||
| 172 | |||
| 173 | template <class Ctx> | ||
| 174 | using basic_route_handler_fn_t = | ||
| 175 | std::function<auto( | ||
| 176 | Ctx, readable_request, | ||
| 177 | std::vector<std::string> const& matches) | ||
| 178 | ->net::awaitable<presponse>>; | ||
| 179 | |||
| 167 | template <class Ctx> | 180 | template <class Ctx> |
| 168 | auto cors_middleware(std::vector<std::string> const& allow_origins) | 181 | auto cors_middleware(std::vector<std::string> const& allow_origins) |
| 169 | -> middleware_t<Ctx, Ctx> | 182 | -> middleware_t<Ctx, Ctx> |
| @@ -186,39 +199,21 @@ auto cors_middleware(std::vector<std::string> const& allow_origins) | |||
| 186 | }; | 199 | }; |
| 187 | } | 200 | } |
| 188 | 201 | ||
| 189 | template <class InnerCtx> | 202 | template <class Ctx> |
| 190 | struct trace_id_ctx : InnerCtx | ||
| 191 | { | ||
| 192 | trace::id trace_id = {}; | ||
| 193 | }; | ||
| 194 | |||
| 195 | template <class OuterCtx> | ||
| 196 | auto trace_id_middleware( | 203 | auto trace_id_middleware( |
| 197 | OuterCtx ctx0, bhttp::request_header<bhttp::fields>& req_hdr, | 204 | Ctx ctx, bhttp::request_header<bhttp::fields>& req_hdr, |
| 198 | next_handler_t<trace_id_ctx<OuterCtx>> next) -> net::awaitable<presponse> | 205 | next_handler_t<Ctx> next) -> net::awaitable<presponse> |
| 199 | { | 206 | { |
| 200 | std::ignore = req_hdr; | 207 | std::ignore = req_hdr; |
| 201 | auto ctx = trace_id_ctx{std::move(ctx0)}; | ||
| 202 | auto prersp = co_await next(std::move(ctx)); | 208 | auto prersp = co_await next(std::move(ctx)); |
| 203 | prersp.header().set( | 209 | prersp.header().set( |
| 204 | "X-Routemon-Trace-Id", std::string_view{ctx.trace_id.as_string()}); | 210 | "X-Routemon-Trace-Id", |
| 211 | std::string_view{static_cast<base_ctx const&>(ctx).trace_id.as_string()}); | ||
| 205 | prersp.header().insert( | 212 | prersp.header().insert( |
| 206 | bhttp::field::access_control_expose_headers, "X-Routemon-Trace-Id"); | 213 | bhttp::field::access_control_expose_headers, "X-Routemon-Trace-Id"); |
| 207 | co_return std::move(prersp); | 214 | co_return std::move(prersp); |
| 208 | } | 215 | } |
| 209 | 216 | ||
| 210 | struct base_ctx | ||
| 211 | { | ||
| 212 | std::locale locale; | ||
| 213 | }; | ||
| 214 | |||
| 215 | template <class Ctx> | ||
| 216 | using basic_route_handler_fn_t = | ||
| 217 | std::function<auto( | ||
| 218 | Ctx, readable_request, | ||
| 219 | std::vector<std::string> const& matches) | ||
| 220 | ->net::awaitable<presponse>>; | ||
| 221 | |||
| 222 | struct keep_alive | 217 | struct keep_alive |
| 223 | { | 218 | { |
| 224 | bool value; | 219 | bool value; |
| @@ -555,7 +550,7 @@ class router | |||
| 555 | struct impl_base | 550 | struct impl_base |
| 556 | { | 551 | { |
| 557 | virtual ~impl_base() = default; | 552 | virtual ~impl_base() = default; |
| 558 | virtual auto handle_request(readable_request r) const | 553 | virtual auto handle_request(trace::id trace_id, readable_request r) const |
| 559 | -> net::awaitable<presponse> = 0; | 554 | -> net::awaitable<presponse> = 0; |
| 560 | }; | 555 | }; |
| 561 | 556 | ||
| @@ -564,16 +559,17 @@ class router | |||
| 564 | template <std::derived_from<base_ctx> PreRouteCtx> | 559 | template <std::derived_from<base_ctx> PreRouteCtx> |
| 565 | class impl : public impl_base | 560 | class impl : public impl_base |
| 566 | { | 561 | { |
| 562 | log::logger l_; | ||
| 567 | locale::selector lsel_; | 563 | locale::selector lsel_; |
| 568 | middleware_t<base_ctx, PreRouteCtx> global_middleware_; | 564 | middleware_t<base_ctx, PreRouteCtx> global_middleware_; |
| 569 | route_tree<routed_ctx<PreRouteCtx>> routes_; | 565 | route_tree<routed_ctx<PreRouteCtx>> routes_; |
| 570 | 566 | ||
| 571 | public: | 567 | public: |
| 572 | explicit impl( | 568 | explicit impl( |
| 573 | locale::selector&& lsel, | 569 | log::logger const& l, locale::selector&& lsel, |
| 574 | middleware_t<base_ctx, PreRouteCtx> global_middleware, | 570 | middleware_t<base_ctx, PreRouteCtx> global_middleware, |
| 575 | route_tree<routed_ctx<PreRouteCtx>> routes) | 571 | route_tree<routed_ctx<PreRouteCtx>> routes) |
| 576 | : lsel_{std::move(lsel)}, | 572 | : l_{l.sub("router")}, lsel_{std::move(lsel)}, |
| 577 | global_middleware_{std::move(global_middleware)}, | 573 | global_middleware_{std::move(global_middleware)}, |
| 578 | routes_{std::move(routes)} | 574 | routes_{std::move(routes)} |
| 579 | { | 575 | { |
| @@ -674,6 +670,13 @@ class router | |||
| 674 | co_return problem_rsp(ctx, problem, keep_alive{false}); | 670 | co_return problem_rsp(ctx, problem, keep_alive{false}); |
| 675 | } | 671 | } |
| 676 | 672 | ||
| 673 | l_.with( | ||
| 674 | "trace_id", | ||
| 675 | static_cast<base_ctx const&>(ctx).trace_id.as_string()) | ||
| 676 | .debug( | ||
| 677 | "Request targets {} {}", req_base.method_string(), | ||
| 678 | req_url.path()); | ||
| 679 | |||
| 677 | auto mres = match(req_url.segments()); | 680 | auto mres = match(req_url.segments()); |
| 678 | if (!mres) | 681 | if (!mres) |
| 679 | { | 682 | { |
| @@ -732,13 +735,13 @@ class router | |||
| 732 | } | 735 | } |
| 733 | } | 736 | } |
| 734 | 737 | ||
| 735 | auto handle_request(readable_request r) const | 738 | auto handle_request(trace::id trace_id, readable_request r) const |
| 736 | -> net::awaitable<presponse> override | 739 | -> net::awaitable<presponse> override |
| 737 | { | 740 | { |
| 738 | auto header = r.p->get().base(); | 741 | auto header = r.p->get().base(); |
| 739 | auto locale = lsel_.select(header[bhttp::field::accept_language]); | 742 | auto locale = lsel_.select(header[bhttp::field::accept_language]); |
| 740 | co_return co_await global_middleware_( | 743 | co_return co_await global_middleware_( |
| 741 | base_ctx{.locale = locale}, header, | 744 | base_ctx{.locale = locale, .trace_id = trace_id}, header, |
| 742 | [&](PreRouteCtx ctx) -> net::awaitable<presponse> | 745 | [&](PreRouteCtx ctx) -> net::awaitable<presponse> |
| 743 | { co_return co_await route_request(std::move(ctx), std::move(r)); }); | 746 | { co_return co_await route_request(std::move(ctx), std::move(r)); }); |
| 744 | } | 747 | } |
| @@ -747,15 +750,16 @@ class router | |||
| 747 | public: | 750 | public: |
| 748 | template <std::derived_from<base_ctx> PreRouteCtx> | 751 | template <std::derived_from<base_ctx> PreRouteCtx> |
| 749 | explicit router( | 752 | explicit router( |
| 750 | locale::selector&& lsel, | 753 | log::logger const& l, locale::selector&& lsel, |
| 751 | middleware_t<base_ctx, PreRouteCtx> global_middleware, | 754 | middleware_t<base_ctx, PreRouteCtx> global_middleware, |
| 752 | route_tree<routed_ctx<PreRouteCtx>> routes) | 755 | route_tree<routed_ctx<PreRouteCtx>> routes) |
| 753 | : impl_{std::make_unique<impl<PreRouteCtx>>( | 756 | : impl_{std::make_unique<impl<PreRouteCtx>>( |
| 754 | std::move(lsel), std::move(global_middleware), std::move(routes))} | 757 | l, std::move(lsel), std::move(global_middleware), std::move(routes))} |
| 755 | { | 758 | { |
| 756 | } | 759 | } |
| 757 | 760 | ||
| 758 | auto handle_request(readable_request r) const -> net::awaitable<presponse>; | 761 | auto handle_request(trace::id trace_id, readable_request r) const |
| 762 | -> net::awaitable<presponse>; | ||
| 759 | }; | 763 | }; |
| 760 | 764 | ||
| 761 | class server | 765 | class server |