summaryrefslogtreecommitdiffstats
path: root/server/src/http_server.cppm
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/http_server.cppm')
-rw-r--r--server/src/http_server.cppm66
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
167struct base_ctx
168{
169 std::locale locale;
170 trace::id trace_id;
171};
172
173template <class Ctx>
174using 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
167template <class Ctx> 180template <class Ctx>
168auto cors_middleware(std::vector<std::string> const& allow_origins) 181auto 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
189template <class InnerCtx> 202template <class Ctx>
190struct trace_id_ctx : InnerCtx
191{
192 trace::id trace_id = {};
193};
194
195template <class OuterCtx>
196auto trace_id_middleware( 203auto 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
210struct base_ctx
211{
212 std::locale locale;
213};
214
215template <class Ctx>
216using 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
222struct keep_alive 217struct 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
747public: 750public:
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
761class server 765class server