dev(UML-981): Добавил обработку неправильных запросов и отключение клиента от pipe.
This commit is contained in:
parent
e6d8fcda5a
commit
b1a44cfef1
@ -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())
|
||||||
|
@ -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;
|
//std::cout << "Answer: " << answer_str << std::endl;
|
||||||
*p_output_stream_ << 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user