89 lines
2.5 KiB
C++
89 lines
2.5 KiB
C++
#include "common/OidcHttp.h"
|
|
|
|
#include <drogon/HttpClient.h>
|
|
|
|
#include <stdexcept>
|
|
|
|
namespace visione::oidc
|
|
{
|
|
namespace
|
|
{
|
|
HttpResponseData sendGet(const std::string &url,
|
|
const std::map<std::string, std::string> &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<int>(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<std::string, std::string> &headers,
|
|
double timeoutSeconds)
|
|
{
|
|
return sendGet(url, headers, timeoutSeconds);
|
|
}
|
|
|
|
HttpResponseData httpPostForm(const std::string &url,
|
|
const std::map<std::string, std::string> ¶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<int>(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<Json::CharReader> 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
|