mirror of
				https://github.com/Icinga/icinga2.git
				synced 2025-11-04 05:34:12 +01:00 
			
		
		
		
	Boost.Beast changed the signature of the previously used generic `set` method so that it no longer accepts integer types, however there is alreay a more specific method for setting the Content-Length header, so use this one instead.
		
			
				
	
	
		
			81 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
 | 
						|
 | 
						|
#include "remote/httputility.hpp"
 | 
						|
#include "remote/url.hpp"
 | 
						|
#include "base/json.hpp"
 | 
						|
#include "base/logger.hpp"
 | 
						|
#include <map>
 | 
						|
#include <string>
 | 
						|
#include <vector>
 | 
						|
#include <boost/beast/http.hpp>
 | 
						|
 | 
						|
using namespace icinga;
 | 
						|
 | 
						|
Dictionary::Ptr HttpUtility::FetchRequestParameters(const Url::Ptr& url, const std::string& body)
 | 
						|
{
 | 
						|
	Dictionary::Ptr result;
 | 
						|
 | 
						|
	if (!body.empty()) {
 | 
						|
		Log(LogDebug, "HttpUtility")
 | 
						|
			<< "Request body: '" << body << '\'';
 | 
						|
 | 
						|
		result = JsonDecode(body);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!result)
 | 
						|
		result = new Dictionary();
 | 
						|
 | 
						|
	std::map<String, std::vector<String>> query;
 | 
						|
	for (const auto& kv : url->GetQuery()) {
 | 
						|
		query[kv.first].emplace_back(kv.second);
 | 
						|
	}
 | 
						|
 | 
						|
	for (auto& kv : query) {
 | 
						|
		result->Set(kv.first, Array::FromVector(kv.second));
 | 
						|
	}
 | 
						|
 | 
						|
	return result;
 | 
						|
}
 | 
						|
 | 
						|
Value HttpUtility::GetLastParameter(const Dictionary::Ptr& params, const String& key)
 | 
						|
{
 | 
						|
	Value varr = params->Get(key);
 | 
						|
 | 
						|
	if (!varr.IsObjectType<Array>())
 | 
						|
		return varr;
 | 
						|
 | 
						|
	Array::Ptr arr = varr;
 | 
						|
 | 
						|
	if (arr->GetLength() == 0)
 | 
						|
		return Empty;
 | 
						|
	else
 | 
						|
		return arr->Get(arr->GetLength() - 1);
 | 
						|
}
 | 
						|
 | 
						|
void HttpUtility::SendJsonBody(boost::beast::http::response<boost::beast::http::string_body>& response, const Dictionary::Ptr& params, const Value& val)
 | 
						|
{
 | 
						|
	namespace http = boost::beast::http;
 | 
						|
 | 
						|
	response.set(http::field::content_type, "application/json");
 | 
						|
	response.body() = JsonEncode(val, params && GetLastParameter(params, "pretty"));
 | 
						|
	response.content_length(response.body().size());
 | 
						|
}
 | 
						|
 | 
						|
void HttpUtility::SendJsonError(boost::beast::http::response<boost::beast::http::string_body>& response,
 | 
						|
	const Dictionary::Ptr& params, int code, const String& info, const String& diagnosticInformation)
 | 
						|
{
 | 
						|
	Dictionary::Ptr result = new Dictionary({ { "error", code } });
 | 
						|
 | 
						|
	if (!info.IsEmpty()) {
 | 
						|
		result->Set("status", info);
 | 
						|
	}
 | 
						|
 | 
						|
	if (params && HttpUtility::GetLastParameter(params, "verbose") && !diagnosticInformation.IsEmpty()) {
 | 
						|
		result->Set("diagnostic_information", diagnosticInformation);
 | 
						|
	}
 | 
						|
 | 
						|
	response.result(code);
 | 
						|
 | 
						|
	HttpUtility::SendJsonBody(response, params, result);
 | 
						|
}
 |