From 52b24757c9cab54f70e3db30100a679f83e12f3e Mon Sep 17 00:00:00 2001 From: Thulinma Date: Tue, 10 Jul 2018 09:44:50 +0200 Subject: [PATCH] Added support for JSONP mode and CORS headers to JSON Prometheus output --- src/controller/controller_api.cpp | 2 +- src/controller/controller_statistics.cpp | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/controller/controller_api.cpp b/src/controller/controller_api.cpp index fed43598..7427849d 100644 --- a/src/controller/controller_api.cpp +++ b/src/controller/controller_api.cpp @@ -317,7 +317,7 @@ int Controller::handleAPIConnection(Socket::Connection & conn){ H.Clean(); continue; } - if (H.url == "/"+Controller::prometheus+".json"){ + if (H.url.substr(0, Controller::prometheus.size()+6) == "/"+Controller::prometheus+".json"){ handlePrometheus(H, conn, PROMETHEUS_JSON); H.Clean(); continue; diff --git a/src/controller/controller_statistics.cpp b/src/controller/controller_statistics.cpp index 29785d18..4ea7c903 100644 --- a/src/controller/controller_statistics.cpp +++ b/src/controller/controller_statistics.cpp @@ -1479,12 +1479,16 @@ void Controller::fillTotals(JSON::Value & req, JSON::Value & rep){ } void Controller::handlePrometheus(HTTP::Parser & H, Socket::Connection & conn, int mode){ + std::string jsonp; switch (mode){ case PROMETHEUS_TEXT: H.SetHeader("Content-Type", "text/plain; version=0.0.4"); break; case PROMETHEUS_JSON: H.SetHeader("Content-Type", "text/json"); + H.setCORSHeaders(); + if (H.GetVar("callback") != ""){jsonp = H.GetVar("callback");} + if (H.GetVar("jsonp") != ""){jsonp = H.GetVar("jsonp");} break; } H.SetHeader("Server", "MistServer/" PACKAGE_VERSION); @@ -1805,7 +1809,13 @@ void Controller::handlePrometheus(HTTP::Parser & H, Socket::Connection & conn, i } } + if (jsonp.size()){ + H.Chunkify(jsonp + "(", conn); + } H.Chunkify(resp.toString(), conn); + if (jsonp.size()){ + H.Chunkify(");\n", conn); + } } H.Chunkify("", conn);