common/Protocol.hpp | 14 +++++++------- test/WhiteBoxTests.cpp | 10 ++++++++++ wsd/README.vars | 4 ++++ wsd/Storage.cpp | 23 ++++++++++++++++++++++- 4 files changed, 43 insertions(+), 8 deletions(-)
New commits: commit b4d072e80a891094d2da4b2e7a698e25756e0b79 Author: Pranav Kant <pran...@collabora.co.uk> Date: Wed May 17 14:18:51 2017 +0530 wsd: Debugging environment vars to debug storages Also, extend the LOOLProtocol::tokenize to accept a custom delimeter. (cherry picked from commit 8a02e7a8fa818b2e7fe8e45aefbba0c8ff7e7610) Conflicts: wsd/Storage.cpp Change-Id: I7f789e703c5c8d2ad325b3dd149ba888c722f5f3 Reviewed-on: https://gerrit.libreoffice.org/38136 Reviewed-by: László Németh <nem...@numbertext.org> Tested-by: László Németh <nem...@numbertext.org> diff --git a/common/Protocol.hpp b/common/Protocol.hpp index c4048742..cae54d46 100644 --- a/common/Protocol.hpp +++ b/common/Protocol.hpp @@ -96,7 +96,7 @@ namespace LOOLProtocol /// Tokenize space-delimited values until we hit new-line or the end. inline - std::vector<std::string> tokenize(const char* data, const size_t size) + std::vector<std::string> tokenize(const char* data, const size_t size, const char delimeter = ' ') { std::vector<std::string> tokens; if (size == 0 || data == nullptr) @@ -108,22 +108,22 @@ namespace LOOLProtocol const char* end = data; for (size_t i = 0; i < size && data[i] != '\n'; ++i, ++end) { - if (data[i] == ' ') + if (data[i] == delimeter) { - if (start != end && *start != ' ') + if (start != end && *start != delimeter) { tokens.emplace_back(start, end); } start = end; } - else if (*start == ' ') + else if (*start == delimeter) { ++start; } } - if (start != end && *start != ' ' && *start != '\n') + if (start != end && *start != delimeter && *start != '\n') { tokens.emplace_back(start, end); } @@ -132,9 +132,9 @@ namespace LOOLProtocol } inline - std::vector<std::string> tokenize(const std::string& s) + std::vector<std::string> tokenize(const std::string& s, const char delimeter = ' ') { - return tokenize(s.data(), s.size()); + return tokenize(s.data(), s.size(), delimeter); } inline bool getTokenIntegerFromMessage(const std::string& message, const std::string& name, int& value) diff --git a/test/WhiteBoxTests.cpp b/test/WhiteBoxTests.cpp index 7ddba7d2..9258b484 100644 --- a/test/WhiteBoxTests.cpp +++ b/test/WhiteBoxTests.cpp @@ -216,6 +216,16 @@ void WhiteBoxTests::testTokenizer() CPPUNIT_ASSERT_EQUAL(std::string("tilewidth=3840"), tokens[6]); CPPUNIT_ASSERT_EQUAL(std::string("tileheight=3840"), tokens[7]); CPPUNIT_ASSERT_EQUAL(std::string("ver=-1"), tokens[8]); + + // With custom delimeters + tokens = LOOLProtocol::tokenize(std::string("ABC:DEF"), ':'); + CPPUNIT_ASSERT_EQUAL(std::string("ABC"), tokens[0]); + CPPUNIT_ASSERT_EQUAL(std::string("DEF"), tokens[1]); + + tokens = LOOLProtocol::tokenize(std::string("ABC,DEF,XYZ"), ','); + CPPUNIT_ASSERT_EQUAL(std::string("ABC"), tokens[0]); + CPPUNIT_ASSERT_EQUAL(std::string("DEF"), tokens[1]); + CPPUNIT_ASSERT_EQUAL(std::string("XYZ"), tokens[2]); } void WhiteBoxTests::testRegexListMatcher() diff --git a/wsd/README.vars b/wsd/README.vars index b55672ab..862465fd 100644 --- a/wsd/README.vars +++ b/wsd/README.vars @@ -31,3 +31,7 @@ LOOL_WS_DELAY <base delay in milliseconds in websocket communication> LOOL_WS_JITTER <jitter in milliseconds for websocket communication> Maximum Jitter in millseconds which is added to delay in websocket communication. + +LOOL_STORAGE_COOKIE <key:value> + Sets a cookie to all the requests made to storage. This is extremely useful for + debugging WOPI implementations. For eg: Using XDebug with OwnCloud/NextCloud. diff --git a/wsd/Storage.cpp b/wsd/Storage.cpp index 5b3107c9..38ed96f3 100644 --- a/wsd/Storage.cpp +++ b/wsd/Storage.cpp @@ -26,6 +26,7 @@ #include <Poco/Net/HTTPRequest.h> #include <Poco/Net/HTTPResponse.h> #include <Poco/Net/HTTPSClientSession.h> +#include <Poco/Net/NameValueCollection.h> #include <Poco/Net/NetworkInterface.h> #include <Poco/Net/SSLManager.h> #include <Poco/StreamCopier.h> @@ -404,6 +405,24 @@ void setQueryParameter(Poco::URI& uriObject, const std::string& key, const std:: uriObject.addQueryParameter(key, value); } + +void addStorageDebugCookie(Poco::Net::HTTPRequest& request) +{ +#if ENABLE_DEBUG + if (std::getenv("LOOL_STORAGE_COOKIE")) + { + Poco::Net::NameValueCollection nvcCookies; + std::vector<std::string> cookieTokens = LOOLProtocol::tokenize(std::string(std::getenv("LOOL_STORAGE_COOKIE")), ':'); + if (cookieTokens.size() == 2) + { + nvcCookies.add(cookieTokens[0], cookieTokens[1]); + request.setCookies(nvcCookies); + LOG_TRC("Added storage debug cookie [" << cookieTokens[0] << "=" << cookieTokens[1] << "]."); + } + } +#endif +} + } // anonymous namespace std::unique_ptr<WopiStorage::WOPIFileInfo> WopiStorage::getWOPIFileInfo(const std::string& accessToken) @@ -423,6 +442,7 @@ std::unique_ptr<WopiStorage::WOPIFileInfo> WopiStorage::getWOPIFileInfo(const st Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, uriObject.getPathAndQuery(), Poco::Net::HTTPMessage::HTTP_1_1); request.set("User-Agent", "LOOLWSD WOPI Agent"); + addStorageDebugCookie(request); psession->sendRequest(request); Poco::Net::HTTPResponse response; @@ -547,6 +567,7 @@ std::string WopiStorage::loadStorageFileToLocal(const std::string& accessToken) Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, uriObject.getPathAndQuery(), Poco::Net::HTTPMessage::HTTP_1_1); request.set("User-Agent", "LOOLWSD WOPI Agent"); + addStorageDebugCookie(request); psession->sendRequest(request); Poco::Net::HTTPResponse response; @@ -617,7 +638,7 @@ StorageBase::SaveResult WopiStorage::saveLocalFileToStorage(const std::string& a request.set("X-WOPI-Override", "PUT"); request.setContentType("application/octet-stream"); request.setContentLength(size); - + addStorageDebugCookie(request); std::ostream& os = psession->sendRequest(request); std::ifstream ifs(_jailedFilePath); Poco::StreamCopier::copyStream(ifs, os);
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits