OpenRGB/dependencies/hueplusplus-1.1.0/src/BaseHttpHandler.cpp
2024-08-05 19:57:51 +00:00

126 lines
4.7 KiB
C++

/**
\file BaseHttpHandler.cpp
Copyright Notice\n
Copyright (C) 2020 Jan Rogall - developer\n
Copyright (C) 2020 Moritz Wirger - developer\n
This file is part of hueplusplus.
hueplusplus is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
hueplusplus is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with hueplusplus. If not, see <http://www.gnu.org/licenses/>.
**/
#include "hueplusplus/BaseHttpHandler.h"
#include "hueplusplus/HueExceptionMacro.h"
namespace hueplusplus
{
std::string BaseHttpHandler::sendGetHTTPBody(const std::string& msg, const std::string& adr, int port) const
{
std::string response = send(msg, adr, port);
size_t start = response.find("\r\n\r\n");
if (start == std::string::npos)
{
std::cerr << "BaseHttpHandler: Failed to find body in response\n";
std::cerr << "Request:\n";
std::cerr << "\"" << msg << "\"\n";
std::cerr << "Response:\n";
std::cerr << "\"" << response << "\"\n";
throw HueException(CURRENT_FILE_INFO, "Failed to find body in response");
}
response.erase(0, start + 4);
return response;
}
std::string BaseHttpHandler::sendHTTPRequest(const std::string& method, const std::string& uri,
const std::string& contentType, const std::string& body, const std::string& adr, int port) const
{
std::string request;
// Protocol reference:
// https://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html Request-Line
request.append(method); // Method
request.append(" "); // Separation
request.append(uri); // Request-URI
request.append(" "); // Separation
request.append("HTTP/1.0"); // HTTP-Version
request.append("\r\n"); // Ending
// Entities
if (!contentType.empty())
{
request.append("Content-Type:"); // entity-header
request.append(" "); // Separation
request.append(contentType); // media-type
request.append("\r\n"); // Entity ending
}
if (!body.empty())
{
request.append("Content-Length:"); // entity-header
request.append(" "); // Separation
request.append(std::to_string(body.size())); // length
request.append("\r\n\r\n"); // Entity ending & Request-Line ending
}
request.append(body); // message-body
request.append("\r\n\r\n"); // Ending
return sendGetHTTPBody(request.c_str(), adr, port);
}
std::string BaseHttpHandler::GETString(const std::string& uri, const std::string& contentType, const std::string& body,
const std::string& adr, int port) const
{
return sendHTTPRequest("GET", uri, contentType, body, adr, port);
}
std::string BaseHttpHandler::POSTString(const std::string& uri, const std::string& contentType, const std::string& body,
const std::string& adr, int port) const
{
return sendHTTPRequest("POST", uri, contentType, body, adr, port);
}
std::string BaseHttpHandler::PUTString(const std::string& uri, const std::string& contentType, const std::string& body,
const std::string& adr, int port) const
{
return sendHTTPRequest("PUT", uri, contentType, body, adr, port);
}
std::string BaseHttpHandler::DELETEString(const std::string& uri, const std::string& contentType,
const std::string& body, const std::string& adr, int port) const
{
return sendHTTPRequest("DELETE", uri, contentType, body, adr, port);
}
nlohmann::json BaseHttpHandler::GETJson(
const std::string& uri, const nlohmann::json& body, const std::string& adr, int port) const
{
return nlohmann::json::parse(GETString(uri, "application/json", body.dump(), adr, port));
}
nlohmann::json BaseHttpHandler::POSTJson(
const std::string& uri, const nlohmann::json& body, const std::string& adr, int port) const
{
return nlohmann::json::parse(POSTString(uri, "application/json", body.dump(), adr, port));
}
nlohmann::json BaseHttpHandler::PUTJson(
const std::string& uri, const nlohmann::json& body, const std::string& adr, int port) const
{
return nlohmann::json::parse(PUTString(uri, "application/json", body.dump(), adr, port));
}
nlohmann::json BaseHttpHandler::DELETEJson(
const std::string& uri, const nlohmann::json& body, const std::string& adr, int port) const
{
return nlohmann::json::parse(DELETEString(uri, "application/json", body.dump(), adr, port));
}
} // namespace hueplusplus