blob: 5cbf31007cc946affd29946e965164dbfb65c7a8 [file] [log] [blame]
#include "tlbmc/redfish/request.h"
#include <string>
#include <string_view>
#include <utility>
#include "absl/status/statusor.h"
#include "absl/strings/match.h"
#include "absl/strings/string_view.h"
#include "redfish_v1.pb.h"
#include "g3/macros.h"
#include "tlbmc/redfish/query_parameters.h"
namespace milotic_tlbmc {
RedfishRequest::RedfishRequest(const ::redfish::v1::Request& request,
boost::beast::http::verb method) {
request_.target(TrimTlbmcPrefix(request.url()));
request_.method(method);
if (!request.json_str().empty()) {
request_.body() = request.json_str();
} else if (request.has_octet_stream()) {
request_.body() = request.octet_stream();
}
for (const auto& [key, value] : request.headers()) {
request_.base().insert(key, value);
};
}
absl::StatusOr<RedfishRequest> RedfishRequest::Create(
boost::beast::http::request<boost::beast::http::string_body>&& request) {
RedfishRequest redfish_request(std::move(request));
redfish_request.SetTlbmcOnly(HasTlbmcPrefix(redfish_request.Target()));
// Trim tlbmc prefix before doing anything else
boost::urls::url target(TrimTlbmcPrefix(redfish_request.Target()));
// Remove Query Parameters from the target
redfish_request.request_.target(target.encoded_path());
ECCLESIA_ASSIGN_OR_RETURN(redfish_request.query_parameters_,
QueryParameters::Create(target.params()));
return redfish_request;
}
std::string_view RedfishRequest::Target() const { return request_.target(); }
boost::beast::http::verb RedfishRequest::Method() const {
return request_.method();
}
std::string_view RedfishRequest::GetHeaderValue(std::string_view key) const {
return request_[key];
}
std::string_view RedfishRequest::Body() const { return request_.body(); }
std::string_view RedfishRequest::TrimTlbmcPrefix(std::string_view url) {
if (absl::StartsWith(url, kTlbmcPrefix)) {
// Need to preserve the leading '/'
url = url.substr(kTlbmcPrefix.size() - 1);
}
return url;
}
bool RedfishRequest::HasTlbmcPrefix(std::string_view url) {
return absl::StartsWith(url, kTlbmcPrefix);
}
} // namespace milotic_tlbmc