// Copyright 2015 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef WEBSERVER_LIBWEBSERV_SERVER_H_ #define WEBSERVER_LIBWEBSERV_SERVER_H_ // In our own Android.mk, we set these flags for ourselves. However, for // libraries consuming libwebserv, they don't have any of that logic. Leave us // with DBus bindings until the Binder interface is ready. #if !defined(WEBSERV_USE_DBUS) && !defined(WEBSERV_USE_BINDER) #define WEBSERV_USE_DBUS #endif #include <memory> #include <string> #include <base/callback.h> #include <base/macros.h> #include <libwebserv/export.h> #if defined(WEBSERV_USE_DBUS) #include <base/memory/ref_counted.h> #include <brillo/dbus/async_event_sequencer.h> #include <dbus/bus.h> #endif // defined(WEBSERV_USE_DBUS) #if defined(WEBSERV_USE_BINDER) #include <brillo/message_loops/message_loop.h> #endif // defined(WEBSERV_USE_BINDER) namespace libwebserv { class ProtocolHandler; // Top-level wrapper class around HTTP server and provides an interface to // the web server. class LIBWEBSERV_EXPORT Server { public: Server() = default; virtual ~Server() = default; #if defined(WEBSERV_USE_DBUS) // Establish a connection to the system webserver. // // |service_name| is the well known D-Bus name of the client's process, used // to expose a callback D-Bus object the web server calls back with incoming // requests. // |on_server_online| and |on_server_offline| will notify the caller when the // server comes up and down. // // Note that you can use the returned Server instance as if the webserver // process is actually running (ignoring webserver crashes and restarts). // All registered request handlers will simply be re-registered when the // webserver appears again. static std::unique_ptr<Server> ConnectToServerViaDBus( const scoped_refptr<dbus::Bus>& bus, const std::string& service_name, const brillo::dbus_utils::AsyncEventSequencer::CompletionAction& cb, const base::Closure& on_server_online, const base::Closure& on_server_offline); #endif // defined(WEBSERV_USE_DBUS) #if defined(WEBSERV_USE_BINDER) // Establish a connection to the system webserver. // // |on_server_online| and |on_server_offline| will notify the caller when the // server comes up and down. // // Note that you can use the returned Server instance as if the webserver // process is actually running (ignoring webserver crashes and restarts). // All registered request handlers will simply be re-registered when the // webserver appears again. static std::unique_ptr<Server> ConnectToServerViaBinder( brillo::MessageLoop* message_loop, const base::Closure& on_server_online, const base::Closure& on_server_offline); #endif // defined(WEBSERV_USE_BINDER) // A helper method that returns the default handler for "http". virtual ProtocolHandler* GetDefaultHttpHandler() = 0; // A helper method that returns the default handler for "https". virtual ProtocolHandler* GetDefaultHttpsHandler() = 0; // Returns an existing protocol handler by name. If the handler with the // requested |name| does not exist, a new one will be created. // // The created handler is purely client side, and depends on the server // being configured to open a corresponding handler with the given name. // Because clients and the server come up asynchronously, we allow clients // to register anticipated handlers before server starts up. virtual ProtocolHandler* GetProtocolHandler(const std::string& name) = 0; // Returns true if |this| is connected to the web server daemon via IPC. virtual bool IsConnected() const = 0; // Set a user-callback to be invoked when a protocol handler is connect to the // server daemon. Multiple calls to this method will overwrite previously set // callbacks. virtual void OnProtocolHandlerConnected( const base::Callback<void(ProtocolHandler*)>& callback) = 0; // Set a user-callback to be invoked when a protocol handler is disconnected // from the server daemon (e.g. on shutdown). Multiple calls to this method // will overwrite previously set callbacks. virtual void OnProtocolHandlerDisconnected( const base::Callback<void(ProtocolHandler*)>& callback) = 0; // Returns the default request timeout used to process incoming requests. // The reply to an incoming request should be sent within this timeout or // else the web server will automatically abort the connection. If the timeout // is not set, the returned value will be base::TimeDelta::Max(). virtual base::TimeDelta GetDefaultRequestTimeout() const = 0; private: DISALLOW_COPY_AND_ASSIGN(Server); }; } // namespace libwebserv #endif // WEBSERVER_LIBWEBSERV_SERVER_H_