diff --git a/src/slic3r/Utils/Duet.cpp b/src/slic3r/Utils/Duet.cpp index 690e1000c7..73a4438dd8 100644 --- a/src/slic3r/Utils/Duet.cpp +++ b/src/slic3r/Utils/Duet.cpp @@ -29,10 +29,28 @@ #include "slic3r/GUI/format.hpp" #include "Http.hpp" +#include + namespace fs = boost::filesystem; namespace pt = boost::property_tree; namespace Slic3r { +namespace { +std::string escape_string(const std::string& unescaped) +{ + std::string ret_val; + CURL* curl = curl_easy_init(); + if (curl) { + char* decoded = curl_easy_escape(curl, unescaped.c_str(), unescaped.size()); + if (decoded) { + ret_val = std::string(decoded); + curl_free(decoded); + } + curl_easy_cleanup(curl); + } + return ret_val; +} +} Duet::Duet(DynamicPrintConfig *config) : host(config->opt_string("print_host")), @@ -81,6 +99,8 @@ bool Duet::upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn e auto http = (dsf ? Http::put(std::move(upload_cmd)) : Http::post(std::move(upload_cmd))); if (dsf) { http.set_put_body(upload_data.source_path); + if (connect_msg.empty()) + http.header("X-Session-Key", boost::nowide::narrow(connect_msg)); } else { http.set_post_body(upload_data.source_path); } @@ -140,7 +160,20 @@ Duet::ConnectionType Duet::connect(wxString &msg) const msg = format_error(body, error, status); }) .on_complete([&](std::string body, unsigned) { - res = ConnectionType::dsf; + try { + pt::ptree root; + std::istringstream iss(body); + pt::read_json(iss, root); + auto key = root.get_optional("sessionKey"); + if (key) + msg = boost::nowide::widen(*key); + res = ConnectionType::dsf; + } + catch (const std::exception&) { + BOOST_LOG_TRIVIAL(error) << "Failed to parse serverKey from Duet reply to Connect request: " << body; + msg = format_error(body, L("Failed to parse a Connect reply"), 0); + res = ConnectionType::error; + } }) .perform_sync(); }) @@ -205,12 +238,13 @@ std::string Duet::get_upload_url(const std::string &filename, ConnectionType con std::string Duet::get_connect_url(const bool dsfUrl) const { if (dsfUrl) { - return (boost::format("%1%machine/status") - % get_base_url()).str(); + return (boost::format("%1%machine/connect?password=%2%") + % get_base_url() + % (password.empty() ? "reprap" : escape_string(password))).str(); } else { return (boost::format("%1%rr_connect?password=%2%&%3%") % get_base_url() - % (password.empty() ? "reprap" : password) + % (password.empty() ? "reprap" : escape_string(password)) % timestamp_str()).str(); } } diff --git a/src/slic3r/Utils/Duet.hpp b/src/slic3r/Utils/Duet.hpp index 006914cdd3..a03f17e458 100644 --- a/src/slic3r/Utils/Duet.hpp +++ b/src/slic3r/Utils/Duet.hpp @@ -35,7 +35,7 @@ public: std::string get_host() const override { return host; } private: - enum class ConnectionType { rrf, dsf, error }; + enum class ConnectionType { rrf, dsf, error }; // rrf = RepRapFirmware, dsf = DuetSoftwareFramework std::string host; std::string password;