// Copyright 2015 The Weave Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef LIBWEAVE_EXAMPLES_PROVIDER_EVENT_HTTP_SERVER_H_ #define LIBWEAVE_EXAMPLES_PROVIDER_EVENT_HTTP_SERVER_H_ #include <evhtp.h> #include <openssl/ssl.h> #include <map> #include <string> #include <vector> #include <base/memory/weak_ptr.h> #include <weave/provider/http_server.h> #include "examples/provider/event_deleter.h" namespace weave { namespace examples { class EventTaskRunner; // HTTP/HTTPS server implemented with libevhtp. class HttpServerImpl : public provider::HttpServer { public: class RequestImpl; explicit HttpServerImpl(EventTaskRunner* task_runner); void AddHttpRequestHandler(const std::string& path_prefix, const RequestHandlerCallback& callback) override; void AddHttpsRequestHandler(const std::string& path_prefix, const RequestHandlerCallback& callback) override; uint16_t GetHttpPort() const override; uint16_t GetHttpsPort() const override; base::TimeDelta GetRequestTimeout() const override; std::vector<uint8_t> GetHttpsCertificateFingerprint() const override; private: void GenerateX509(X509* x509, EVP_PKEY* pkey); static void ProcessRequestCallback(evhtp_request_t* req, void* arg); void ProcessRequest(evhtp_request_t* req); void ProcessReply(std::shared_ptr<RequestImpl> request, int status_code, const std::string& data, const std::string& mime_type); void NotFound(evhtp_request_t* req); std::map<std::string, RequestHandlerCallback> handlers_; std::vector<uint8_t> cert_fingerprint_; EventTaskRunner* task_runner_{nullptr}; EventPtr<evhtp_t> httpd_; EventPtr<evhtp_t> httpsd_; base::WeakPtrFactory<HttpServerImpl> weak_ptr_factory_{this}; }; } // namespace examples } // namespace weave #endif // LIBWEAVE_EXAMPLES_PROVIDER_EVENT_HTTP_SERVER_H_