diff --git a/src/slic3r/Utils/PrintagoServer.cpp b/src/slic3r/Utils/PrintagoServer.cpp index 326d4f962e3..030ad55b7c6 100644 --- a/src/slic3r/Utils/PrintagoServer.cpp +++ b/src/slic3r/Utils/PrintagoServer.cpp @@ -32,21 +32,31 @@ void PrintagoSession::on_accept(beefy::error_code ec) { if (ec) return printago_ws_error(ec, "accept"); - do_read(); } void PrintagoSession::do_read() { ws_.async_read(buffer_, [capture0 = shared_from_this()](auto&& PH1, auto&& PH2) { - capture0->on_read(std::forward(PH1), std::forward(PH2)); + try { + capture0->on_read(std::forward(PH1), std::forward(PH2)); + } catch (std::exception e) { + capture0->ws_.close(websocket::close_code::normal); + wxGetApp().printago_director()->GetServer()->get_session()->set_authorized(false); + wxGetApp().printago_director()->GetServer()->start(); + } }); } void PrintagoSession::on_read(beefy::error_code ec, std::size_t bytes_transferred) { if (ec) { + if (ws_.is_open()) + ws_.close(websocket::close_code::normal); printago_ws_error(ec, "read"); + wxGetApp().printago_director()->GetServer()->get_session()->set_authorized(false); + wxGetApp().printago_director()->GetServer()->start(); + return; } else { ws_.text(ws_.got_text()); const auto msg = beefy::buffers_to_string(buffer_.data()); @@ -55,7 +65,11 @@ void PrintagoSession::on_read(beefy::error_code ec, std::size_t bytes_transferre auto json_msg = nlohmann::json::parse(msg); wxGetApp().printago_director()->ParseCommand(json_msg); } catch (const nlohmann::json::parse_error& e) { - int x = 5 + 1; + ws_.close(websocket::close_code::normal); + printago_ws_error(ec, "parse"); + wxGetApp().printago_director()->GetServer()->get_session()->set_authorized(false); + wxGetApp().printago_director()->GetServer()->start(); + return; } buffer_.consume(buffer_.size()); @@ -63,15 +77,6 @@ void PrintagoSession::on_read(beefy::error_code ec, std::size_t bytes_transferre } } -void PrintagoSession::on_write(beefy::error_code ec, std::size_t bytes_transferred) -{ - if (ec) - return printago_ws_error(ec, "write"); - - buffer_.consume(buffer_.size()); - do_read(); -} - void PrintagoSession::async_send(const std::string& message) { auto messageBuffer = std::make_shared(message); @@ -82,7 +87,11 @@ void PrintagoSession::do_write(std::shared_ptr messageBuffer) { ws_.async_write(net::buffer(*messageBuffer), [self = shared_from_this(), messageBuffer](beefy::error_code ec, std::size_t length) { if (ec) { + if (self->ws_.is_open()) + self->ws_.close(websocket::close_code::normal); printago_ws_error(ec, "write"); + wxGetApp().printago_director()->GetServer()->get_session()->set_authorized(false); + wxGetApp().printago_director()->GetServer()->start(); } }); } @@ -123,23 +132,12 @@ void PrintagoServer::on_accept(beefy::error_code ec, tcp::socket socket) { if (ec) { printago_ws_error(ec, "accept"); - handle_reconnect(); } else { reconnection_delay_ = 1; // Reset delay on successful connection auto session = std::make_shared(std::move(socket)); set_session(session); session->run(); - do_accept(); - } -} - -void PrintagoServer::handle_reconnect() -{ - if (reconnection_delay_ < 120) { - reconnection_delay_ *= 2; // Exponential back-off } - auto timer = std::make_shared(ioc_, std::chrono::seconds(reconnection_delay_)); - timer->async_wait([capture0 = shared_from_this(), timer](const beefy::error_code&) { capture0->do_accept(); }); } //`````````````````````````````````````````````````` diff --git a/src/slic3r/Utils/PrintagoServer.hpp b/src/slic3r/Utils/PrintagoServer.hpp index 2232fdc1d0a..e3efc7acfc3 100644 --- a/src/slic3r/Utils/PrintagoServer.hpp +++ b/src/slic3r/Utils/PrintagoServer.hpp @@ -50,7 +50,6 @@ class PrintagoSession : public std::enable_shared_from_this void on_accept(beefy::error_code ec); void do_read(); void on_read(beefy::error_code ec, std::size_t bytes_transferred); - void on_write(beefy::error_code ec, std::size_t bytes_transferred); void async_send(const std::string& message); void do_write(std::shared_ptr messageBuffer); }; @@ -77,7 +76,6 @@ class PrintagoServer : public std::enable_shared_from_this private: void do_accept(); void on_accept(beefy::error_code ec, tcp::socket socket); - void handle_reconnect(); }; //`````````````````````````````````````````````````` @@ -174,6 +172,8 @@ class PrintagoDirector m_select_machine_dlg = nullptr; } + std::shared_ptr GetServer() { return server; } + private: std::shared_ptr _io_context; std::shared_ptr server;