mirror of https://github.com/Icinga/icinga2.git
parent
d1b705613d
commit
85c962a587
|
@ -232,11 +232,12 @@ int PkiUtility::RequestCertificate(const String& host, const String& port, const
|
||||||
|
|
||||||
JsonRpc::SendMessage(stream, request);
|
JsonRpc::SendMessage(stream, request);
|
||||||
|
|
||||||
|
String jsonString;
|
||||||
Dictionary::Ptr response;
|
Dictionary::Ptr response;
|
||||||
StreamReadContext src;
|
StreamReadContext src;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
StreamReadStatus srs = JsonRpc::ReadMessage(stream, &response, src);
|
StreamReadStatus srs = JsonRpc::ReadMessage(stream, &jsonString, src);
|
||||||
|
|
||||||
if (srs == StatusEof)
|
if (srs == StatusEof)
|
||||||
break;
|
break;
|
||||||
|
@ -244,6 +245,8 @@ int PkiUtility::RequestCertificate(const String& host, const String& port, const
|
||||||
if (srs != StatusNewItem)
|
if (srs != StatusNewItem)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
response = JsonRpc::DecodeMessage(jsonString);
|
||||||
|
|
||||||
if (response && response->Contains("error")) {
|
if (response && response->Contains("error")) {
|
||||||
Log(LogCritical, "cli", "Could not fetch valid response. Please check the master log (notice or debug).");
|
Log(LogCritical, "cli", "Could not fetch valid response. Please check the master log (notice or debug).");
|
||||||
#ifdef I2_DEBUG
|
#ifdef I2_DEBUG
|
||||||
|
|
|
@ -34,7 +34,7 @@ void JsonRpc::SendMessage(const Stream::Ptr& stream, const Dictionary::Ptr& mess
|
||||||
NetString::WriteStringToStream(stream, json);
|
NetString::WriteStringToStream(stream, json);
|
||||||
}
|
}
|
||||||
|
|
||||||
StreamReadStatus JsonRpc::ReadMessage(const Stream::Ptr& stream, Dictionary::Ptr *message, StreamReadContext& src, bool may_wait)
|
StreamReadStatus JsonRpc::ReadMessage(const Stream::Ptr& stream, String *message, StreamReadContext& src, bool may_wait)
|
||||||
{
|
{
|
||||||
String jsonString;
|
String jsonString;
|
||||||
StreamReadStatus srs = NetString::ReadStringFromStream(stream, &jsonString, src, may_wait);
|
StreamReadStatus srs = NetString::ReadStringFromStream(stream, &jsonString, src, may_wait);
|
||||||
|
@ -42,15 +42,19 @@ StreamReadStatus JsonRpc::ReadMessage(const Stream::Ptr& stream, Dictionary::Ptr
|
||||||
if (srs != StatusNewItem)
|
if (srs != StatusNewItem)
|
||||||
return srs;
|
return srs;
|
||||||
|
|
||||||
Value value = JsonDecode(jsonString);
|
*message = jsonString;
|
||||||
|
|
||||||
|
return StatusNewItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
Dictionary::Ptr JsonRpc::DecodeMessage(const String& message)
|
||||||
|
{
|
||||||
|
Value value = JsonDecode(message);
|
||||||
|
|
||||||
if (!value.IsObjectType<Dictionary>()) {
|
if (!value.IsObjectType<Dictionary>()) {
|
||||||
BOOST_THROW_EXCEPTION(std::invalid_argument("JSON-RPC"
|
BOOST_THROW_EXCEPTION(std::invalid_argument("JSON-RPC"
|
||||||
" message must be a dictionary."));
|
" message must be a dictionary."));
|
||||||
}
|
}
|
||||||
|
|
||||||
*message = value;
|
return value;
|
||||||
|
|
||||||
return StatusNewItem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,8 @@ class I2_REMOTE_API JsonRpc
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void SendMessage(const Stream::Ptr& stream, const Dictionary::Ptr& message);
|
static void SendMessage(const Stream::Ptr& stream, const Dictionary::Ptr& message);
|
||||||
static StreamReadStatus ReadMessage(const Stream::Ptr& stream, Dictionary::Ptr *message, StreamReadContext& src, bool may_wait = false);
|
static StreamReadStatus ReadMessage(const Stream::Ptr& stream, String *message, StreamReadContext& src, bool may_wait = false);
|
||||||
|
static Dictionary::Ptr DecodeMessage(const String& message);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
JsonRpc(void);
|
JsonRpc(void);
|
||||||
|
|
|
@ -134,8 +134,28 @@ void JsonRpcConnection::Disconnect(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void JsonRpcConnection::MessageHandler(const Dictionary::Ptr& message)
|
void JsonRpcConnection::MessageHandlerWrapper(const String& jsonString)
|
||||||
{
|
{
|
||||||
|
if (m_Stream->IsEof())
|
||||||
|
return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
MessageHandler(jsonString);
|
||||||
|
} catch (const std::exception& ex) {
|
||||||
|
Log(LogWarning, "JsonRpcConnection")
|
||||||
|
<< "Error while reading JSON-RPC message for identity '" << m_Identity
|
||||||
|
<< "': " << DiagnosticInformation(ex);
|
||||||
|
|
||||||
|
Disconnect();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonRpcConnection::MessageHandler(const String& jsonString)
|
||||||
|
{
|
||||||
|
Dictionary::Ptr message = JsonRpc::DecodeMessage(jsonString);
|
||||||
|
|
||||||
m_Seen = Utility::GetTime();
|
m_Seen = Utility::GetTime();
|
||||||
|
|
||||||
if (m_HeartbeatTimeout != 0)
|
if (m_HeartbeatTimeout != 0)
|
||||||
|
@ -193,14 +213,14 @@ void JsonRpcConnection::MessageHandler(const Dictionary::Ptr& message)
|
||||||
|
|
||||||
bool JsonRpcConnection::ProcessMessage(void)
|
bool JsonRpcConnection::ProcessMessage(void)
|
||||||
{
|
{
|
||||||
Dictionary::Ptr message;
|
String message;
|
||||||
|
|
||||||
StreamReadStatus srs = JsonRpc::ReadMessage(m_Stream, &message, m_Context, false);
|
StreamReadStatus srs = JsonRpc::ReadMessage(m_Stream, &message, m_Context, false);
|
||||||
|
|
||||||
if (srs != StatusNewItem)
|
if (srs != StatusNewItem)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
l_JsonRpcConnectionWorkQueues[m_ID % l_JsonRpcConnectionWorkQueueCount].Enqueue(boost::bind(&JsonRpcConnection::MessageHandler, JsonRpcConnection::Ptr(this), message));
|
l_JsonRpcConnectionWorkQueues[m_ID % l_JsonRpcConnectionWorkQueueCount].Enqueue(boost::bind(&JsonRpcConnection::MessageHandlerWrapper, JsonRpcConnection::Ptr(this), message));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,7 +87,8 @@ private:
|
||||||
StreamReadContext m_Context;
|
StreamReadContext m_Context;
|
||||||
|
|
||||||
bool ProcessMessage(void);
|
bool ProcessMessage(void);
|
||||||
void MessageHandler(const Dictionary::Ptr& message);
|
void MessageHandlerWrapper(const String& jsonString);
|
||||||
|
void MessageHandler(const String& jsonString);
|
||||||
void DataAvailableHandler(void);
|
void DataAvailableHandler(void);
|
||||||
|
|
||||||
static void StaticInitialize(void);
|
static void StaticInitialize(void);
|
||||||
|
|
Loading…
Reference in New Issue