From: Aki Tuomi Date: Wed, 23 Aug 2023 13:02:51 +0000 (+0300) Subject: ws-recursor.cc: Split apiServerZoneDetail to GET, PUT, DELETE variants X-Git-Tag: auth-4.9.0-alpha1~42^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3bf2df56d7f81546353e541d17da60c18dfe3c57;p=thirdparty%2Fpdns.git ws-recursor.cc: Split apiServerZoneDetail to GET, PUT, DELETE variants --- diff --git a/pdns/recursordist/ws-recursor.cc b/pdns/recursordist/ws-recursor.cc index 89d86238c2..b1880b6754 100644 --- a/pdns/recursordist/ws-recursor.cc +++ b/pdns/recursordist/ws-recursor.cc @@ -389,40 +389,44 @@ static void apiServerZonesGET(HttpRequest* /* req */, HttpResponse* resp) resp->setJsonBody(doc); } -static void apiServerZoneDetail(HttpRequest* req, HttpResponse* resp) +static inline DNSName findZoneById(HttpRequest* req) { - DNSName zonename = apiZoneIdToName(req->parameters["id"]); - - auto iter = SyncRes::t_sstorage.domainmap->find(zonename); - if (iter == SyncRes::t_sstorage.domainmap->end()) { + auto zonename = apiZoneIdToName(req->parameters["id"]); + if (SyncRes::t_sstorage.domainmap->find(zonename) == SyncRes::t_sstorage.domainmap->end()) { throw ApiException("Could not find domain '" + zonename.toLogString() + "'"); } + return zonename; +} - if (req->method == "PUT") { - Json document = req->json(); +static void apiServerZoneDetailPUT(HttpRequest* req, HttpResponse* resp) +{ + auto zonename = findZoneById(req); + const auto& document = req->json(); - doDeleteZone(zonename); - doCreateZone(document); - reloadZoneConfiguration(g_yamlSettings); - resp->body = ""; - resp->status = 204; // No Content, but indicate success - } - else if (req->method == "DELETE") { - if (!doDeleteZone(zonename)) { - throw ApiException("Deleting domain failed"); - } + doDeleteZone(zonename); + doCreateZone(document); + reloadZoneConfiguration(g_yamlSettings); + resp->body = ""; + resp->status = 204; // No Content, but indicate success +} - reloadZoneConfiguration(g_yamlSettings); - // empty body on success - resp->body = ""; - resp->status = 204; // No Content: declare that the zone is gone now - } - else if (req->method == "GET") { - fillZone(zonename, resp); - } - else { - throw HttpMethodNotAllowedException(); +static void apiServerZoneDetailDELETE(HttpRequest* req, HttpResponse* resp) +{ + auto zonename = findZoneById(req); + if (!doDeleteZone(zonename)) { + throw ApiException("Deleting domain failed"); } + + reloadZoneConfiguration(g_yamlSettings); + // empty body on success + resp->body = ""; + resp->status = 204; // No Content: declare that the zone is gone now +} + +static void apiServerZoneDetailGET(HttpRequest* req, HttpResponse* resp) +{ + auto zonename = findZoneById(req); + fillZone(zonename, resp); } static void apiServerSearchData(HttpRequest* req, HttpResponse* resp) @@ -1318,9 +1322,9 @@ RecursorWebServer::RecursorWebServer(FDMultiplexer* fdm) d_ws->registerApiHandler("/api/v1/servers/localhost/rpzstatistics", apiServerRPZStats, "GET"); d_ws->registerApiHandler("/api/v1/servers/localhost/search-data", apiServerSearchData, "GET"); d_ws->registerApiHandler("/api/v1/servers/localhost/statistics", apiServerStatistics, "GET", true); - d_ws->registerApiHandler("/api/v1/servers/localhost/zones/", apiServerZoneDetail, "GET"); - d_ws->registerApiHandler("/api/v1/servers/localhost/zones/", apiServerZoneDetail, "PUT"); - d_ws->registerApiHandler("/api/v1/servers/localhost/zones/", apiServerZoneDetail, "DELETE"); + d_ws->registerApiHandler("/api/v1/servers/localhost/zones/", apiServerZoneDetailGET, "GET"); + d_ws->registerApiHandler("/api/v1/servers/localhost/zones/", apiServerZoneDetailPUT, "PUT"); + d_ws->registerApiHandler("/api/v1/servers/localhost/zones/", apiServerZoneDetailDELETE, "DELETE"); d_ws->registerApiHandler("/api/v1/servers/localhost/zones", apiServerZonesGET, "GET"); d_ws->registerApiHandler("/api/v1/servers/localhost/zones", apiServerZonesPOST, "POST"); d_ws->registerApiHandler("/api/v1/servers/localhost", apiServerDetail, "GET", true);