// 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_