// Copyright 2014 The Chromium OS 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 BUFFET_HTTP_CONNECTION_CURL_H_
#define BUFFET_HTTP_CONNECTION_CURL_H_

#include <map>
#include <string>
#include <vector>

#include <base/basictypes.h>
#include <curl/curl.h>

#include "buffet/http_connection.h"

namespace buffet {
namespace http {
namespace curl {

// This is a libcurl-based implementation of http::Connection.
class Connection : public http::Connection {
 public:
  Connection(CURL* curl_handle, const std::string& method,
             std::shared_ptr<http::Transport> transport);
  virtual ~Connection();

  // Overrides from http::Connection.
  // See http_connection.h for description of these methods.
  virtual bool SendHeaders(const HeaderList& headers, ErrorPtr* error) override;
  virtual bool WriteRequestData(const void* data, size_t size,
                                ErrorPtr* error) override;
  virtual bool FinishRequest(ErrorPtr* error) override;

  virtual int GetResponseStatusCode() const override;
  virtual std::string GetResponseStatusText() const override;
  virtual std::string GetProtocolVersion() const override;
  virtual std::string GetResponseHeader(
     const std::string& header_name) const override;
  virtual uint64_t GetResponseDataSize() const override;
  virtual bool ReadResponseData(void* data, size_t buffer_size,
                                size_t* size_read, ErrorPtr* error) override;

 protected:
  // Write data callback. Used by CURL when receiving response data.
  static size_t write_callback(char* ptr, size_t size, size_t num, void* data);
  // Read data callback. Used by CURL when sending request body data.
  static size_t read_callback(char* ptr, size_t size, size_t num, void* data);
  // Write header data callback. Used by CURL when receiving response headers.
  static size_t header_callback(char* ptr, size_t size, size_t num, void* data);

  // HTTP request verb, such as "GET", "POST", "PUT", ...
  std::string method_;

  // Binary data for request body.
  std::vector<unsigned char> request_data_;
  // Read pointer for request data. Used when streaming data to the server.
  size_t request_data_ptr_ = 0;

  // Received response data.
  std::vector<unsigned char> response_data_;
  size_t response_data_ptr_ = 0;

  // List of optional request headers provided by the caller.
  // After request has been sent, contains the received response headers.
  std::map<std::string, std::string> headers_;

  // HTTP protocol version, such as HTTP/1.1
  std::string protocol_version_;
  // Response status text, such as "OK" for 200, or "Forbidden" for 403
  std::string status_text_;
  // Flag used when parsing response headers to separate the response status
  // from the rest of response headers.
  bool status_text_set_ = false;

  CURL* curl_handle_ = nullptr;

 private:
  DISALLOW_COPY_AND_ASSIGN(Connection);
};

}  // namespace curl
}  // namespace http
}  // namespace buffet

#endif  // BUFFET_HTTP_CONNECTION_CURL_H_
