From 964a5983b774c2e64807e81202102646d49e6571 Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Wed, 13 Nov 2024 10:59:39 -0400 Subject: [PATCH] Implement an enterprise hook for the server (#24) Signed-off-by: Juan Cruz Viotti --- src/enterprise/enterprise_server.h | 17 +++++++++++++++++ src/enterprise/server.cmake | 3 +++ src/server/server.cc | 28 ++++++++++++++++++---------- 3 files changed, 38 insertions(+), 10 deletions(-) create mode 100644 src/enterprise/enterprise_server.h diff --git a/src/enterprise/enterprise_server.h b/src/enterprise/enterprise_server.h new file mode 100644 index 0000000..f2cdbad --- /dev/null +++ b/src/enterprise/enterprise_server.h @@ -0,0 +1,17 @@ +#ifndef SOURCEMETA_REGISTRY_ENTERPRISE_SERVER_H_ +#define SOURCEMETA_REGISTRY_ENTERPRISE_SERVER_H_ + +#include + +namespace sourcemeta::registry::enterprise { + +auto attach(sourcemeta::hydra::http::Server &server) -> void { + server.route(sourcemeta::hydra::http::Method::GET, "/*", ::on_request); + server.route(sourcemeta::hydra::http::Method::HEAD, "/*", ::on_request); + server.otherwise(::on_otherwise); + server.error(sourcemeta::registry::on_error); +} + +} // namespace sourcemeta::registry::enterprise + +#endif diff --git a/src/enterprise/server.cmake b/src/enterprise/server.cmake index c4461a5..004295b 100644 --- a/src/enterprise/server.cmake +++ b/src/enterprise/server.cmake @@ -1 +1,4 @@ target_compile_definitions(schema_registry_server PRIVATE SOURCEMETA_REGISTRY_ENTERPRISE) +cmake_path(GET CMAKE_CURRENT_LIST_FILE PARENT_PATH ENTERPRISE_SOURCE_DIR) +target_sources(schema_registry_server PRIVATE "${ENTERPRISE_SOURCE_DIR}/enterprise_server.h") +target_include_directories(schema_registry_server PRIVATE "${ENTERPRISE_SOURCE_DIR}") diff --git a/src/server/server.cc b/src/server/server.cc index a5dace0..f42b4f6 100644 --- a/src/server/server.cc +++ b/src/server/server.cc @@ -31,6 +31,17 @@ static auto resolver(std::string_view identifier) SERVER_BASE_URL, *(__global_data) / "schemas", identifier); } +static auto on_request(const sourcemeta::hydra::http::ServerLogger &logger, + const sourcemeta::hydra::http::ServerRequest &request, + sourcemeta::hydra::http::ServerResponse &response) + -> void { + static const auto SERVER_BASE_URL{configuration().at("url").to_string()}; + return sourcemeta::registry::on_request( + sourcemeta::registry::request_path_to_schema_uri(SERVER_BASE_URL, + request.path()), + resolver, logger, request, response); +} + static auto on_otherwise(const sourcemeta::hydra::http::ServerLogger &logger, const sourcemeta::hydra::http::ServerRequest &request, sourcemeta::hydra::http::ServerResponse &response) @@ -43,16 +54,9 @@ static auto on_otherwise(const sourcemeta::hydra::http::ServerLogger &logger, response); } -static auto on_request(const sourcemeta::hydra::http::ServerLogger &logger, - const sourcemeta::hydra::http::ServerRequest &request, - sourcemeta::hydra::http::ServerResponse &response) - -> void { - static const auto SERVER_BASE_URL{configuration().at("url").to_string()}; - return sourcemeta::registry::on_request( - sourcemeta::registry::request_path_to_schema_uri(SERVER_BASE_URL, - request.path()), - resolver, logger, request, response); -} +#ifdef SOURCEMETA_REGISTRY_ENTERPRISE +#include "enterprise_server.h" +#endif // We try to keep this function as straight to point as possible // with minimal input validation (outside debug builds). The intention @@ -77,10 +81,14 @@ auto main(int argc, char *argv[]) noexcept -> int { __global_data = std::make_unique(argv[1]); sourcemeta::hydra::http::Server server; +#ifdef SOURCEMETA_REGISTRY_ENTERPRISE + sourcemeta::registry::enterprise::attach(server); +#else server.route(sourcemeta::hydra::http::Method::GET, "/*", on_request); server.route(sourcemeta::hydra::http::Method::HEAD, "/*", on_request); server.otherwise(on_otherwise); server.error(sourcemeta::registry::on_error); +#endif assert(configuration().defines("port")); assert(configuration().at("port").is_integer());