Update weaved to reflect the latest changes in libweave
A number of APIs have changed in libweave and weaved is updated to
work with the latest version of the library. Some public D-Bus APIs
have changed as well to reflect the underlying libweave interfaces:
- Command::Done/SetProgress are replaced with Command::Complete
- Command::Abort now takes error code and error messages
- Command::category is removed
- Command::status is renamed to Command::state
- Manager::GetCommand is removed (since weave::Command::ToJson is
no longer available)
Change-Id: Iebf0565467756e8a21be37163d750ff22c419672
diff --git a/buffet/webserv_client.cc b/buffet/webserv_client.cc
index e79a6a4..4b464c8 100644
--- a/buffet/webserv_client.cc
+++ b/buffet/webserv_client.cc
@@ -23,12 +23,13 @@
class RequestImpl : public HttpServer::Request {
public:
- explicit RequestImpl(std::unique_ptr<libwebserv::Request> request)
- : request_{std::move(request)} {}
+ explicit RequestImpl(std::unique_ptr<libwebserv::Request> request,
+ std::unique_ptr<libwebserv::Response> response)
+ : request_{std::move(request)}, response_{std::move(response)} {}
~RequestImpl() override {}
// HttpServer::Request implementation.
- const std::string& GetPath() const override { return request_->GetPath(); }
+ std::string GetPath() const override { return request_->GetPath(); }
std::string GetFirstHeader(const std::string& name) const override {
return request_->GetFirstHeader(name);
@@ -36,27 +37,32 @@
// TODO(avakulenko): Remove this method and rewrite all call sites in libweave
// to use GetDataStream() instead.
- const std::vector<uint8_t>& GetData() const override {
+ std::string GetData() override {
if (request_data_)
return *request_data_;
- request_data_.reset(new std::vector<uint8_t>);
+ request_data_.reset(new std::string);
auto stream = request_->GetDataStream();
if (stream) {
if (stream->CanGetSize())
request_data_->reserve(stream->GetRemainingSize());
- std::vector<uint8_t> buffer(16 * 1024); // 16K seems to be good enough.
+ std::vector<char> buffer(16 * 1024); // 16K seems to be good enough.
size_t sz = 0;
while (stream->ReadBlocking(buffer.data(), buffer.size(), &sz, nullptr) &&
sz > 0) {
- request_data_->insert(request_data_->end(),
- buffer.data(), buffer.data() + sz);
+ request_data_->append(buffer.data(), buffer.data() + sz);
}
}
return *request_data_;
}
- std::unique_ptr<weave::Stream> GetDataStream() const override {
+ void SendReply(int status_code,
+ const std::string& data,
+ const std::string& mime_type) override {
+ response_->ReplyWithText(status_code, data, mime_type);
+ }
+
+ std::unique_ptr<weave::Stream> GetDataStream() const {
auto stream = std::unique_ptr<weave::Stream>{
new SocketStream{request_->GetDataStream()}};
return stream;
@@ -64,48 +70,19 @@
private:
std::unique_ptr<libwebserv::Request> request_;
- mutable std::unique_ptr<std::vector<uint8_t>> request_data_;
+ std::unique_ptr<libwebserv::Response> response_;
+ mutable std::unique_ptr<std::string> request_data_;
DISALLOW_COPY_AND_ASSIGN(RequestImpl);
};
} // namespace
-WebServClient::~WebServClient() {
- web_server_->Disconnect();
-}
-
-void WebServClient::AddOnStateChangedCallback(
- const OnStateChangedCallback& callback) {
- on_state_changed_callbacks_.push_back(callback);
- callback.Run(*this);
-}
-
-void WebServClient::AddRequestHandler(const std::string& path_prefix,
- const OnRequestCallback& callback) {
- web_server_->GetDefaultHttpHandler()->AddHandlerCallback(
- path_prefix, "", base::Bind(&WebServClient::OnRequest,
- weak_ptr_factory_.GetWeakPtr(), callback));
- web_server_->GetDefaultHttpsHandler()->AddHandlerCallback(
- path_prefix, "", base::Bind(&WebServClient::OnRequest,
- weak_ptr_factory_.GetWeakPtr(), callback));
-}
-
-uint16_t WebServClient::GetHttpPort() const {
- return http_port_;
-}
-
-uint16_t WebServClient::GetHttpsPort() const {
- return https_port_;
-}
-
-const chromeos::Blob& WebServClient::GetHttpsCertificateFingerprint() const {
- return certificate_;
-}
-
WebServClient::WebServClient(
const scoped_refptr<dbus::Bus>& bus,
- chromeos::dbus_utils::AsyncEventSequencer* sequencer) {
+ chromeos::dbus_utils::AsyncEventSequencer* sequencer,
+ const base::Closure& server_available_callback)
+ : server_available_callback_{server_available_callback} {
web_server_.reset(new libwebserv::Server);
web_server_->OnProtocolHandlerConnected(
base::Bind(&WebServClient::OnProtocolHandlerConnected,
@@ -120,20 +97,44 @@
base::Bind(&base::DoNothing));
}
-void WebServClient::OnRequest(const OnRequestCallback& callback,
- std::unique_ptr<libwebserv::Request> request,
- std::unique_ptr<libwebserv::Response> response) {
- callback.Run(
- RequestImpl{std::move(request)},
- base::Bind(&WebServClient::OnResponse, weak_ptr_factory_.GetWeakPtr(),
- base::Passed(&response)));
+WebServClient::~WebServClient() {
+ web_server_->Disconnect();
}
-void WebServClient::OnResponse(std::unique_ptr<libwebserv::Response> response,
- int status_code,
- const std::string& data,
- const std::string& mime_type) {
- response->ReplyWithText(status_code, data, mime_type);
+void WebServClient::AddHttpRequestHandler(
+ const std::string& path,
+ const RequestHandlerCallback& callback) {
+ web_server_->GetDefaultHttpHandler()->AddHandlerCallback(
+ path, "", base::Bind(&WebServClient::OnRequest,
+ weak_ptr_factory_.GetWeakPtr(), callback));
+}
+
+void WebServClient::AddHttpsRequestHandler(
+ const std::string& path,
+ const RequestHandlerCallback& callback) {
+ web_server_->GetDefaultHttpsHandler()->AddHandlerCallback(
+ path, "", base::Bind(&WebServClient::OnRequest,
+ weak_ptr_factory_.GetWeakPtr(), callback));
+}
+
+uint16_t WebServClient::GetHttpPort() const {
+ return http_port_;
+}
+
+uint16_t WebServClient::GetHttpsPort() const {
+ return https_port_;
+}
+
+chromeos::Blob WebServClient::GetHttpsCertificateFingerprint() const {
+ return certificate_;
+}
+
+void WebServClient::OnRequest(const RequestHandlerCallback& callback,
+ std::unique_ptr<libwebserv::Request> request,
+ std::unique_ptr<libwebserv::Response> response) {
+ std::unique_ptr<Request> weave_request{
+ new RequestImpl{std::move(request), std::move(response)}};
+ callback.Run(std::move(weave_request));
}
void WebServClient::OnProtocolHandlerConnected(
@@ -145,8 +146,8 @@
https_port_ = *protocol_handler->GetPorts().begin();
certificate_ = protocol_handler->GetCertificateFingerprint();
}
- for (const auto& cb : on_state_changed_callbacks_)
- cb.Run(*this);
+ if (https_port_ && https_port_)
+ server_available_callback_.Run();
}
void WebServClient::OnProtocolHandlerDisconnected(
@@ -158,8 +159,6 @@
https_port_ = 0;
certificate_.clear();
}
- for (const auto& cb : on_state_changed_callbacks_)
- cb.Run(*this);
}
} // namespace buffet