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

#include "buffet/http_transport_curl.h"

#include <base/logging.h>

#include "buffet/http_connection_curl.h"
#include "buffet/http_request.h"

using chromeos::http::curl::Transport;
using chromeos::Error;

namespace chromeos {

const char http::curl::kErrorDomain[] = "http_transport";

Transport::Transport() {
  VLOG(1) << "curl::Transport created";
}

Transport::~Transport() {
  VLOG(1) << "curl::Transport destroyed";
}

std::unique_ptr<http::Connection> Transport::CreateConnection(
    std::shared_ptr<http::Transport> transport,
    const std::string& url,
    const std::string& method,
    const HeaderList& headers,
    const std::string& user_agent,
    const std::string& referer,
    ErrorPtr* error) {
  CURL* curl_handle = curl_easy_init();
  if (!curl_handle) {
    LOG(ERROR) << "Failed to initialize CURL";
    Error::AddTo(error, http::curl::kErrorDomain, "curl_init_failed",
                 "Failed to initialize CURL");
    return std::unique_ptr<http::Connection>();
  }

  LOG(INFO) << "Sending a " << method << " request to " << url;
  curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str());

  if (!user_agent.empty()) {
    curl_easy_setopt(curl_handle,
                     CURLOPT_USERAGENT, user_agent.c_str());
  }

  if (!referer.empty()) {
    curl_easy_setopt(curl_handle,
                     CURLOPT_REFERER, referer.c_str());
  }

  // Setup HTTP request method and optional request body.
  if (method ==  request_type::kGet) {
    curl_easy_setopt(curl_handle, CURLOPT_HTTPGET, 1L);
  } else if (method == request_type::kHead) {
    curl_easy_setopt(curl_handle, CURLOPT_NOBODY, 1L);
  } else if (method == request_type::kPut) {
    curl_easy_setopt(curl_handle, CURLOPT_UPLOAD, 1L);
  } else {
    // POST and custom request methods
    curl_easy_setopt(curl_handle, CURLOPT_POST, 1L);
    curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, nullptr);
    if (method != request_type::kPost)
      curl_easy_setopt(curl_handle, CURLOPT_CUSTOMREQUEST, method.c_str());
  }

  std::unique_ptr<http::Connection> connection(
      new http::curl::Connection(curl_handle, method, transport));
  CHECK(connection) << "Unable to create Connection object";
  if (!connection->SendHeaders(headers, error)) {
    connection.reset();
  }
  return connection;
}

}  // namespace chromeos
