|  | // 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_INCLUDE_WEAVE_PROVIDER_HTTP_CLIENT_H_ | 
|  | #define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_HTTP_CLIENT_H_ | 
|  |  | 
|  | #include <string> | 
|  | #include <utility> | 
|  | #include <vector> | 
|  |  | 
|  | #include <base/callback.h> | 
|  | #include <weave/error.h> | 
|  |  | 
|  | namespace weave { | 
|  | namespace provider { | 
|  |  | 
|  | // This interface should be implemented by the user of libweave and | 
|  | // provided during device creation in Device::Create(...) | 
|  | // libweave will use this interface to make HTTP/HTTPS calls to external | 
|  | // services. | 
|  | // | 
|  | // HttpClient interface has only one method SendRequest(...) to implement. | 
|  | // However, user code should also implement Response interface, that will be | 
|  | // passed into callback. | 
|  | // | 
|  | // Implementation of the SendRequest(...) method should make a proper | 
|  | // HTTP / HTTPS call according to the input parameters: | 
|  | //   method - of the supported methods (kGet, kPatch, kPost, kPut) which | 
|  | //     should map to the corresponding HTTP verb (GET, PATCH, POST, PUT) in | 
|  | //     the request. | 
|  | //   url - full URL including protocol, domain, path and parameters. Protocol | 
|  | //     may be "http" or "https". In case of "https", it is implementer's | 
|  | //     responsibility to establish a secure connection and verify endpoint | 
|  | //     certificate chain. libweave will attempt connecting to Google Weave | 
|  | //     servers. Proper root CA certificates should be available on the device. | 
|  | //   headers - list of HTTP request headers that should be attached to the | 
|  | //     request. | 
|  | //   data - binary data that should be sent within HTTP request body. Empty | 
|  | //     string means no data. Implementation needs to check for that. For | 
|  | //     example, kGet method should never have data. It is also possible to have | 
|  | //     no data for other methods as well. | 
|  | //   callback - standard callback to notify libweave when request is complete | 
|  | //     and provide results and response data. | 
|  | // | 
|  | // Implementation of the SendRequest(...) should be non-blocking, meaning it | 
|  | // should schedule network request and return right away. Later (after the | 
|  | // request is complete), callback should be invokes on the same thread. | 
|  | // Callback should never be called before SendRequest(...) returns. | 
|  | // | 
|  | // When invoking callback function, user should privide implementation | 
|  | // of the Response interface. For example, the following could be used as a | 
|  | // simple implementation: | 
|  | //   struct ResponseImpl : public provider::HttpClient::Response { | 
|  | //     int GetStatusCode() const override { return status; } | 
|  | //     std::string GetContentType() const override { return content_type; } | 
|  | //     std::string GetData() const override { return data; } | 
|  | //     int status{0}; | 
|  | //     std::string content_type; | 
|  | //     std::string data; | 
|  | //   }; | 
|  | // | 
|  | // See libweave/examples/provider/curl_http_client.cc for complete example | 
|  | // implementing HttpClient interface using curl. | 
|  |  | 
|  | class HttpClient { | 
|  | public: | 
|  | enum class Method { | 
|  | kGet, | 
|  | kPatch, | 
|  | kPost, | 
|  | kPut, | 
|  | }; | 
|  |  | 
|  | class Response { | 
|  | public: | 
|  | virtual int GetStatusCode() const = 0; | 
|  | virtual std::string GetContentType() const = 0; | 
|  | virtual std::string GetData() const = 0; | 
|  |  | 
|  | virtual ~Response() {} | 
|  | }; | 
|  |  | 
|  | using Headers = std::vector<std::pair<std::string, std::string>>; | 
|  | using SendRequestCallback = | 
|  | base::Callback<void(std::unique_ptr<Response> response, ErrorPtr error)>; | 
|  |  | 
|  | virtual void SendRequest(Method method, | 
|  | const std::string& url, | 
|  | const Headers& headers, | 
|  | const std::string& data, | 
|  | const SendRequestCallback& callback) = 0; | 
|  |  | 
|  | protected: | 
|  | virtual ~HttpClient() {} | 
|  | }; | 
|  |  | 
|  | }  // namespace provider | 
|  | }  // namespace weave | 
|  |  | 
|  | #endif  // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_HTTP_CLIENT_H_ |