dev(UML-981): Добавил обработку неправильных запросов и отключение клиента от pipe.

This commit is contained in:
Vadim Sychev 2022-08-18 11:28:55 +03:00
parent e6d8fcda5a
commit b1a44cfef1
2 changed files with 41 additions and 8 deletions

View File

@ -1,6 +1,7 @@
#include "json_rpc_handler.hpp" #include "json_rpc_handler.hpp"
#include <vector> #include <vector>
#include <cstdint> #include <cstdint>
#include <iostream>
using json = nlohmann::json; using json = nlohmann::json;
using string = std::string; using string = std::string;
@ -164,7 +165,20 @@ static bool json_readSubmoduleParameter(json& j_in, json& j_out, ProfinetIface *
bool json_rpc_handler(std::string& input, std::string& output, ProfinetIface * p_profinet) bool json_rpc_handler(std::string& input, std::string& output, ProfinetIface * p_profinet)
{ {
json j_in = json::parse(input); json j_in;
// Может прийти неправильная строка
try
{
/// Парсим строку
j_in = json::parse(input);
}
catch(const std::exception& e)
{
std::cerr << e.what() << '\n';
return false;
}
json j_out; json j_out;
if (j_in.is_null()) if (j_in.is_null())

View File

@ -46,17 +46,36 @@ void ProfinetPipes::listen_pipe(ProfinetIface * p_profinet)
std::string answer_str; std::string answer_str;
std::getline( *p_input_stream_.get(), request_str); std::getline( *p_input_stream_.get(), request_str);
//std::cout << "Request: " << request_str << std::endl; //std::cout << "Request: " << request_str << std::endl;
json_rpc_handler(request_str, answer_str, p_profinet); if (json_rpc_handler(request_str, answer_str, p_profinet))
//std::cout << "Answer: " << answer_str << std::endl; {
*p_output_stream_ << answer_str << std::endl; //std::cout << "Answer: " << answer_str << std::endl;
*p_output_stream_ << answer_str << std::endl;
}
else
{
if (!request_str.empty())
{
std::cout << "Wrong request: " << request_str << std::endl;
}
else
{
/**
* @brief При отключении стороннего приложения от приемного fifo, в старом линуксе постоянно приходят пустые строки.
* Нужно решить что в этом случае делать.
* В новом линуксе вызывается исключение и прога закрывается.
*/
throw std::runtime_error("listen_pipe: Profinet client was disconnected from profinet server output pipe, application closing...");
}
}
} }
} }
catch ( const std::exception &ex ){ catch ( const std::exception &ex ){
auto answer_str = ex.what(); auto answer_str = ex.what();
std::cout << "Answer: " << answer_str << std::endl; std::cout << answer_str << std::endl;
*p_output_stream_ << answer_str << std::endl; //*p_output_stream_ << answer_str << std::endl;
listen_thread_stop_.store(true, std::memory_order_relaxed); throw std::runtime_error("listen_pipe: Critical Error!");
//listen_thread_stop_.store(true, std::memory_order_relaxed);
} }
} }