Home | History | Annotate | Download | only in http
      1 // Copyright 2014 The Chromium OS Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef LIBBRILLO_BRILLO_HTTP_HTTP_CONNECTION_CURL_H_
      6 #define LIBBRILLO_BRILLO_HTTP_HTTP_CONNECTION_CURL_H_
      7 
      8 #include <map>
      9 #include <string>
     10 #include <vector>
     11 
     12 #include <base/macros.h>
     13 #include <brillo/brillo_export.h>
     14 #include <brillo/http/http_connection.h>
     15 #include <brillo/http/http_transport_curl.h>
     16 #include <curl/curl.h>
     17 
     18 namespace brillo {
     19 namespace http {
     20 namespace curl {
     21 
     22 // This is a libcurl-based implementation of http::Connection.
     23 class BRILLO_EXPORT Connection : public http::Connection {
     24  public:
     25   Connection(CURL* curl_handle,
     26              const std::string& method,
     27              const std::shared_ptr<CurlInterface>& curl_interface,
     28              const std::shared_ptr<http::Transport>& transport);
     29   ~Connection() override;
     30 
     31   // Overrides from http::Connection.
     32   // See http_connection.h for description of these methods.
     33   bool SendHeaders(const HeaderList& headers, brillo::ErrorPtr* error) override;
     34   bool SetRequestData(StreamPtr stream, brillo::ErrorPtr* error) override;
     35   void SetResponseData(StreamPtr stream) override;
     36   bool FinishRequest(brillo::ErrorPtr* error) override;
     37   RequestID FinishRequestAsync(
     38       const SuccessCallback& success_callback,
     39       const ErrorCallback& error_callback) override;
     40 
     41   int GetResponseStatusCode() const override;
     42   std::string GetResponseStatusText() const override;
     43   std::string GetProtocolVersion() const override;
     44   std::string GetResponseHeader(const std::string& header_name) const override;
     45   StreamPtr ExtractDataStream(brillo::ErrorPtr* error) override;
     46 
     47  protected:
     48   // Write data callback. Used by CURL when receiving response data.
     49   BRILLO_PRIVATE static size_t write_callback(char* ptr,
     50                                               size_t size,
     51                                               size_t num,
     52                                               void* data);
     53   // Read data callback. Used by CURL when sending request body data.
     54   BRILLO_PRIVATE static size_t read_callback(char* ptr,
     55                                              size_t size,
     56                                              size_t num,
     57                                              void* data);
     58   // Write header data callback. Used by CURL when receiving response headers.
     59   BRILLO_PRIVATE static size_t header_callback(char* ptr,
     60                                                size_t size,
     61                                                size_t num,
     62                                                void* data);
     63 
     64   // Helper method to set up the |curl_handle_| with all the parameters
     65   // pertaining to the current connection.
     66   BRILLO_PRIVATE void PrepareRequest();
     67 
     68   // HTTP request verb, such as "GET", "POST", "PUT", ...
     69   std::string method_;
     70 
     71   // Binary data for request body.
     72   StreamPtr request_data_stream_;
     73 
     74   // Received response data.
     75   StreamPtr response_data_stream_;
     76 
     77   // List of optional request headers provided by the caller.
     78   // After request has been sent, contains the received response headers.
     79   std::multimap<std::string, std::string> headers_;
     80 
     81   // HTTP protocol version, such as HTTP/1.1
     82   std::string protocol_version_;
     83   // Response status text, such as "OK" for 200, or "Forbidden" for 403
     84   std::string status_text_;
     85   // Flag used when parsing response headers to separate the response status
     86   // from the rest of response headers.
     87   bool status_text_set_{false};
     88 
     89   CURL* curl_handle_{nullptr};
     90   curl_slist* header_list_{nullptr};
     91 
     92   std::shared_ptr<CurlInterface> curl_interface_;
     93 
     94  private:
     95   friend class http::curl::Transport;
     96   DISALLOW_COPY_AND_ASSIGN(Connection);
     97 };
     98 
     99 }  // namespace curl
    100 }  // namespace http
    101 }  // namespace brillo
    102 
    103 #endif  // LIBBRILLO_BRILLO_HTTP_HTTP_CONNECTION_CURL_H_
    104