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};