| // Copyright 2016 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. |
| |
| #include <base/bind.h> |
| #include <base/macros.h> |
| #include <brillo/mime_utils.h> |
| #include <brillo/syslog_logging.h> |
| #include <libwebserv/protocol_handler.h> |
| #include <libwebserv/request_handler_interface.h> |
| #include <libwebserv/server.h> |
| #include <sysexits.h> |
| |
| #if defined(WEBSERV_USE_DBUS) |
| |
| #include <brillo/daemons/dbus_daemon.h> |
| #include <brillo/dbus/async_event_sequencer.h> |
| |
| // If we're using DBus, pick a base class that does DBus related init. |
| using WebservTestClientBaseClass = brillo::DBusDaemon; |
| using brillo::dbus_utils::AsyncEventSequencer; |
| |
| #elif defined(WEBSERV_USE_BINDER) |
| |
| #include <brillo/daemons/daemon.h> |
| using WebservTestClientBaseClass = brillo::Daemon; |
| |
| #else |
| #error "You must select one of Binder or DBus as an RPC mechanism." |
| #endif // defined(WEBSERV_USE_DBUS) |
| |
| using libwebserv::Server; |
| using libwebserv::ProtocolHandler; |
| using libwebserv::RequestHandlerInterface; |
| using libwebserv::Request; |
| using libwebserv::Response; |
| |
| namespace { |
| |
| void LogServerOnlineStatus(bool online) { |
| LOG(INFO) << "Webserver is " |
| << ((online) ? "online" : "offline"); |
| } |
| |
| class PingRequestHandler : public RequestHandlerInterface { |
| public: |
| static const char kMethods[]; |
| static const char kResponse[]; |
| static const char kUrl[]; |
| |
| ~PingRequestHandler() override = default; |
| void HandleRequest(std::unique_ptr<Request> /* request */, |
| std::unique_ptr<Response> response) override { |
| response->ReplyWithText(200, kResponse, brillo::mime::text::kPlain); |
| } |
| }; // class PingRequestHandler |
| |
| const char PingRequestHandler::kMethods[] = ""; // all methods |
| const char PingRequestHandler::kResponse[] = "Still alive, still alive!\n"; |
| const char PingRequestHandler::kUrl[] = "/webservd-test-client/ping"; |
| |
| class WebservTestClient : public WebservTestClientBaseClass { |
| public: |
| WebservTestClient() = default; |
| ~WebservTestClient() override = default; |
| |
| protected: |
| int OnInit() override { |
| int exit_code = WebservTestClientBaseClass::OnInit(); |
| if (exit_code != EX_OK) |
| return exit_code; |
| |
| #ifdef WEBSERV_USE_DBUS |
| webserver_ = Server::ConnectToServerViaDBus( |
| bus_, bus_->GetConnectionName(), |
| AsyncEventSequencer::GetDefaultCompletionAction(), |
| base::Bind(&LogServerOnlineStatus, true /* online */), |
| base::Bind(&LogServerOnlineStatus, false /* offline */)); |
| #else |
| #error "No alteratives to DBus are currently implemented!" |
| #endif // WEBSERV_USE_DBUS |
| |
| // Note that adding this handler is only local, and we won't receive |
| // requests until the library does some async book keeping. |
| ProtocolHandler* http_handler = webserver_->GetDefaultHttpHandler(); |
| http_handler->AddHandler( |
| PingRequestHandler::kUrl, |
| PingRequestHandler::kMethods, |
| std::unique_ptr<RequestHandlerInterface>(new PingRequestHandler())); |
| |
| return exit_code; |
| } |
| |
| private: |
| std::unique_ptr<Server> webserver_; |
| |
| DISALLOW_COPY_AND_ASSIGN(WebservTestClient); |
| }; // class WebservTestClient |
| |
| } // namespace |
| |
| int main(int /* argc */, char* /* argv */[]) { |
| brillo::InitLog(brillo::kLogToSyslog | brillo::kLogHeader); |
| WebservTestClient client; |
| return client.Run(); |
| } |