[Libreoffice-commits] online.git: loleaflet/reference.html loleaflet/src wsd/LOOLWSD.cpp wsd/Storage.cpp

Samuel Mehrbrodt (via logerrit) logerrit at kemper.freedesktop.org
Wed Jul 15 07:49:03 UTC 2020


 loleaflet/reference.html     |   16 ++++++++++++++++
 loleaflet/src/core/Socket.js |    7 +++++++
 wsd/LOOLWSD.cpp              |   19 +++++++++++++++++++
 wsd/Storage.cpp              |    7 +++++--
 4 files changed, 47 insertions(+), 2 deletions(-)

New commits:
commit ce91fa4201a53400e677857b6a1c82ee4e8606ec
Author:     Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
AuthorDate: Tue Jul 7 21:18:13 2020 +0200
Commit:     Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
CommitDate: Wed Jul 15 09:48:43 2020 +0200

    Report back load result to integrator
    
    Integrator currently gets no message when loading the document
    from WOPI host fails.
    
    Similiar to Action_Save_Resp, introduce Action_Load_Resp with
    the result of the load action.
    
    Change-Id: I3b0f9ee691a1c5d58e9f833d511435a0b25a465f
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/98299
    Tested-by: Jenkins
    Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>

diff --git a/loleaflet/reference.html b/loleaflet/reference.html
index 99cae5ec6..4c07de27d 100644
--- a/loleaflet/reference.html
+++ b/loleaflet/reference.html
@@ -3035,6 +3035,22 @@ Editor to WOPI host
 		<th>Values</th>
 		<th>Description</th>
 	</tr>
+	<tr>
+		<td><code><b>Action_Load_Resp</b></code></td>
+		<td><code>
+			<nobr>success: <boolean></nobr>
+			<nobr>result: <string></nobr>
+			<nobr>errorMsg: <string></nobr>
+		</code></td>
+		<td>Acknowledgement when load finishes.<br/>
+		<code>success</code> tells if LOOL was able to load the document
+		successfully.<br/>
+		<code>result</code> contains the reason the document was not loaded.<br/>
+		<code>errorMsg</code> contains a detailed error message in case loading failed.
+		Probably it will contain the error message returned from the WOPI/Webdav host.
+		</td>
+	</tr>
+
 	<tr>
 		<td><code><b>Action_Save_Resp</b></code></td>
 		<td><code>
diff --git a/loleaflet/src/core/Socket.js b/loleaflet/src/core/Socket.js
index 9b9b3c236..790c7885d 100644
--- a/loleaflet/src/core/Socket.js
+++ b/loleaflet/src/core/Socket.js
@@ -370,6 +370,13 @@ L.Socket = L.Class.extend({
 					errorMsg: commandresult['errorMsg']
 				};
 				this._map.fire('postMessage', {msgId: 'Action_Save_Resp', args: postMessageObj});
+			} else if (commandresult['command'] === 'load') {
+				postMessageObj = {
+					success: commandresult['success'],
+					result: commandresult['result'],
+					errorMsg: commandresult['errorMsg']
+				};
+				this._map.fire('postMessage', {msgId: 'Action_Load_Resp', args: postMessageObj});
 			}
 			return;
 		}
diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp
index cef10cc11..1df218e83 100644
--- a/wsd/LOOLWSD.cpp
+++ b/wsd/LOOLWSD.cpp
@@ -690,6 +690,20 @@ inline std::string getServiceURI(const std::string &sub, bool asAdmin = false)
 
 #endif
 
+void sendLoadResult(std::shared_ptr<ClientSession> clientSession, bool success,
+                    const std::string &errorMsg)
+{
+    const std::string result = success ? "" : "Error while loading document";
+    const std::string resultstr = success ? "true" : "false";
+    // Some sane limit, otherwise we get problems transfering this
+    // to the client with large strings (can be a whole webpage)
+    // Replace reserved characters
+    std::string errorMsgFormatted = LOOLProtocol::getAbbreviatedMessage(errorMsg);
+    errorMsgFormatted = Poco::translate(errorMsg, "\"", "'");
+    clientSession->sendMessage("commandresult: { \"command\": \"load\", \"success\": " + resultstr +
+                    ", \"result\": \"" + result + "\", \"errorMsg\": \"" + errorMsgFormatted  + "\"}");
+}
+
 } // anonymous namespace
 
 #endif // MOBILEAPP
@@ -3235,15 +3249,19 @@ private:
                                 // Users of development versions get just an info
                                 // when reaching max documents or connections
                                 LOOLWSD::checkSessionLimitsAndWarnClients();
+
+                                sendLoadResult(clientSession, true, "");
                             }
                             catch (const UnauthorizedRequestException& exc)
                             {
                                 LOG_ERR("Unauthorized Request while loading session for " << docBroker->getDocKey() << ": " << exc.what());
+                                sendLoadResult(clientSession, false, "Unauthorized Request");
                                 const std::string msg = "error: cmd=internal kind=unauthorized";
                                 clientSession->sendMessage(msg);
                             }
                             catch (const StorageConnectionException& exc)
                             {
+                                sendLoadResult(clientSession, false, exc.what());
                                 // Alert user about failed load
                                 const std::string msg = "error: cmd=storage kind=loadfailed";
                                 clientSession->sendMessage(msg);
@@ -3255,6 +3273,7 @@ private:
                                 // Alert user about failed load
                                 const std::string msg = "error: cmd=storage kind=loadfailed";
                                 clientSession->sendMessage(msg);
+                                sendLoadResult(clientSession, false, exc.what());
                             }
                         });
                     });
diff --git a/wsd/Storage.cpp b/wsd/Storage.cpp
index e15f1abcb..e67c568ac 100644
--- a/wsd/Storage.cpp
+++ b/wsd/Storage.cpp
@@ -898,8 +898,11 @@ std::string WopiStorage::loadStorageFileToLocal(const Authorization& auth,
 
         if (response.getStatus() != Poco::Net::HTTPResponse::HTTP_OK)
         {
-            LOG_ERR("WOPI::GetFile failed with " << response.getStatus() << ' ' << response.getReason());
-            throw StorageConnectionException("WOPI::GetFile failed");
+            std::ostringstream oss;
+            Poco::StreamCopier::copyStream(rs, oss);
+            std::string responseString = oss.str();
+            LOG_ERR("WOPI::GetFile failed with " << response.getStatus() << ' ' << responseString);
+            throw StorageConnectionException("WOPI::GetFile failed: " + responseString);
         }
         else // Successful
         {


More information about the Libreoffice-commits mailing list