net/Socket.cpp | 38 ++++++++++++++++++++++---------------- net/Socket.hpp | 8 ++++---- test/UnitWOPITemplate.cpp | 4 +--- wsd/ClientSession.cpp | 2 +- wsd/FileServer.cpp | 3 ++- wsd/LOOLWSD.cpp | 8 ++------ 6 files changed, 32 insertions(+), 31 deletions(-)
New commits: commit 714640993bb09f34cef97e878fd8e8b13ea4fb2b Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Wed Jun 3 16:06:10 2020 +0100 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Wed Jun 3 18:15:33 2020 +0200 Remember to shutdown the socket after serving files. re-factor to make it hard not to. Change-Id: I26ebc48b4660276ede64a22167ac4779cebf5cd4 Reviewed-on: https://gerrit.libreoffice.org/c/online/+/95440 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Michael Meeks <michael.me...@collabora.com> diff --git a/net/Socket.cpp b/net/Socket.cpp index e388d412a..ee76a5a1a 100644 --- a/net/Socket.cpp +++ b/net/Socket.cpp @@ -1022,14 +1022,19 @@ namespace HttpHelper } } - void sendFile(const std::shared_ptr<StreamSocket>& socket, - const std::string& path, - const std::string& mediaType, - Poco::Net::HTTPResponse& response, - const bool noCache, - const bool deflate, - const bool headerOnly) + void sendFileAndShutdown(const std::shared_ptr<StreamSocket>& socket, + const std::string& path, + const std::string& mediaType, + Poco::Net::HTTPResponse *optResponse, + const bool noCache, + const bool deflate, + const bool headerOnly) { + Poco::Net::HTTPResponse *response = optResponse; + Poco::Net::HTTPResponse localResponse; + if (!response) + response = &localResponse; + struct stat st; if (stat(path.c_str(), &st) != 0) { @@ -1040,16 +1045,16 @@ namespace HttpHelper if (!noCache) { // 60 * 60 * 24 * 128 (days) = 11059200 - response.set("Cache-Control", "max-age=11059200"); - response.set("ETag", "\"" LOOLWSD_VERSION_HASH "\""); + response->set("Cache-Control", "max-age=11059200"); + response->set("ETag", "\"" LOOLWSD_VERSION_HASH "\""); } else { - response.set("Cache-Control", "no-cache"); + response->set("Cache-Control", "no-cache"); } - response.setContentType(mediaType); - response.add("X-Content-Type-Options", "nosniff"); + response->setContentType(mediaType); + response->add("X-Content-Type-Options", "nosniff"); int bufferSize = std::min(st.st_size, (off_t)Socket::MaximumSendBufferSize); if (st.st_size >= socket->getSendBufferSize()) @@ -1063,24 +1068,25 @@ namespace HttpHelper // IE/Edge before enabling the deflate again if (!deflate || true) { - response.setContentLength(st.st_size); + response->setContentLength(st.st_size); LOG_TRC('#' << socket->getFD() << ": Sending " << (headerOnly ? "header for " : "") << " file [" << path << "]."); - socket->send(response); + socket->send(*response); if (!headerOnly) sendUncompressedFileContent(socket, path, bufferSize); } else { - response.set("Content-Encoding", "deflate"); + response->set("Content-Encoding", "deflate"); LOG_TRC('#' << socket->getFD() << ": Sending " << (headerOnly ? "header for " : "") << " file [" << path << "]."); - socket->send(response); + socket->send(*response); if (!headerOnly) sendDeflatedFileContent(socket, path, st.st_size); } + socket->shutdown(); } } diff --git a/net/Socket.hpp b/net/Socket.hpp index 7e011bb9d..55cfe05bb 100644 --- a/net/Socket.hpp +++ b/net/Socket.hpp @@ -1278,10 +1278,10 @@ enum class WSOpCode : unsigned char { namespace HttpHelper { - /// Sends file as HTTP response. - void sendFile(const std::shared_ptr<StreamSocket>& socket, const std::string& path, const std::string& mediaType, - Poco::Net::HTTPResponse& response, bool noCache = false, bool deflate = false, - const bool headerOnly = false); + /// Sends file as HTTP response and shutdown the socket. + void sendFileAndShutdown(const std::shared_ptr<StreamSocket>& socket, const std::string& path, const std::string& mediaType, + Poco::Net::HTTPResponse *optResponse = nullptr, bool noCache = false, bool deflate = false, + const bool headerOnly = false); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/test/UnitWOPITemplate.cpp b/test/UnitWOPITemplate.cpp index 2ebb1a28c..83e1bb64f 100644 --- a/test/UnitWOPITemplate.cpp +++ b/test/UnitWOPITemplate.cpp @@ -94,9 +94,7 @@ public: { LOG_INF("Fake wopi host request, handling template GetFile: " << uriReq.getPath()); - Poco::Net::HTTPResponse response; - HttpHelper::sendFile(socket, TDOC "/test.ott", "", response); - socket->shutdown(); + HttpHelper::sendFileAndShutdown(socket, TDOC "/test.ott", ""); return true; } diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp index d534a2656..904867b18 100644 --- a/wsd/ClientSession.cpp +++ b/wsd/ClientSession.cpp @@ -1271,7 +1271,7 @@ bool ClientSession::handleKitToClientMessage(const char* buffer, const int lengt if (!fileName.empty()) response.set("Content-Disposition", "attachment; filename=\"" + fileName + '"'); - HttpHelper::sendFile(_saveAsSocket, encodedFilePath, mimeType, response); + HttpHelper::sendFileAndShutdown(_saveAsSocket, encodedFilePath, mimeType, &response); } // Conversion is done, cleanup this fake session. diff --git a/wsd/FileServer.cpp b/wsd/FileServer.cpp index 1c47b0f8d..a298adb6c 100644 --- a/wsd/FileServer.cpp +++ b/wsd/FileServer.cpp @@ -442,7 +442,7 @@ void FileServerRequestHandler::handleRequest(const HTTPRequest& request, // Useful to not serve from memory sometimes especially during loleaflet development // Avoids having to restart loolwsd everytime you make a change in loleaflet const std::string filePath = Poco::Path(LOOLWSD::FileServerRoot, relPath).absolute().toString(); - HttpHelper::sendFile(socket, filePath, mimeType, response, noCache); + HttpHelper::sendFileAndShutdown(socket, filePath, mimeType, &response, noCache); return; } #endif @@ -470,6 +470,7 @@ void FileServerRequestHandler::handleRequest(const HTTPRequest& request, (!gzip ? "un":"") << "compressed : file [" << relPath << "]: " << header); socket->send(header); socket->send(*content); + // shutdown by caller } } catch (const Poco::Net::NotAuthenticatedException& exc) diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp index db7bfbaef..c672932f0 100644 --- a/wsd/LOOLWSD.cpp +++ b/wsd/LOOLWSD.cpp @@ -2485,13 +2485,9 @@ private: std::string mimeType = "image/vnd.microsoft.icon"; std::string faviconPath = Path(Application::instance().commandPath()).parent().toString() + "favicon.ico"; if (!File(faviconPath).exists()) - { faviconPath = LOOLWSD::FileServerRoot + "/favicon.ico"; - } - Poco::Net::HTTPResponse response; - HttpHelper::sendFile(socket, faviconPath, mimeType, response); - socket->shutdown(); + HttpHelper::sendFileAndShutdown(socket, faviconPath, mimeType); } void handleWopiDiscoveryRequest(const RequestDetails &requestDetails, @@ -2900,7 +2896,7 @@ private: try { - HttpHelper::sendFile(socket, filePath.toString(), contentType, response); + HttpHelper::sendFileAndShutdown(socket, filePath.toString(), contentType, &response); } catch (const Exception& exc) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits