loolwsd/LOOLSession.cpp | 3 +- loolwsd/LOOLSession.hpp | 16 ++++++++++++- loolwsd/LOOLWSD.cpp | 7 ++++- loolwsd/test/integration-http-server.cpp | 37 +++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 4 deletions(-)
New commits: commit f684e505da11f0c800910cafde7d49de0bb5a568 Author: Pranav Kant <pran...@collabora.co.uk> Date: Thu Jul 21 12:52:14 2016 +0530 loolwsd: Restore test for convert-to API This got accidently removed in 8e266391f13a7daa3b074ba2ae33ac4958d39ae0 Change-Id: I3d03b1b75f05f5855397e46a7fccc30c794ca151 diff --git a/loolwsd/test/integration-http-server.cpp b/loolwsd/test/integration-http-server.cpp index abc78ff..390ea55 100644 --- a/loolwsd/test/integration-http-server.cpp +++ b/loolwsd/test/integration-http-server.cpp @@ -42,6 +42,7 @@ class HTTPServerTest : public CPPUNIT_NS::TestFixture CPPUNIT_TEST(testLoleafletPost); CPPUNIT_TEST(testScriptsAndLinksGet); CPPUNIT_TEST(testScriptsAndLinksPost); + CPPUNIT_TEST(testConvertTo); CPPUNIT_TEST_SUITE_END(); @@ -52,6 +53,7 @@ class HTTPServerTest : public CPPUNIT_NS::TestFixture void testLoleafletPost(); void testScriptsAndLinksGet(); void testScriptsAndLinksPost(); + void testConvertTo(); void testNoExtraLoolKitsLeft(); @@ -235,6 +237,41 @@ void HTTPServerTest::testScriptsAndLinksPost() assertHTTPFilesExist(_uri, link, html); } +void HTTPServerTest::testConvertTo() +{ + const auto srcPath = Util::getTempFilePath(TDOC, "hello.odt"); + std::unique_ptr<Poco::Net::HTTPClientSession> session(helpers::createSession(_uri)); + + Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_POST, "/lool/convert-to"); + Poco::Net::HTMLForm form; + form.setEncoding(Poco::Net::HTMLForm::ENCODING_MULTIPART); + form.set("format", "txt"); + form.addPart("data", new Poco::Net::FilePartSource(srcPath)); + form.prepareSubmit(request); + // If this results in a Poco::Net::ConnectionRefusedException, loolwsd is not running. + form.write(session->sendRequest(request)); + + Poco::Net::HTTPResponse response; + std::stringstream actualStream; + // receiveResponse() resulted in a Poco::Net::NoMessageException. + std::istream& responseStream = session->receiveResponse(response); + Poco::StreamCopier::copyStream(responseStream, actualStream); + + std::ifstream fileStream(TDOC "/hello.txt"); + std::stringstream expectedStream; + expectedStream << fileStream.rdbuf(); + + // Remove the temp files. + Util::removeFile(srcPath); + + // In some cases the result is prefixed with (the UTF-8 encoding of) the Unicode BOM + // (U+FEFF). Skip that. + std::string actualString = actualStream.str(); + if (actualString.size() > 3 && actualString[0] == '\xEF' && actualString[1] == '\xBB' && actualString[2] == '\xBF') + actualString = actualString.substr(3); + CPPUNIT_ASSERT_EQUAL(expectedStream.str(), actualString); +} + void HTTPServerTest::testNoExtraLoolKitsLeft() { const auto countNow = countLoolKitProcesses(InitialLoolKitCount); commit 39645c974d38c9494ec773ac493b2b7590e803fd Author: Pranav Kant <pran...@collabora.co.uk> Date: Thu Jul 21 12:33:14 2016 +0530 loolwsd: Fix convert-to regression; fix incorrect filepath formed Regressed with 886af28bc2f6d1d27bf78de09978f3858d2db705 Poco::URI::encode appends to given string, and encodedTo already had content leading to incorrect path. Use a new std::string variable. Change-Id: Ia72ff60ed9cf7f14ff649416a2ceeeda13ff6197 diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp index fd939a4..5e01803 100644 --- a/loolwsd/LOOLWSD.cpp +++ b/loolwsd/LOOLWSD.cpp @@ -435,8 +435,9 @@ private: if (!resultURL.getPath().empty()) { const std::string mimeType = "application/octet-stream"; - URI::encode(resultURL.getPath(), "", encodedTo); - response.sendFile(encodedTo, mimeType); + std::string encodedFilePath; + URI::encode(resultURL.getPath(), "", encodedFilePath); + response.sendFile(encodedFilePath, mimeType); sent = true; } commit 9417ec839cde784ff1ec194175387fc125d14734 Author: Pranav Kant <pran...@collabora.co.uk> Date: Thu Jul 21 11:46:43 2016 +0530 loolwsd: Introduce headless peer;fix convert-to API partially Convert-to API got broken in 80786cc79d4197fef6e58b2f8a0d5096b74196d6 In case of convert-to API, there is no actual client facing websocket connection (and we use an invalid websocket connection). So, when prisoner session tries to forward messages to client it would fail as we have now started to propagate errors from forwardToPeer. Introduce a headless (without an actual client) peer mode, and fail silently when someone tries to forward messages to such a peer. Change-Id: I8a9f93f798dca9fea45c41e99bf373cd23d32e2c diff --git a/loolwsd/LOOLSession.cpp b/loolwsd/LOOLSession.cpp index c2b80f8..c72ae4d 100644 --- a/loolwsd/LOOLSession.cpp +++ b/loolwsd/LOOLSession.cpp @@ -61,7 +61,8 @@ LOOLSession::LOOLSession(const std::string& id, const Kind kind, _isCloseFrame(false), _disconnected(false), _isActive(true), - _lastActivityTime(std::chrono::steady_clock::now()) + _lastActivityTime(std::chrono::steady_clock::now()), + _isHeadless(false) { // Only a post request can have a null ws. if (_kind != Kind::ToClient) diff --git a/loolwsd/LOOLSession.hpp b/loolwsd/LOOLSession.hpp index 5746d38..3d6e3f3 100644 --- a/loolwsd/LOOLSession.hpp +++ b/loolwsd/LOOLSession.hpp @@ -75,6 +75,9 @@ public: Kind getKind() const { return _kind; } + void setHeadless(bool val) { _isHeadless = val; } + bool isHeadless() const { return _isHeadless; } + protected: LOOLSession(const std::string& id, const Kind kind, std::shared_ptr<Poco::Net::WebSocket> ws); @@ -109,6 +112,13 @@ protected: Log::trace(getName() + ": peer began the closing handshake. Dropping forward message [" + message + "]."); return false; } + else if (peer->isHeadless()) + { + // Fail silently and return as there is no actual websocket + // connection in this case. + Log::info(getName() + ": Ignoring forward message due to peer being headless"); + return true; + } Log::trace(getName() + " -> " + peer->getName() + ": " + message); return peer->sendBinaryFrame(buffer, length); @@ -149,7 +159,6 @@ protected: // Whether websocket received close frame. Closing Handshake std::atomic<bool> _isCloseFrame; - private: virtual bool _handleInput(const char *buffer, int length) = 0; @@ -166,6 +175,11 @@ private: std::chrono::steady_clock::time_point _lastActivityTime; + // Whether it is dummy session + // For eg. In case of convert-to requests (HTTP Post), there is no actual websocket + // connection on client side + bool _isHeadless; + std::mutex _mutex; static constexpr auto InactivityThresholdMS = 120 * 1000; diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp index 3fe3c96..fd939a4 100644 --- a/loolwsd/LOOLWSD.cpp +++ b/loolwsd/LOOLWSD.cpp @@ -399,6 +399,8 @@ private: // Load the document. std::shared_ptr<WebSocket> ws; auto session = std::make_shared<ClientSession>(id, ws, docBroker, nullptr); + // There is no actual client websocket connnection here + session->setHeadless(true); // Request the child to connect to us and add this session. auto sessionsCount = docBroker->addSession(session); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits