Skip to content

Commit 0d59a6e

Browse files
etrclaude
andcommitted
refactor(dr-014): slim webserver_impl to a composition root
With all seven behavior services extracted, remove the now-dead webserver_impl forwarders. The MHD-adapter trampolines that stayed (connection_notify / policy_callback / request_completed) now call impl_->hooks_dispatch_ directly instead of the fire_* forwarders. Removed: - hook_phase_dispatch.cpp (11 fire_* forwarders), webserver_hook_firing.cpp (4 gated fire_*_gated forwarders), webserver_response_queue.cpp (materialize_and_queue_response forwarder) — deleted entirely. - The 404/405/500 forwarders from webserver_error_pages.cpp (which now holds only the log_dispatch_error forwarder, still used by the v1 alias hooks) and all the corresponding declarations from the fragment header. webserver_impl now holds only: the 5 state collaborators, the 7 behavior services, the parent back-pointer + digest_opaque_ + SNI cache, the thin lookup_v2 / has_hooks_for / phase_hook_count / invalidate_route_cache forwarders (test + trampoline seams), and the static MHD trampolines. No request-processing logic remains on it. 113/113 tests pass; cpplint/complexity/file-size gates green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 00eaf55 commit 0d59a6e

8 files changed

Lines changed: 28 additions & 457 deletions

src/Makefile.am

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ lib_LTLIBRARIES = libhttpserver.la
2525
# builds. The WS-off branch in websocket_handler.cpp provides stub
2626
# definitions (every member throws feature_unavailable except is_valid()
2727
# which returns false).
28-
libhttpserver_la_SOURCES = string_utilities.cpp webserver.cpp webserver_add_hook.cpp http_utils.cpp file_info.cpp http_request.cpp http_request_auth.cpp http_response.cpp http_response_factories.cpp http_resource.cpp create_webserver.cpp create_test_request.cpp websocket_handler.cpp hook_handle.cpp peer_address.cpp resource_hook_table.cpp cookie.cpp detail/http_endpoint.cpp detail/body.cpp detail/ip_representation.cpp detail/ip_access_control.cpp detail/ws_registry.cpp detail/hook_bus.cpp detail/route_table.cpp detail/daemon_lifecycle.cpp detail/dispatch_util.cpp detail/error_pages.cpp detail/hook_dispatcher.cpp detail/http_request_impl.cpp detail/http_request_impl_args.cpp detail/http_request_impl_tls.cpp detail/request_dispatcher.cpp detail/request_pipeline.cpp detail/response_materializer.cpp detail/upload_pipeline.cpp detail/websocket_upgrader.cpp detail/webserver_lifecycle.cpp detail/webserver_register.cpp detail/webserver_routes.cpp detail/webserver_routes_upsert.cpp detail/webserver_callbacks.cpp detail/webserver_callbacks_lifecycle.cpp detail/webserver_dispatch.cpp detail/webserver_request.cpp detail/webserver_response_queue.cpp detail/webserver_body_pipeline.cpp detail/webserver_error_pages.cpp detail/webserver_aliases.cpp detail/webserver_hook_firing.cpp detail/hook_phase_dispatch.cpp
28+
libhttpserver_la_SOURCES = string_utilities.cpp webserver.cpp webserver_add_hook.cpp http_utils.cpp file_info.cpp http_request.cpp http_request_auth.cpp http_response.cpp http_response_factories.cpp http_resource.cpp create_webserver.cpp create_test_request.cpp websocket_handler.cpp hook_handle.cpp peer_address.cpp resource_hook_table.cpp cookie.cpp detail/http_endpoint.cpp detail/body.cpp detail/ip_representation.cpp detail/ip_access_control.cpp detail/ws_registry.cpp detail/hook_bus.cpp detail/route_table.cpp detail/daemon_lifecycle.cpp detail/dispatch_util.cpp detail/error_pages.cpp detail/hook_dispatcher.cpp detail/http_request_impl.cpp detail/http_request_impl_args.cpp detail/http_request_impl_tls.cpp detail/request_dispatcher.cpp detail/request_pipeline.cpp detail/response_materializer.cpp detail/upload_pipeline.cpp detail/websocket_upgrader.cpp detail/webserver_lifecycle.cpp detail/webserver_register.cpp detail/webserver_routes.cpp detail/webserver_routes_upsert.cpp detail/webserver_callbacks.cpp detail/webserver_callbacks_lifecycle.cpp detail/webserver_dispatch.cpp detail/webserver_request.cpp detail/webserver_body_pipeline.cpp detail/webserver_error_pages.cpp detail/webserver_aliases.cpp
2929
# noinst_HEADERS: shipped in the tarball but NEVER installed under $prefix/include.
3030
# Detail headers (httpserver/detail/*.hpp) live here so they cannot leak to
3131
# downstream consumers — the public surface comes in through <httpserver.hpp>.

src/detail/hook_phase_dispatch.cpp

Lines changed: 0 additions & 100 deletions
This file was deleted.

src/detail/webserver_callbacks.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ void webserver_impl::request_completed(void *cls, struct MHD_Connection *connect
110110
// answer_to_connection never ran (e.g., very early MHD failures),
111111
// mr->ws may be null; skip the fire site in that degenerate case.
112112
if (mr->ws != nullptr && mr->ws->impl_ != nullptr) {
113-
mr->ws->impl_->fire_request_completed_gated(mr, toe);
113+
mr->ws->impl_->hooks_dispatch_.fire_request_completed_gated(mr, toe);
114114
}
115115
}
116116

src/detail/webserver_callbacks_lifecycle.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ void webserver_impl::connection_notify(void* cls, struct MHD_Connection* connect
181181
// registered: a single relaxed atomic load + branch.
182182
if (hooks_armed(::httpserver::hook_phase::connection_opened)) {
183183
::httpserver::connection_open_ctx ctx{resolve_peer()};
184-
ws_impl->fire_connection_opened(ctx);
184+
ws_impl->hooks_dispatch_.fire_connection_opened(ctx);
185185
}
186186
break;
187187
}
@@ -192,7 +192,7 @@ void webserver_impl::connection_notify(void* cls, struct MHD_Connection* connect
192192
// ordering choice is safe regardless and pins the contract.
193193
if (hooks_armed(::httpserver::hook_phase::connection_closed)) {
194194
::httpserver::connection_close_ctx ctx{resolve_peer()};
195-
ws_impl->fire_connection_closed(ctx);
195+
ws_impl->hooks_dispatch_.fire_connection_closed(ctx);
196196
}
197197
// MHD ordering guarantee: NOTIFY_COMPLETED fires before
198198
// NOTIFY_CLOSED for the same connection. By the time we reach
@@ -238,7 +238,7 @@ MHD_Result webserver_impl::policy_callback(void *cls, const struct sockaddr* add
238238
if (is_phase_armed(impl, ::httpserver::hook_phase::accept_decision)) {
239239
::httpserver::accept_ctx ctx{
240240
make_peer_address(addr), accepted, reason};
241-
impl->fire_accept_decision(ctx);
241+
impl->hooks_dispatch_.fire_accept_decision(ctx);
242242
}
243243

244244
return decision;

src/detail/webserver_error_pages.cpp

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,47 +18,25 @@
1818
USA
1919
*/
2020

21-
// Thin webserver_impl forwarders into the error_pages behavior service
22-
// and the log_dispatch_error free function (DR-014 §4.11). The real logic
23-
// moved to detail/error_pages.cpp and detail/dispatch_util.cpp. These
24-
// forwarders keep the existing in-class call sites
25-
// (not_found_page(mr) / log_dispatch_error(msg) / ...) compiling
26-
// unchanged during the migration; they are removed once every caller is
27-
// itself a service holding error_pages& / the config bag directly.
21+
// The 404/405/500 synthesis moved to the error_pages behavior service
22+
// (detail/error_pages.cpp, DR-014 §4.11) and their webserver_impl forwarders
23+
// were removed once every caller became a service holding error_pages&
24+
// directly. Only the log_dispatch_error forwarder remains: it is still called
25+
// via impl_ptr->log_dispatch_error(...) from the v1 alias hooks in
26+
// webserver_aliases.cpp, so the thin member survives (delegating to the
27+
// detail::log_dispatch_error free function over the config bag).
2828

2929
#include "httpserver/webserver.hpp"
3030
#include "httpserver/detail/webserver_impl.hpp"
3131

3232
#include <string_view>
3333

3434
#include "httpserver/create_webserver.hpp"
35-
#include "httpserver/http_response.hpp"
3635
#include "httpserver/detail/dispatch_util.hpp"
3736

3837
namespace httpserver {
3938
namespace detail {
4039

41-
http_response webserver_impl::not_found_page(detail::modded_request* mr) const {
42-
return errors_.not_found_page(mr);
43-
}
44-
45-
http_response webserver_impl::method_not_allowed_page(
46-
detail::modded_request* mr) const {
47-
return errors_.method_not_allowed_page(mr);
48-
}
49-
50-
http_response webserver_impl::internal_error_page(detail::modded_request* mr,
51-
std::string_view msg,
52-
bool force_our) const {
53-
return errors_.internal_error_page(mr, msg, force_our);
54-
}
55-
56-
http_response webserver_impl::run_internal_error_handler_safely(
57-
detail::modded_request* mr,
58-
std::string_view msg) const {
59-
return errors_.run_internal_error_handler_safely(mr, msg);
60-
}
61-
6240
void webserver_impl::log_dispatch_error(std::string_view msg) const noexcept {
6341
detail::log_dispatch_error(parent->config, msg);
6442
}

src/detail/webserver_hook_firing.cpp

Lines changed: 0 additions & 61 deletions
This file was deleted.

src/detail/webserver_response_queue.cpp

Lines changed: 0 additions & 45 deletions
This file was deleted.

0 commit comments

Comments
 (0)