dev(UML-981): Добавил обработку неправильных запросов и отключение клиента от pipe.
This commit is contained in:
parent
e6d8fcda5a
commit
b1a44cfef1
@ -1,6 +1,7 @@
|
||||
#include "json_rpc_handler.hpp"
|
||||
#include <vector>
|
||||
#include <cstdint>
|
||||
#include <iostream>
|
||||
|
||||
using json = nlohmann::json;
|
||||
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)
|
||||
{
|
||||
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;
|
||||
|
||||
if (j_in.is_null())
|
||||
|
@ -46,17 +46,36 @@ void ProfinetPipes::listen_pipe(ProfinetIface * p_profinet)
|
||||
std::string answer_str;
|
||||
std::getline( *p_input_stream_.get(), request_str);
|
||||
//std::cout << "Request: " << request_str << std::endl;
|
||||
json_rpc_handler(request_str, answer_str, p_profinet);
|
||||
//std::cout << "Answer: " << answer_str << std::endl;
|
||||
*p_output_stream_ << answer_str << std::endl;
|
||||
if (json_rpc_handler(request_str, answer_str, p_profinet))
|
||||
{
|
||||
//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 ){
|
||||
auto answer_str = ex.what();
|
||||
std::cout << "Answer: " << answer_str << std::endl;
|
||||
*p_output_stream_ << answer_str << std::endl;
|
||||
listen_thread_stop_.store(true, std::memory_order_relaxed);
|
||||
std::cout << answer_str << std::endl;
|
||||
//*p_output_stream_ << answer_str << std::endl;
|
||||
throw std::runtime_error("listen_pipe: Critical Error!");
|
||||
//listen_thread_stop_.store(true, std::memory_order_relaxed);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user