diff --git a/wsd/ClientRequestDispatcher.cpp b/wsd/ClientRequestDispatcher.cpp index 6e36ad651274b..30ff33fce75c5 100644 --- a/wsd/ClientRequestDispatcher.cpp +++ b/wsd/ClientRequestDispatcher.cpp @@ -1704,6 +1704,19 @@ bool ClientRequestDispatcher::handleClipboardRequest(const Poco::Net::HTTPReques docBroker = it->second; } + DocumentBroker::ClipboardRequest type; + if (request.getMethod() != Poco::Net::HTTPRequest::HTTP_GET) + type = DocumentBroker::CLIP_REQUEST_SET; + else + { + if (mime == "text/html") + type = DocumentBroker::CLIP_REQUEST_GET_RICH_HTML_ONLY; + else if (mime == "text/html,text/plain;charset=utf-8") + type = DocumentBroker::CLIP_REQUEST_GET_HTML_PLAIN_ONLY; + else + type = DocumentBroker::CLIP_REQUEST_GET; + } + // If we have a valid docBroker, use it. // Note: there is a race here as DocBroker may // have already exited its SocketPoll, but we @@ -1713,17 +1726,7 @@ bool ClientRequestDispatcher::handleClipboardRequest(const Poco::Net::HTTPReques if (docBroker && docBroker->isAlive()) { std::string jailClipFile, clipFile; - DocumentBroker::ClipboardRequest type; - if (request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET) - { - if (mime == "text/html") - type = DocumentBroker::CLIP_REQUEST_GET_RICH_HTML_ONLY; - else if (mime == "text/html,text/plain;charset=utf-8") - type = DocumentBroker::CLIP_REQUEST_GET_HTML_PLAIN_ONLY; - else - type = DocumentBroker::CLIP_REQUEST_GET; - } - else + if (type == DocumentBroker::CLIP_REQUEST_SET) { if (!docBroker->getSessionFromClipboardTag(viewId, tag)) { @@ -1733,8 +1736,6 @@ bool ClientRequestDispatcher::handleClipboardRequest(const Poco::Net::HTTPReques return true; } - type = DocumentBroker::CLIP_REQUEST_SET; - std::string clipName = "setclipboard." + tag; std::string jailId = docBroker->getJailId(); @@ -1774,7 +1775,7 @@ bool ClientRequestDispatcher::handleClipboardRequest(const Poco::Net::HTTPReques LOG_TRC_S("queued clipboard command " << type << " on docBroker fetch"); } // fallback to persistent clipboards if we can - else if (!DocumentBroker::lookupSendClipboardTag(socket, tag, false)) + else if (!DocumentBroker::handlePersistentClipboardRequest(type, socket, tag, false)) { LOG_ERR_S("Invalid clipboard request to server [" << serverId << "] with tag [" << tag << "] and broker [" << docKey diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp index c15ab471a56d8..50e8b166ae514 100644 --- a/wsd/ClientSession.cpp +++ b/wsd/ClientSession.cpp @@ -300,7 +300,7 @@ void ClientSession::handleClipboardRequest(DocumentBroker::ClipboardRequest if (_state == SessionState::WAIT_DISCONNECT) { LOG_TRC("Clipboard request " << tag << " for disconnecting session"); - if (docBroker->lookupSendClipboardTag(socket, tag, false)) + if (DocumentBroker::handlePersistentClipboardRequest(type, socket, tag, false)) return; // the getclipboard already completed. if (type == DocumentBroker::CLIP_REQUEST_SET) { diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp index e2784ea54ad0f..d4dd25aa4ff26 100644 --- a/wsd/DocumentBroker.cpp +++ b/wsd/DocumentBroker.cpp @@ -4584,13 +4584,15 @@ void DocumentBroker::handleTileCombinedRequest(TileCombined& tileCombined, bool } /// lookup in global clipboard cache and send response, send error if missing if @sendError -bool DocumentBroker::lookupSendClipboardTag(const std::shared_ptr &socket, - const std::string &tag, bool sendError) +bool DocumentBroker::handlePersistentClipboardRequest(ClipboardRequest type, + const std::shared_ptr &socket, + const std::string &tag, bool sendError) { LOG_TRC("Clipboard request " << tag << " not for a live session - check cache."); #if !MOBILEAPP - std::shared_ptr clipFile = - COOLWSD::SavedClipboards->getClipboard(tag); + std::shared_ptr clipFile; + if (type != ClipboardRequest::CLIP_REQUEST_SET) + clipFile = COOLWSD::SavedClipboards->getClipboard(tag); if (clipFile) { auto session = std::make_shared(); @@ -4614,6 +4616,8 @@ bool DocumentBroker::lookupSendClipboardTag(const std::shared_ptr LOG_INF("Found and queued clipboard response for send of size " << FileUtil::Stat(clipFile->_file).size()); return true; } +#else + (void)type; #endif if (!sendError) @@ -4656,7 +4660,7 @@ void DocumentBroker::handleClipboardRequest(ClipboardRequest type, const std::sh return; } - if (!lookupSendClipboardTag(socket, tag, true)) + if (!handlePersistentClipboardRequest(type, socket, tag, true)) LOG_ERR("Could not find matching session to handle clipboard request for " << viewId << " tag: " << tag); } diff --git a/wsd/DocumentBroker.hpp b/wsd/DocumentBroker.hpp index 280dbd5cab3c1..021d279cd4f0f 100644 --- a/wsd/DocumentBroker.hpp +++ b/wsd/DocumentBroker.hpp @@ -442,8 +442,9 @@ class DocumentBroker : public std::enable_shared_from_this void handleClipboardRequest(ClipboardRequest type, const std::shared_ptr &socket, const std::string &viewId, const std::string &tag, const std::string &clipFile); - static bool lookupSendClipboardTag(const std::shared_ptr &socket, - const std::string &tag, bool sendError = false); + static bool handlePersistentClipboardRequest(ClipboardRequest type, + const std::shared_ptr &socket, + const std::string &tag, bool sendError = false); void handleMediaRequest(std::string_view range, const std::shared_ptr& socket, const std::string& tag);