/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ /* * Copyright the Collabora Online contributors. * * SPDX-License-Identifier: MPL-2.0 * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include #include #include #if !MOBILEAPP #include #endif // !MOBILEAPP #include #include /// Handles incoming connections and dispatches to the appropriate handler. class ClientRequestDispatcher final : public SimpleSocketHandler { public: ClientRequestDispatcher() {} static void InitStaticFileContentCache() { StaticFileContentCache["discovery.xml"] = getDiscoveryXML(); } typedef std::function AsyncFn; private: /// Set the socket associated with this ResponseClient. void onConnect(const std::shared_ptr& socket) override; /// Called after successful socket reads. void handleIncomingMessage(SocketDisposition& disposition) override; int getPollEvents(std::chrono::steady_clock::time_point /* now */, int64_t& /* timeoutMaxMs */) override { return POLLIN; } void performWrites(std::size_t /*capacity*/) override {} #if !MOBILEAPP /// Does this address feature in the allowed hosts list. static bool allowPostFrom(const std::string& address); static bool allowConvertTo(const std::string& address, const Poco::Net::HTTPRequest& request, AsyncFn asyncCb); void handleRootRequest(const RequestDetails& requestDetails, const std::shared_ptr& socket); static void handleFaviconRequest(const RequestDetails& requestDetails, const std::shared_ptr& socket); void handleWopiDiscoveryRequest(const RequestDetails& requestDetails, const std::shared_ptr& socket); void handleCapabilitiesRequest(const Poco::Net::HTTPRequest& request, const std::shared_ptr& socket); static void handleClipboardRequest(const Poco::Net::HTTPRequest& request, Poco::MemoryInputStream& message, SocketDisposition& disposition, const std::shared_ptr& socket); static void handleRobotsTxtRequest(const Poco::Net::HTTPRequest& request, const std::shared_ptr& socket); static void handleMediaRequest(const Poco::Net::HTTPRequest& request, SocketDisposition& /*disposition*/, const std::shared_ptr& socket); static std::string getContentType(const std::string& fileName); static bool isSpreadsheet(const std::string& fileName); void handlePostRequest(const RequestDetails& requestDetails, const Poco::Net::HTTPRequest& request, Poco::MemoryInputStream& message, SocketDisposition& disposition, const std::shared_ptr& socket); void handleClientProxyRequest(const Poco::Net::HTTPRequest& request, const RequestDetails& requestDetails, Poco::MemoryInputStream& message, SocketDisposition& disposition); #endif // !MOBILEAPP void handleClientWsUpgrade(const Poco::Net::HTTPRequest& request, const RequestDetails& requestDetails, SocketDisposition& disposition, const std::shared_ptr& socket, unsigned mobileAppDocId = 0); /// Lookup cached file content. static const std::string& getFileContent(const std::string& filename); /// Process the discovery.xml file and return as string. static std::string getDiscoveryXML(); private: // The socket that owns us (we can't own it). std::weak_ptr _socket; std::string _id; #if !MOBILEAPP /// WASM document request handler. Used only when WASM is enabled. std::unique_ptr _wopiProxy; #endif // !MOBILEAPP /// The private RequestVettingStation. Held privately after the /// WS is created and as long as it is connected. std::shared_ptr _rvs; /// External requests are first vetted before allocating DocBroker and Kit process. /// This is a map of the request URI to the RequestVettingStation for vetting. static std::unordered_map> RequestVettingStations; /// Cache for static files, to avoid reading and processing from disk. static std::map StaticFileContentCache; };