#include "common/OidcHttp.h" #include #include namespace visione::oidc { namespace { HttpResponseData sendGet(const std::string &url, const std::map &headers, double timeoutSeconds) { auto client = drogon::HttpClient::newHttpClient(url); auto request = drogon::HttpRequest::newHttpRequest(); request->setMethod(drogon::Get); for (const auto &[key, value] : headers) { request->addHeader(key, value); } const auto [result, response] = client->sendRequest(request, timeoutSeconds); if (result != drogon::ReqResult::Ok || !response) { throw std::runtime_error("http_get_failed"); } HttpResponseData out; out.statusCode = static_cast(response->statusCode()); out.body = response->body(); return out; } } // namespace HttpResponseData httpGet(const std::string &url, double timeoutSeconds) { return sendGet(url, {}, timeoutSeconds); } HttpResponseData httpGet(const std::string &url, const std::map &headers, double timeoutSeconds) { return sendGet(url, headers, timeoutSeconds); } HttpResponseData httpPostForm(const std::string &url, const std::map ¶ms, double timeoutSeconds) { auto client = drogon::HttpClient::newHttpClient(url); auto request = drogon::HttpRequest::newHttpFormPostRequest(); request->setMethod(drogon::Post); for (const auto &[key, value] : params) { request->setBodyParameter(key, value); } const auto [result, response] = client->sendRequest(request, timeoutSeconds); if (result != drogon::ReqResult::Ok || !response) { throw std::runtime_error("http_post_failed"); } HttpResponseData out; out.statusCode = static_cast(response->statusCode()); out.body = response->body(); return out; } Json::Value parseJsonResponse(const HttpResponseData &response) { Json::CharReaderBuilder builder; builder["collectComments"] = false; std::string errors; Json::Value value; std::unique_ptr reader(builder.newCharReader()); if (!reader->parse(response.body.data(), response.body.data() + response.body.size(), &value, &errors)) { throw std::runtime_error("invalid_http_json"); } return value; } } // namespace visione::oidc