buffet: Move WebServClient out of libweave libweave now relies on platform specific implementation of weave::HttpServer. BUG=brillo:1252 TEST='FEATURES=test emerge-gizmo buffet' Change-Id: I8f2c2f119699ff5096a74dc05948db0eaf108ea3 Reviewed-on: https://chromium-review.googlesource.com/290142 Commit-Queue: Vitaly Buka <vitalybuka@chromium.org> Trybot-Ready: Vitaly Buka <vitalybuka@chromium.org> Tested-by: Vitaly Buka <vitalybuka@chromium.org> Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/buffet.gyp b/buffet/buffet.gyp index c72b4d8..400bf44 100644 --- a/buffet/buffet.gyp +++ b/buffet/buffet.gyp
@@ -35,6 +35,7 @@ 'manager.cc', 'peerd_client.cc', 'shill_client.cc', + 'webserv_client.cc', '../libweave/src/base_api_handler.cc', '../libweave/src/buffet_config.cc', '../libweave/src/commands/cloud_command_proxy.cc', @@ -67,7 +68,6 @@ '../libweave/src/privet/privet_types.cc', '../libweave/src/privet/publisher.cc', '../libweave/src/privet/security_manager.cc', - '../libweave/src/privet/webserv_client.cc', '../libweave/src/privet/wifi_bootstrap_manager.cc', '../libweave/src/privet/wifi_ssid_generator.cc', '../libweave/src/registration_status.cc',
diff --git a/buffet/manager.cc b/buffet/manager.cc index 9df8caa..047c121 100644 --- a/buffet/manager.cc +++ b/buffet/manager.cc
@@ -27,6 +27,7 @@ #include "buffet/dbus_conversion.h" #include "buffet/peerd_client.h" #include "buffet/shill_client.h" +#include "buffet/webserv_client.h" #include "weave/enum_to_string.h" using chromeos::dbus_utils::AsyncEventSequencer; @@ -57,12 +58,15 @@ void Manager::Start(const weave::Device::Options& options, const std::set<std::string>& device_whitelist, AsyncEventSequencer* sequencer) { - peerd_client_.reset(new PeerdClient{dbus_object_.GetBus()}); shill_client_.reset(new ShillClient{dbus_object_.GetBus(), device_whitelist}); + if (!options.disable_privet) { + peerd_client_.reset(new PeerdClient{dbus_object_.GetBus()}); + web_serv_client_.reset(new WebServClient{dbus_object_.GetBus(), sequencer}); + } device_ = weave::Device::Create(); - device_->Start(options, peerd_client_.get(), shill_client_.get(), - &dbus_object_, sequencer); + device_->Start(options, shill_client_.get(), peerd_client_.get(), + web_serv_client_.get(), &dbus_object_, sequencer); command_dispatcher_.reset(new DBusCommandDispacher{ dbus_object_.GetObjectManager(), device_->GetCommands()});
diff --git a/buffet/manager.h b/buffet/manager.h index c0037e9..880d753 100644 --- a/buffet/manager.h +++ b/buffet/manager.h
@@ -33,6 +33,7 @@ class DBusCommandDispacher; class PeerdClient; class ShillClient; +class WebServClient; template<typename... Types> using DBusMethodResponsePtr = @@ -117,8 +118,9 @@ org::chromium::Buffet::ManagerAdaptor dbus_adaptor_{this}; chromeos::dbus_utils::DBusObject dbus_object_; - std::unique_ptr<PeerdClient> peerd_client_; std::unique_ptr<ShillClient> shill_client_; + std::unique_ptr<PeerdClient> peerd_client_; + std::unique_ptr<WebServClient> web_serv_client_; std::unique_ptr<weave::Device> device_; std::unique_ptr<DBusCommandDispacher> command_dispatcher_;
diff --git a/libweave/src/privet/webserv_client.cc b/buffet/webserv_client.cc similarity index 92% rename from libweave/src/privet/webserv_client.cc rename to buffet/webserv_client.cc index b8ba74d..2ae5910 100644 --- a/libweave/src/privet/webserv_client.cc +++ b/buffet/webserv_client.cc
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "libweave/src/privet/webserv_client.h" -// +#include "buffet/webserv_client.h" + #include <memory> #include <string> @@ -14,12 +14,11 @@ #include "buffet/dbus_constants.h" -namespace weave { -namespace privet { +namespace buffet { namespace { -class RequestImpl : public HttpServer::Request { +class RequestImpl : public weave::HttpServer::Request { public: explicit RequestImpl(std::unique_ptr<libwebserv::Request> request) : request_{std::move(request)} {} @@ -46,9 +45,10 @@ web_server_->Disconnect(); } -void WebServClient::AddOnStateChangedCallback(const base::Closure& callback) { +void WebServClient::AddOnStateChangedCallback( + const OnStateChangedCallback& callback) { on_state_changed_callbacks_.push_back(callback); - callback.Run(); + callback.Run(*this); } void WebServClient::AddRequestHandler(const std::string& path_prefix, @@ -116,7 +116,7 @@ certificate_ = protocol_handler->GetCertificateFingerprint(); } for (const auto& cb : on_state_changed_callbacks_) - cb.Run(); + cb.Run(*this); } void WebServClient::OnProtocolHandlerDisconnected( @@ -129,8 +129,7 @@ certificate_.clear(); } for (const auto& cb : on_state_changed_callbacks_) - cb.Run(); + cb.Run(*this); } -} // namespace privet -} // namespace weave +} // namespace buffet
diff --git a/libweave/src/privet/webserv_client.h b/buffet/webserv_client.h similarity index 82% rename from libweave/src/privet/webserv_client.h rename to buffet/webserv_client.h index 43eb859..cbfbf23 100644 --- a/libweave/src/privet/webserv_client.h +++ b/buffet/webserv_client.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef LIBWEAVE_SRC_PRIVET_WEBSERV_CLIENT_H_ -#define LIBWEAVE_SRC_PRIVET_WEBSERV_CLIENT_H_ +#ifndef BUFFET_WEBSERV_CLIENT_H_ +#define BUFFET_WEBSERV_CLIENT_H_ #include <memory> #include <string> @@ -30,18 +30,18 @@ class Server; } -namespace weave { -namespace privet { +namespace buffet { // Wrapper around libwebserv that implements HttpServer interface. -class WebServClient : public HttpServer { +class WebServClient : public weave::HttpServer { public: WebServClient(const scoped_refptr<dbus::Bus>& bus, chromeos::dbus_utils::AsyncEventSequencer* sequencer); ~WebServClient() override; // HttpServer implementation. - void AddOnStateChangedCallback(const base::Closure& callback) override; + void AddOnStateChangedCallback( + const OnStateChangedCallback& callback) override; void AddRequestHandler(const std::string& path_prefix, const OnRequestCallback& callback) override; uint16_t GetHttpPort() const override; @@ -68,7 +68,7 @@ uint16_t https_port_{0}; chromeos::Blob certificate_; - std::vector<base::Closure> on_state_changed_callbacks_; + std::vector<OnStateChangedCallback> on_state_changed_callbacks_; std::unique_ptr<libwebserv::Server> web_server_; @@ -76,7 +76,6 @@ DISALLOW_COPY_AND_ASSIGN(WebServClient); }; -} // namespace privet -} // namespace weave +} // namespace buffet -#endif // LIBWEAVE_SRC_PRIVET_WEBSERV_CLIENT_H_ +#endif // BUFFET_WEBSERV_CLIENT_H_
diff --git a/libweave/include/weave/device.h b/libweave/include/weave/device.h index e7d9d7d..019bc74 100644 --- a/libweave/include/weave/device.h +++ b/libweave/include/weave/device.h
@@ -15,6 +15,7 @@ #include "weave/cloud.h" #include "weave/commands.h" #include "weave/config.h" +#include "weave/http_server.h" #include "weave/mdns.h" #include "weave/network.h" #include "weave/privet.h" @@ -46,8 +47,9 @@ virtual ~Device() = default; virtual void Start(const Options& options, - Mdns* mdns, Network* network, + Mdns* mdns, + HttpServer* http_server, chromeos::dbus_utils::DBusObject* dbus_object, chromeos::dbus_utils::AsyncEventSequencer* sequencer) = 0;
diff --git a/libweave/include/weave/http_server.h b/libweave/include/weave/http_server.h index db30252..59e7542 100644 --- a/libweave/include/weave/http_server.h +++ b/libweave/include/weave/http_server.h
@@ -26,6 +26,8 @@ virtual ~Request() = default; }; + using OnStateChangedCallback = base::Callback<void(const HttpServer& server)>; + using OnReplyCallback = base::Callback<void(int status_code, const std::string& data, const std::string& mime_type)>; @@ -35,7 +37,8 @@ const OnReplyCallback& callback)>; // Adds notification callback for server started/stopped serving requests. - virtual void AddOnStateChangedCallback(const base::Closure& callback) = 0; + virtual void AddOnStateChangedCallback( + const OnStateChangedCallback& callback) = 0; // Adds callback called on new http/https requests with the given path prefix. virtual void AddRequestHandler(const std::string& path_prefix,
diff --git a/libweave/src/device_manager.cc b/libweave/src/device_manager.cc index cd79a02..28d3c97 100644 --- a/libweave/src/device_manager.cc +++ b/libweave/src/device_manager.cc
@@ -31,15 +31,13 @@ DeviceManager::DeviceManager() {} -DeviceManager::~DeviceManager() { - if (privet_) - privet_->Shutdown(); -} +DeviceManager::~DeviceManager() {} void DeviceManager::Start( const Options& options, - Mdns* mdns, Network* network, + Mdns* mdns, + HttpServer* http_server, chromeos::dbus_utils::DBusObject* dbus_object, chromeos::dbus_utils::AsyncEventSequencer* sequencer) { command_manager_ = std::make_shared<CommandManager>(); @@ -67,8 +65,12 @@ device_info_->Start(); - if (!options.disable_privet) - StartPrivet(options, mdns, network, dbus_object, sequencer); + if (!options.disable_privet) { + StartPrivet(options, network, mdns, http_server, dbus_object, sequencer); + } else { + CHECK(!http_server); + CHECK(!mdns); + } } Commands* DeviceManager::GetCommands() { @@ -93,13 +95,15 @@ void DeviceManager::StartPrivet( const Options& options, - Mdns* mdns, Network* network, + Mdns* mdns, + HttpServer* http_server, chromeos::dbus_utils::DBusObject* dbus_object, chromeos::dbus_utils::AsyncEventSequencer* sequencer) { privet_.reset(new privet::Manager{}); - privet_->Start(options, dbus_object->GetBus(), network, device_info_.get(), - command_manager_.get(), state_manager_.get(), mdns, sequencer); + privet_->Start(options, dbus_object->GetBus(), network, mdns, http_server, + device_info_.get(), command_manager_.get(), + state_manager_.get(), sequencer); privet_->AddOnWifiSetupChangedCallback( base::Bind(&DeviceManager::OnWiFiBootstrapStateChanged,
diff --git a/libweave/src/device_manager.h b/libweave/src/device_manager.h index 2e0f00a..6f22fac 100644 --- a/libweave/src/device_manager.h +++ b/libweave/src/device_manager.h
@@ -34,8 +34,9 @@ ~DeviceManager() override; void Start(const Options& options, - Mdns* mdns, Network* network, + Mdns* mdns, + HttpServer* http_server, chromeos::dbus_utils::DBusObject* dbus_object, chromeos::dbus_utils::AsyncEventSequencer* sequencer) override; @@ -47,8 +48,9 @@ private: void StartPrivet(const Options& options, - Mdns* mdns, Network* network, + Mdns* mdns, + HttpServer* http_server, chromeos::dbus_utils::DBusObject* dbus_object, chromeos::dbus_utils::AsyncEventSequencer* sequencer);
diff --git a/libweave/src/privet/privet_manager.cc b/libweave/src/privet/privet_manager.cc index 3e9f604..c49eec3 100644 --- a/libweave/src/privet/privet_manager.cc +++ b/libweave/src/privet/privet_manager.cc
@@ -35,9 +35,7 @@ #include "libweave/src/privet/device_delegate.h" #include "libweave/src/privet/privet_handler.h" #include "libweave/src/privet/publisher.h" -#include "libweave/src/privet/webserv_client.h" #include "weave/network.h" -#include "weave/http_server.h" namespace weave { namespace privet { @@ -57,10 +55,11 @@ void Manager::Start(const Device::Options& options, const scoped_refptr<dbus::Bus>& bus, Network* network, + Mdns* mdns, + HttpServer* http_server, DeviceRegistrationInfo* device, CommandManager* command_manager, StateManager* state_manager, - Mdns* mdns, AsyncEventSequencer* sequencer) { disable_security_ = options.disable_security; @@ -88,14 +87,13 @@ new PrivetHandler(cloud_.get(), device_.get(), security_.get(), wifi_bootstrap_manager_.get(), publisher_.get())); - web_server_.reset(new WebServClient{bus, sequencer}); - web_server_->AddOnStateChangedCallback(base::Bind( + http_server->AddOnStateChangedCallback(base::Bind( &Manager::OnHttpServerStatusChanged, weak_ptr_factory_.GetWeakPtr())); - web_server_->AddRequestHandler("/privet/", + http_server->AddRequestHandler("/privet/", base::Bind(&Manager::PrivetRequestHandler, weak_ptr_factory_.GetWeakPtr())); if (options.enable_ping) { - web_server_->AddRequestHandler("/privet/ping", + http_server->AddRequestHandler("/privet/ping", base::Bind(&Manager::HelloWorldHandler, weak_ptr_factory_.GetWeakPtr())); } @@ -121,10 +119,6 @@ security_->RegisterPairingListeners(on_start, on_end); } -void Manager::Shutdown() { - web_server_.reset(); -} - void Manager::OnDeviceInfoChanged() { OnChanged(); } @@ -182,15 +176,14 @@ OnChanged(); } -void Manager::OnHttpServerStatusChanged() { - if (device_->GetHttpEnpoint().first != web_server_->GetHttpPort()) { - device_->SetHttpPort(web_server_->GetHttpPort()); - if (publisher_) +void Manager::OnHttpServerStatusChanged(const HttpServer& server) { + if (device_->GetHttpEnpoint().first != server.GetHttpPort()) { + device_->SetHttpPort(server.GetHttpPort()); + if (publisher_) // Only HTTP port is published publisher_->Update(); } - device_->SetHttpsPort(web_server_->GetHttpsPort()); - security_->SetCertificateFingerprint( - web_server_->GetHttpsCertificateFingerprint()); + device_->SetHttpsPort(server.GetHttpsPort()); + security_->SetCertificateFingerprint(server.GetHttpsCertificateFingerprint()); } } // namespace privet
diff --git a/libweave/src/privet/privet_manager.h b/libweave/src/privet/privet_manager.h index 29b803d..c6e6dd9 100644 --- a/libweave/src/privet/privet_manager.h +++ b/libweave/src/privet/privet_manager.h
@@ -17,7 +17,6 @@ #include "libweave/src/privet/security_manager.h" #include "libweave/src/privet/wifi_bootstrap_manager.h" #include "weave/device.h" -#include "weave/http_server.h" namespace chromeos { namespace dbus_utils { @@ -48,7 +47,6 @@ class PrivetHandler; class Publisher; class SecurityManager; -class WebServClient; class Manager : public Privet, public CloudDelegate::Observer { public: @@ -58,10 +56,11 @@ void Start(const weave::Device::Options& options, const scoped_refptr<dbus::Bus>& bus, Network* network, + Mdns* mdns, + HttpServer* http_server, DeviceRegistrationInfo* device, CommandManager* command_manager, StateManager* state_manager, - Mdns* mdns, chromeos::dbus_utils::AsyncEventSequencer* sequencer); std::string GetCurrentlyConnectedSsid() const; @@ -73,8 +72,6 @@ const OnPairingStartedCallback& on_start, const OnPairingEndedCallback& on_end) override; - void Shutdown(); - private: // CloudDelegate::Observer void OnDeviceInfoChanged() override; @@ -92,7 +89,7 @@ void OnChanged(); void OnConnectivityChanged(bool online); - void OnHttpServerStatusChanged(); + void OnHttpServerStatusChanged(const HttpServer& server); bool disable_security_{false}; std::unique_ptr<CloudDelegate> cloud_; @@ -102,8 +99,6 @@ std::unique_ptr<Publisher> publisher_; std::unique_ptr<PrivetHandler> privet_handler_; - std::unique_ptr<WebServClient> web_server_; - ScopedObserver<CloudDelegate, CloudDelegate::Observer> cloud_observer_{this}; base::WeakPtrFactory<Manager> weak_ptr_factory_{this};