1cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// Copyright 2015 The Android Open Source Project
2cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka//
3cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// Licensed under the Apache License, Version 2.0 (the "License");
4cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// you may not use this file except in compliance with the License.
5cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// You may obtain a copy of the License at
6cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka//
7cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka//      http://www.apache.org/licenses/LICENSE-2.0
8cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka//
9cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// Unless required by applicable law or agreed to in writing, software
10cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// distributed under the License is distributed on an "AS IS" BASIS,
11cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// See the License for the specific language governing permissions and
13cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// limitations under the License.
14974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka
15974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka#ifndef BUFFET_WEBSERV_CLIENT_H_
16974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka#define BUFFET_WEBSERV_CLIENT_H_
17974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka
18974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka#include <memory>
19974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka#include <string>
20974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka#include <vector>
21974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka
22974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka#include <base/memory/weak_ptr.h>
23e32375bdf73d6e79a003a194e4c6931f38348520Alex Vakulenko#include <weave/provider/http_server.h>
24974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka
25974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Bukanamespace dbus {
26974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Bukaclass Bus;
27974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka}
28974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka
294170585fe75d99036883229081420f2972dd4ec1Alex Vakulenkonamespace brillo {
30974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Bukanamespace dbus_utils {
31974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Bukaclass AsyncEventSequencer;
32974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka}
33974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka}
34974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka
35974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Bukanamespace libwebserv {
36974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Bukaclass ProtocolHandler;
37974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Bukaclass Request;
38974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Bukaclass Response;
39974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Bukaclass Server;
40974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka}
41974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka
42974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Bukanamespace buffet {
43974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka
44974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka// Wrapper around libwebserv that implements HttpServer interface.
45e32375bdf73d6e79a003a194e4c6931f38348520Alex Vakulenkoclass WebServClient : public weave::provider::HttpServer {
46974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka public:
47974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka  WebServClient(const scoped_refptr<dbus::Bus>& bus,
484170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko                brillo::dbus_utils::AsyncEventSequencer* sequencer,
49be39e9339baa85af546344da40b0663a6aea1a97Alex Vakulenko                const base::Closure& server_available_callback);
50974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka  ~WebServClient() override;
51974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka
52974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka  // HttpServer implementation.
53be39e9339baa85af546344da40b0663a6aea1a97Alex Vakulenko  void AddHttpRequestHandler(const std::string& path,
54be39e9339baa85af546344da40b0663a6aea1a97Alex Vakulenko                             const RequestHandlerCallback& callback) override;
55be39e9339baa85af546344da40b0663a6aea1a97Alex Vakulenko  void AddHttpsRequestHandler(const std::string& path,
56be39e9339baa85af546344da40b0663a6aea1a97Alex Vakulenko                              const RequestHandlerCallback& callback) override;
57be39e9339baa85af546344da40b0663a6aea1a97Alex Vakulenko
58974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka  uint16_t GetHttpPort() const override;
59974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka  uint16_t GetHttpsPort() const override;
60a071cd996580856476e6b9c3d4d91d1599155c33Alex Vakulenko  base::TimeDelta GetRequestTimeout() const override;
61be39e9339baa85af546344da40b0663a6aea1a97Alex Vakulenko  std::vector<uint8_t> GetHttpsCertificateFingerprint() const override;
62974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka
63974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka private:
64be39e9339baa85af546344da40b0663a6aea1a97Alex Vakulenko  void OnRequest(const RequestHandlerCallback& callback,
65974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka                 std::unique_ptr<libwebserv::Request> request,
66974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka                 std::unique_ptr<libwebserv::Response> response);
67974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka
68974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka  void OnProtocolHandlerConnected(
69974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka      libwebserv::ProtocolHandler* protocol_handler);
70974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka
71974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka  void OnProtocolHandlerDisconnected(
72974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka      libwebserv::ProtocolHandler* protocol_handler);
73974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka
74974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka  uint16_t http_port_{0};
75974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka  uint16_t https_port_{0};
76097cbd75338995cc8c0238f157d7e4e967a11e6fVitaly Buka  std::vector<uint8_t> certificate_;
77974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka
78974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka  std::unique_ptr<libwebserv::Server> web_server_;
79be39e9339baa85af546344da40b0663a6aea1a97Alex Vakulenko  base::Closure server_available_callback_;
80974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka
81974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka  base::WeakPtrFactory<WebServClient> weak_ptr_factory_{this};
82974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka  DISALLOW_COPY_AND_ASSIGN(WebServClient);
83974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka};
84974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka
85974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka}  // namespace buffet
86974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka
87974647f515aa53bc3063c15ca43b6a94e246ae49Vitaly Buka#endif  // BUFFET_WEBSERV_CLIENT_H_
88