libchromeos: Move http_utils from Buffet to libchromeos
http_utils have dependency on libcurl, so not to add this
dependency onto libchromeos-core, created a new sub-library,
libchromeos-http where all http_utils production code goes.
There are some fake classes used for testing purposes,
so added them to a new static library, libchromeos-test-271506.a
and created a separate package for it, so that other
components can link to this test library when then needed,
independently from the rest of libchromeos.
BUG=chromium:405714
TEST=USE=buffet ./build_packages
CQ-DEPEND=CL:213562
Change-Id: I37fab53fd5ccfc824b62555869e7581f99aca41c
Reviewed-on: https://chromium-review.googlesource.com/213366
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Reviewed-by: Ben Chan <benchan@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/buffet.gyp b/buffet/buffet.gyp
index f02e494..63fde02 100644
--- a/buffet/buffet.gyp
+++ b/buffet/buffet.gyp
@@ -5,7 +5,6 @@
'dbus-1',
'libchrome-<(libbase_ver)',
'libchromeos-<(libbase_ver)',
- 'libcurl',
'libmetrics-<(libbase_ver)',
],
},
@@ -29,10 +28,6 @@
'commands/schema_utils.cc',
'dbus_constants.cc',
'device_registration_info.cc',
- 'http_request.cc',
- 'http_connection_curl.cc',
- 'http_transport_curl.cc',
- 'http_utils.cc',
'manager.cc',
'storage_impls.cc',
],
@@ -71,6 +66,7 @@
'variables': {
'deps': [
'libchrome-test-<(libbase_ver)',
+ 'libchromeos-test-<(libbase_ver)',
],
},
'includes': ['../common-mk/common_test.gypi'],
@@ -86,9 +82,6 @@
'commands/schema_utils_unittest.cc',
'commands/unittest_utils.cc',
'device_registration_info_unittest.cc',
- 'http_connection_fake.cc',
- 'http_transport_fake.cc',
- 'http_utils_unittest.cc',
],
},
],
diff --git a/buffet/device_registration_info.cc b/buffet/device_registration_info.cc
index a1cb374..7677a89 100644
--- a/buffet/device_registration_info.cc
+++ b/buffet/device_registration_info.cc
@@ -11,6 +11,8 @@
#include <base/json/json_writer.h>
#include <base/values.h>
#include <chromeos/data_encoding.h>
+#include <chromeos/http_transport_curl.h>
+#include <chromeos/http_utils.h>
#include <chromeos/mime_utils.h>
#include <chromeos/string_utils.h>
#include <chromeos/url_utils.h>
@@ -18,8 +20,6 @@
#include "buffet/commands/command_definition.h"
#include "buffet/commands/command_manager.h"
#include "buffet/device_registration_storage_keys.h"
-#include "buffet/http_transport_curl.h"
-#include "buffet/http_utils.h"
#include "buffet/storage_impls.h"
const char buffet::kErrorDomainOAuth2[] = "oauth2";
@@ -69,14 +69,14 @@
const std::string& access_token) {
std::string authorization =
chromeos::string_utils::Join(' ', access_token_type, access_token);
- return {buffet::http::request_header::kAuthorization, authorization};
+ return {chromeos::http::request_header::kAuthorization, authorization};
}
std::unique_ptr<base::DictionaryValue> ParseOAuthResponse(
- const buffet::http::Response* response, chromeos::ErrorPtr* error) {
+ const chromeos::http::Response* response, chromeos::ErrorPtr* error) {
int code = 0;
- auto resp = buffet::http::ParseJsonResponse(response, &code, error);
- if (resp && code >= buffet::http::status_code::BadRequest) {
+ auto resp = chromeos::http::ParseJsonResponse(response, &code, error);
+ if (resp && code >= chromeos::http::status_code::BadRequest) {
if (error) {
std::string error_code, error_message;
if (resp->GetString("error", &error_code) &&
@@ -143,7 +143,7 @@
DeviceRegistrationInfo::DeviceRegistrationInfo(
const std::shared_ptr<CommandManager>& command_manager)
- : transport_(new http::curl::Transport()),
+ : transport_(new chromeos::http::curl::Transport()),
// TODO(avakulenko): Figure out security implications of storing
// this data unencrypted.
storage_(new FileStorage(base::FilePath(kDeviceInfoFilePath))),
@@ -152,7 +152,7 @@
DeviceRegistrationInfo::DeviceRegistrationInfo(
const std::shared_ptr<CommandManager>& command_manager,
- const std::shared_ptr<http::Transport>& transport,
+ const std::shared_ptr<chromeos::http::Transport>& transport,
const std::shared_ptr<StorageInterface>& storage)
: transport_(transport),
storage_(storage),
@@ -269,7 +269,7 @@
return true;
}
- auto response = http::PostFormData(GetOAuthURL("token"), {
+ auto response = chromeos::http::PostFormData(GetOAuthURL("token"), {
{"refresh_token", refresh_token_},
{"client_id", client_id_},
{"client_secret", client_secret_},
@@ -307,13 +307,13 @@
if (!CheckRegistration(error))
return std::unique_ptr<base::Value>();
- auto response = http::Get(GetDeviceURL(),
- {GetAuthorizationHeader()}, transport_, error);
+ auto response = chromeos::http::Get(
+ GetDeviceURL(), {GetAuthorizationHeader()}, transport_, error);
int status_code = 0;
std::unique_ptr<base::DictionaryValue> json =
- http::ParseJsonResponse(response.get(), &status_code, error);
+ chromeos::http::ParseJsonResponse(response.get(), &status_code, error);
if (json) {
- if (status_code >= http::status_code::BadRequest) {
+ if (status_code >= chromeos::http::status_code::BadRequest) {
LOG(WARNING) << "Failed to retrieve the device info. Response code = "
<< status_code;
ParseGCDError(json.get(), error);
@@ -377,8 +377,9 @@
req_json.Set("deviceDraft.commandDefs", commands.release());
std::string url = GetServiceURL("registrationTickets", {{"key", api_key_}});
- auto resp_json = http::ParseJsonResponse(
- http::PostJson(url, &req_json, transport_, error).get(), nullptr, error);
+ auto resp_json = chromeos::http::ParseJsonResponse(
+ chromeos::http::PostJson(url, &req_json, transport_, error).get(),
+ nullptr, error);
if (!resp_json)
return std::string();
@@ -415,9 +416,9 @@
}
std::string url = GetServiceURL("registrationTickets/" + ticket_id_);
- std::unique_ptr<http::Response> response;
+ std::unique_ptr<chromeos::http::Response> response;
if (!user_auth_code.empty()) {
- response = http::PostFormData(GetOAuthURL("token"), {
+ response = chromeos::http::PostFormData(GetOAuthURL("token"), {
{"code", user_auth_code},
{"client_id", client_id_},
{"client_secret", client_secret_},
@@ -442,11 +443,12 @@
base::DictionaryValue user_info;
user_info.SetString("userEmail", "me");
- response = http::PatchJson(
+ response = chromeos::http::PatchJson(
url, &user_info, {BuildAuthHeader(token_type, user_access_token)},
transport_, error);
- auto json = http::ParseJsonResponse(response.get(), nullptr, error);
+ auto json = chromeos::http::ParseJsonResponse(response.get(), nullptr,
+ error);
if (!json)
return false;
}
@@ -454,10 +456,11 @@
std::string auth_code;
url += "/finalize?key=" + api_key_;
LOG(INFO) << "Sending request to: " << url;
- response = http::PostBinary(url, nullptr, 0, transport_, error);
+ response = chromeos::http::PostBinary(url, nullptr, 0, transport_, error);
if (!response)
return false;
- auto json_resp = http::ParseJsonResponse(response.get(), nullptr, error);
+ auto json_resp = chromeos::http::ParseJsonResponse(response.get(), nullptr,
+ error);
if (!json_resp)
return false;
if (!response->IsSuccessful()) {
@@ -473,7 +476,7 @@
}
// Now get access_token and refresh_token
- response = http::PostFormData(GetOAuthURL("token"), {
+ response = chromeos::http::PostFormData(GetOAuthURL("token"), {
{"code", auth_code},
{"client_id", client_id_},
{"client_secret", client_secret_},
diff --git a/buffet/device_registration_info.h b/buffet/device_registration_info.h
index 1f7d1fb..dc58eda 100644
--- a/buffet/device_registration_info.h
+++ b/buffet/device_registration_info.h
@@ -14,8 +14,8 @@
#include <base/time/time.h>
#include <chromeos/data_encoding.h>
#include <chromeos/error.h>
+#include <chromeos/http_transport.h>
-#include "buffet/http_transport.h"
#include "buffet/storage_interface.h"
namespace base {
@@ -41,9 +41,10 @@
const std::shared_ptr<CommandManager>& command_manager);
// This constructor allows to pass in a custom HTTP transport
// (mainly for testing).
- DeviceRegistrationInfo(const std::shared_ptr<CommandManager>& command_manager,
- const std::shared_ptr<http::Transport>& transport,
- const std::shared_ptr<StorageInterface>& storage);
+ DeviceRegistrationInfo(
+ const std::shared_ptr<CommandManager>& command_manager,
+ const std::shared_ptr<chromeos::http::Transport>& transport,
+ const std::shared_ptr<StorageInterface>& storage);
// Returns the authorization HTTP header that can be used to talk
// to GCD server for authenticated device communication.
@@ -138,7 +139,7 @@
std::string display_name_ = "Coffee Pot";
// HTTP transport used for communications.
- std::shared_ptr<http::Transport> transport_;
+ std::shared_ptr<chromeos::http::Transport> transport_;
// Serialization interface to save and load device registration info.
std::shared_ptr<StorageInterface> storage_;
// Global command manager.
diff --git a/buffet/device_registration_info_unittest.cc b/buffet/device_registration_info_unittest.cc
index 779e29e..27aeaa0 100644
--- a/buffet/device_registration_info_unittest.cc
+++ b/buffet/device_registration_info_unittest.cc
@@ -5,6 +5,8 @@
#include <base/json/json_reader.h>
#include <base/values.h>
#include <chromeos/bind_lambda.h>
+#include <chromeos/http_request.h>
+#include <chromeos/http_transport_fake.h>
#include <chromeos/mime_utils.h>
#include <gtest/gtest.h>
@@ -12,12 +14,13 @@
#include "buffet/commands/unittest_utils.h"
#include "buffet/device_registration_info.h"
#include "buffet/device_registration_storage_keys.h"
-#include "buffet/http_request.h"
-#include "buffet/http_transport_fake.h"
#include "buffet/storage_impls.h"
-using namespace buffet; // NOLINT(build/namespaces)
-using namespace buffet::http; // NOLINT(build/namespaces)
+using chromeos::http::request_header::kAuthorization;
+using chromeos::http::fake::ServerRequest;
+using chromeos::http::fake::ServerResponse;
+
+namespace buffet {
namespace {
@@ -69,8 +72,7 @@
data->SetString(storage_keys::kRobotAccount, test_data::kRobotAccountEmail);
}
-void OAuth2Handler(const fake::ServerRequest& request,
- fake::ServerResponse* response) {
+void OAuth2Handler(const ServerRequest& request, ServerResponse* response) {
base::DictionaryValue json;
if (request.GetFormField("grant_type") == "refresh_token") {
// Refresh device access token.
@@ -109,15 +111,15 @@
FAIL() << "Unexpected grant type";
}
json.SetInteger("expires_in", 3600);
- response->ReplyJson(status_code::Ok, &json);
+ response->ReplyJson(chromeos::http::status_code::Ok, &json);
}
-void DeviceInfoHandler(const fake::ServerRequest& request,
- fake::ServerResponse* response) {
+void DeviceInfoHandler(const ServerRequest& request, ServerResponse* response) {
std::string auth = "Bearer ";
auth += test_data::kAccessToken;
- EXPECT_EQ(auth, request.GetHeader(http::request_header::kAuthorization));
- response->ReplyJson(status_code::Ok, {
+ EXPECT_EQ(auth,
+ request.GetHeader(chromeos::http::request_header::kAuthorization));
+ response->ReplyJson(chromeos::http::status_code::Ok, {
{"channel.supportedType", "xmpp"},
{"deviceKind", "vendor"},
{"id", test_data::kDeviceId},
@@ -125,12 +127,12 @@
});
}
-void FinalizeTicketHandler(const fake::ServerRequest& request,
- fake::ServerResponse* response) {
+void FinalizeTicketHandler(const ServerRequest& request,
+ ServerResponse* response) {
EXPECT_EQ(test_data::kApiKey, request.GetFormField("key"));
EXPECT_TRUE(request.GetData().empty());
- response->ReplyJson(status_code::Ok, {
+ response->ReplyJson(chromeos::http::status_code::Ok, {
{"id", test_data::kClaimTicketId},
{"kind", "clouddevices#registrationTicket"},
{"oauthClientId", test_data::kClientId},
@@ -161,7 +163,7 @@
InitDefaultStorage(&data_);
storage_ = std::make_shared<MemStorage>();
storage_->Save(&data_);
- transport_ = std::make_shared<fake::Transport>();
+ transport_ = std::make_shared<chromeos::http::fake::Transport>();
command_manager_ = std::make_shared<CommandManager>();
dev_reg_ = std::unique_ptr<DeviceRegistrationInfo>(
new DeviceRegistrationInfo(command_manager_, transport_, storage_));
@@ -169,7 +171,7 @@
base::DictionaryValue data_;
std::shared_ptr<MemStorage> storage_;
- std::shared_ptr<fake::Transport> transport_;
+ std::shared_ptr<chromeos::http::fake::Transport> transport_;
std::unique_ptr<DeviceRegistrationInfo> dev_reg_;
std::shared_ptr<CommandManager> command_manager_;
};
@@ -219,7 +221,8 @@
storage_->Save(&data_);
EXPECT_TRUE(dev_reg_->Load());
- transport_->AddHandler(dev_reg_->GetOAuthURL("token"), request_type::kPost,
+ transport_->AddHandler(dev_reg_->GetOAuthURL("token"),
+ chromeos::http::request_type::kPost,
base::Bind(OAuth2Handler));
transport_->ResetRequestCount();
EXPECT_TRUE(dev_reg_->CheckRegistration(nullptr));
@@ -231,9 +234,11 @@
storage_->Save(&data_);
EXPECT_TRUE(dev_reg_->Load());
- transport_->AddHandler(dev_reg_->GetOAuthURL("token"), request_type::kPost,
+ transport_->AddHandler(dev_reg_->GetOAuthURL("token"),
+ chromeos::http::request_type::kPost,
base::Bind(OAuth2Handler));
- transport_->AddHandler(dev_reg_->GetDeviceURL(), request_type::kGet,
+ transport_->AddHandler(dev_reg_->GetDeviceURL(),
+ chromeos::http::request_type::kGet,
base::Bind(DeviceInfoHandler));
transport_->ResetRequestCount();
auto device_info = dev_reg_->GetDeviceInfo(nullptr);
@@ -251,9 +256,11 @@
storage_->Save(&data_);
EXPECT_TRUE(dev_reg_->Load());
- transport_->AddHandler(dev_reg_->GetOAuthURL("token"), request_type::kPost,
+ transport_->AddHandler(dev_reg_->GetOAuthURL("token"),
+ chromeos::http::request_type::kPost,
base::Bind(OAuth2Handler));
- transport_->AddHandler(dev_reg_->GetDeviceURL(), request_type::kGet,
+ transport_->AddHandler(dev_reg_->GetDeviceURL(),
+ chromeos::http::request_type::kGet,
base::Bind(DeviceInfoHandler));
std::string id = dev_reg_->GetDeviceId(nullptr);
EXPECT_EQ(test_data::kDeviceId, id);
@@ -262,8 +269,8 @@
TEST_F(DeviceRegistrationInfoTest, StartRegistration) {
EXPECT_TRUE(dev_reg_->Load());
- auto create_ticket = [](const fake::ServerRequest& request,
- fake::ServerResponse* response) {
+ auto create_ticket = [](const ServerRequest& request,
+ ServerResponse* response) {
EXPECT_EQ(test_data::kApiKey, request.GetFormField("key"));
auto json = request.GetDataAsJson();
EXPECT_NE(nullptr, json.get());
@@ -294,7 +301,7 @@
device_draft->SetString("kind", "clouddevices#device");
json_resp.Set("deviceDraft", device_draft);
- response->ReplyJson(status_code::Ok, &json_resp);
+ response->ReplyJson(chromeos::http::status_code::Ok, &json_resp);
};
auto json_base = buffet::unittests::CreateDictionaryValue(R"({
@@ -323,7 +330,7 @@
EXPECT_TRUE(command_manager_->LoadCommands(*json_cmds, "", nullptr));
transport_->AddHandler(dev_reg_->GetServiceURL("registrationTickets"),
- request_type::kPost,
+ chromeos::http::request_type::kPost,
base::Bind(create_ticket));
std::map<std::string, std::string> params;
std::string json_resp = dev_reg_->StartRegistration(params, nullptr);
@@ -345,10 +352,12 @@
std::string ticket_url =
dev_reg_->GetServiceURL("registrationTickets/" +
std::string(test_data::kClaimTicketId));
- transport_->AddHandler(ticket_url + "/finalize", request_type::kPost,
+ transport_->AddHandler(ticket_url + "/finalize",
+ chromeos::http::request_type::kPost,
base::Bind(FinalizeTicketHandler));
- transport_->AddHandler(dev_reg_->GetOAuthURL("token"), request_type::kPost,
+ transport_->AddHandler(dev_reg_->GetOAuthURL("token"),
+ chromeos::http::request_type::kPost,
base::Bind(OAuth2Handler));
storage_->reset_save_count();
@@ -389,26 +398,28 @@
std::string ticket_url =
dev_reg_->GetServiceURL("registrationTickets/" +
std::string(test_data::kClaimTicketId));
- transport_->AddHandler(ticket_url + "/finalize", request_type::kPost,
+ transport_->AddHandler(ticket_url + "/finalize",
+ chromeos::http::request_type::kPost,
base::Bind(FinalizeTicketHandler));
- transport_->AddHandler(dev_reg_->GetOAuthURL("token"), request_type::kPost,
+ transport_->AddHandler(dev_reg_->GetOAuthURL("token"),
+ chromeos::http::request_type::kPost,
base::Bind(OAuth2Handler));
// Handle patching in the user email onto the device record.
- auto email_patch_handler = [](const fake::ServerRequest& request,
- fake::ServerResponse* response) {
+ auto email_patch_handler = [](const ServerRequest& request,
+ ServerResponse* response) {
std::string auth_header = "Bearer ";
auth_header += test_data::kUserAccessToken;
EXPECT_EQ(auth_header,
- request.GetHeader(http::request_header::kAuthorization));
+ request.GetHeader(chromeos::http::request_header::kAuthorization));
auto json = request.GetDataAsJson();
EXPECT_NE(nullptr, json.get());
std::string value;
EXPECT_TRUE(json->GetString("userEmail", &value));
EXPECT_EQ("me", value);
- response->ReplyJson(status_code::Ok, {
+ response->ReplyJson(chromeos::http::status_code::Ok, {
{"id", test_data::kClaimTicketId},
{"kind", "clouddevices#registrationTicket"},
{"oauthClientId", test_data::kClientId},
@@ -418,7 +429,7 @@
{"deviceDraft.channel.supportedType", "xmpp"},
});
};
- transport_->AddHandler(ticket_url, request_type::kPatch,
+ transport_->AddHandler(ticket_url, chromeos::http::request_type::kPatch,
base::Bind(email_patch_handler));
storage_->reset_save_count();
@@ -429,3 +440,5 @@
storage_->save_count()); // The device info must have been saved.
EXPECT_EQ(4, transport_->GetRequestCount());
}
+
+} // namespace buffet
diff --git a/buffet/http_connection.h b/buffet/http_connection.h
deleted file mode 100644
index 893b992..0000000
--- a/buffet/http_connection.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// 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_H_
-#define BUFFET_HTTP_CONNECTION_H_
-
-#include <string>
-#include <vector>
-
-#include <base/basictypes.h>
-#include <chromeos/error.h>
-
-#include "buffet/http_transport.h"
-
-namespace buffet {
-namespace http {
-
-///////////////////////////////////////////////////////////////////////////////
-// Connection class is the base class for HTTP communication session.
-// It abstracts the implementation of underlying transport library (ex libcurl).
-// When the Connection-derived class is constructed, it is pre-set up with
-// basic initialization information necessary to initiate the server request
-// connection (such as the URL, request method, etc - see
-// Transport::CreateConnection() for more details). But most implementations
-// would not probably initiate the physical connection until SendHeaders
-// is called.
-// You normally shouldn't worry about using this class directly.
-// http::Request and http::Response classes use it for communication.
-///////////////////////////////////////////////////////////////////////////////
-class Connection {
- public:
- explicit Connection(std::shared_ptr<Transport> transport)
- : transport_(transport) {}
- virtual ~Connection() = default;
-
- // Called by http::Request to initiate the connection with the server.
- // This normally opens the socket and sends the request headers.
- virtual bool SendHeaders(const HeaderList& headers,
- chromeos::ErrorPtr* error) = 0;
- // If needed, this function can be called to send the request body data.
- // This function can be called repeatedly until all data is sent.
- virtual bool WriteRequestData(const void* data, size_t size,
- chromeos::ErrorPtr* error) = 0;
- // This function is called when all the data is sent off and it's time
- // to receive the response data.
- virtual bool FinishRequest(chromeos::ErrorPtr* error) = 0;
-
- // Returns the HTTP status code (e.g. 200 for success).
- virtual int GetResponseStatusCode() const = 0;
- // Returns the status text (e.g. for error 403 it could be "NOT AUTHORIZED").
- virtual std::string GetResponseStatusText() const = 0;
- // Returns the HTTP protocol version (e.g. "HTTP/1.1").
- virtual std::string GetProtocolVersion() const = 0;
- // Returns the value of particular response header, or empty string if the
- // headers wasn't received.
- virtual std::string GetResponseHeader(
- const std::string& header_name) const = 0;
- // Returns the response data size, if known. For chunked (streaming)
- // transmission this might not be known until all the data is sent.
- // In this case GetResponseDataSize() will return 0.
- virtual uint64_t GetResponseDataSize() const = 0;
- // This function is called to read a block of response data.
- // It needs to be called repeatedly until it returns false or |size_read| is
- // set to 0. |data| is the destination buffer to read the data into.
- // |buffer_size| is the size of the buffer (amount of data to read).
- // |read_size| is the amount of data actually read, which could be less than
- // the size requested or 0 if there is no more data available.
- virtual bool ReadResponseData(void* data,
- size_t buffer_size,
- size_t* size_read,
- chromeos::ErrorPtr* error) = 0;
-
- protected:
- // |transport_| is mainly used to keep the object alive as long as the
- // connection exists. But some implementations of Connection could use
- // the Transport-derived class for their own needs as well.
- std::shared_ptr<Transport> transport_;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(Connection);
-};
-
-} // namespace http
-} // namespace buffet
-
-#endif // BUFFET_HTTP_CONNECTION_H_
diff --git a/buffet/http_connection_curl.cc b/buffet/http_connection_curl.cc
deleted file mode 100644
index 86715ab..0000000
--- a/buffet/http_connection_curl.cc
+++ /dev/null
@@ -1,233 +0,0 @@
-// 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_connection_curl.h"
-
-#include <base/logging.h>
-#include <chromeos/string_utils.h>
-
-#include "buffet/http_request.h"
-#include "buffet/http_transport_curl.h"
-
-namespace buffet {
-namespace http {
-namespace curl {
-
-static int curl_trace(CURL *handle, curl_infotype type,
- char *data, size_t size, void *userp) {
- std::string msg(data, size);
-
- switch (type) {
- case CURLINFO_TEXT:
- VLOG(3) << "== Info: " << msg;
- break;
- case CURLINFO_HEADER_OUT:
- VLOG(3) << "=> Send headers:\n" << msg;
- break;
- case CURLINFO_DATA_OUT:
- VLOG(3) << "=> Send data:\n" << msg;
- break;
- case CURLINFO_SSL_DATA_OUT:
- VLOG(3) << "=> Send SSL data" << msg;
- break;
- case CURLINFO_HEADER_IN:
- VLOG(3) << "<= Recv header: " << msg;
- break;
- case CURLINFO_DATA_IN:
- VLOG(3) << "<= Recv data:\n" << msg;
- break;
- case CURLINFO_SSL_DATA_IN:
- VLOG(3) << "<= Recv SSL data" << msg;
- break;
- default:
- break;
- }
- return 0;
-}
-
-Connection::Connection(CURL* curl_handle, const std::string& method,
- std::shared_ptr<http::Transport> transport) :
- http::Connection(transport), method_(method), curl_handle_(curl_handle) {
- VLOG(1) << "curl::Connection created: " << method_;
-}
-
-Connection::~Connection() {
- VLOG(1) << "curl::Connection destroyed";
-}
-
-bool Connection::SendHeaders(const HeaderList& headers,
- chromeos::ErrorPtr* error) {
- headers_.insert(headers.begin(), headers.end());
- return true;
-}
-
-bool Connection::WriteRequestData(const void* data, size_t size,
- chromeos::ErrorPtr* error) {
- if (size > 0) {
- auto data_ptr = reinterpret_cast<const unsigned char*>(data);
- request_data_.insert(request_data_.end(), data_ptr, data_ptr + size);
- }
- return true;
-}
-
-bool Connection::FinishRequest(chromeos::ErrorPtr* error) {
- if (VLOG_IS_ON(3)) {
- curl_easy_setopt(curl_handle_, CURLOPT_DEBUGFUNCTION, curl_trace);
- curl_easy_setopt(curl_handle_, CURLOPT_VERBOSE, 1L);
- }
-
- // Set up HTTP request data.
- if (method_ == request_type::kPut) {
- curl_easy_setopt(curl_handle_, CURLOPT_INFILESIZE_LARGE,
- curl_off_t(request_data_.size()));
- } else {
- curl_easy_setopt(curl_handle_, CURLOPT_POSTFIELDSIZE_LARGE,
- curl_off_t(request_data_.size()));
- }
- if (!request_data_.empty()) {
- curl_easy_setopt(curl_handle_,
- CURLOPT_READFUNCTION, &Connection::read_callback);
- curl_easy_setopt(curl_handle_, CURLOPT_READDATA, this);
- VLOG(2) << "Raw request data: "
- << std::string(reinterpret_cast<const char*>(request_data_.data()),
- request_data_.size());
- }
-
- curl_slist* header_list = nullptr;
- if (!headers_.empty()) {
- for (auto pair : headers_) {
- std::string header = chromeos::string_utils::Join(": ",
- pair.first,
- pair.second);
- VLOG(2) << "Request header: " << header;
- header_list = curl_slist_append(header_list, header.c_str());
- }
- curl_easy_setopt(curl_handle_, CURLOPT_HTTPHEADER, header_list);
- }
-
- headers_.clear();
-
- // Set up HTTP response data.
- if (method_ != request_type::kHead) {
- curl_easy_setopt(curl_handle_,
- CURLOPT_WRITEFUNCTION, &Connection::write_callback);
- curl_easy_setopt(curl_handle_, CURLOPT_WRITEDATA, this);
- }
-
- // HTTP response headers
- curl_easy_setopt(curl_handle_,
- CURLOPT_HEADERFUNCTION, &Connection::header_callback);
- curl_easy_setopt(curl_handle_, CURLOPT_HEADERDATA, this);
-
- CURLcode ret = curl_easy_perform(curl_handle_);
- if (header_list)
- curl_slist_free_all(header_list);
- if (ret != CURLE_OK) {
- chromeos::Error::AddTo(error, http::curl::kErrorDomain,
- chromeos::string_utils::ToString(ret),
- curl_easy_strerror(ret));
- } else {
- LOG(INFO) << "Response: " << GetResponseStatusCode() << " ("
- << GetResponseStatusText() << ")";
- VLOG(2) << "Response data (" << response_data_.size() << "): "
- << std::string(reinterpret_cast<const char*>(response_data_.data()),
- response_data_.size());
- }
- return (ret == CURLE_OK);
-}
-
-int Connection::GetResponseStatusCode() const {
- long status_code = 0; // NOLINT(runtime/int) - curl expects a long here.
- curl_easy_getinfo(curl_handle_, CURLINFO_RESPONSE_CODE, &status_code);
- return status_code;
-}
-
-std::string Connection::GetResponseStatusText() const {
- return status_text_;
-}
-
-std::string Connection::GetProtocolVersion() const {
- return protocol_version_;
-}
-
-std::string Connection::GetResponseHeader(
- const std::string& header_name) const {
- auto p = headers_.find(header_name);
- return p != headers_.end() ? p->second : std::string();
-}
-
-uint64_t Connection::GetResponseDataSize() const {
- return response_data_.size();
-}
-
-bool Connection::ReadResponseData(void* data,
- size_t buffer_size,
- size_t* size_read,
- chromeos::ErrorPtr* error) {
- size_t size_to_read = response_data_.size() - response_data_ptr_;
- if (size_to_read > buffer_size)
- size_to_read = buffer_size;
- memcpy(data, response_data_.data() + response_data_ptr_, size_to_read);
- if (size_read)
- *size_read = size_to_read;
- response_data_ptr_ += size_to_read;
- return true;
-}
-
-size_t Connection::write_callback(char* ptr, size_t size,
- size_t num, void* data) {
- Connection* me = reinterpret_cast<Connection*>(data);
- size_t data_len = size * num;
- me->response_data_.insert(me->response_data_.end(), ptr, ptr + data_len);
- return data_len;
-}
-
-size_t Connection::read_callback(char* ptr, size_t size,
- size_t num, void* data) {
- Connection* me = reinterpret_cast<Connection*>(data);
- size_t data_len = size * num;
-
- if (me->request_data_ptr_ >= me->request_data_.size())
- return 0;
-
- if (me->request_data_ptr_ + data_len > me->request_data_.size())
- data_len = me->request_data_.size() - me->request_data_ptr_;
-
- memcpy(ptr, me->request_data_.data() + me->request_data_ptr_, data_len);
- me->request_data_ptr_ += data_len;
-
- return data_len;
-}
-
-size_t Connection::header_callback(char* ptr, size_t size,
- size_t num, void* data) {
- using chromeos::string_utils::SplitAtFirst;
- Connection* me = reinterpret_cast<Connection*>(data);
- size_t hdr_len = size * num;
- std::string header(ptr, hdr_len);
- // Remove newlines at the end of header line.
- while (!header.empty() && (header.back() == '\r' || header.back() == '\n')) {
- header.pop_back();
- }
-
- VLOG(2) << "Response header: " << header;
-
- if (!me->status_text_set_) {
- // First header - response code as "HTTP/1.1 200 OK".
- // Need to extract the OK part
- auto pair = SplitAtFirst(header, ' ');
- me->protocol_version_ = pair.first;
- me->status_text_ = SplitAtFirst(pair.second, ' ').second;
- me->status_text_set_ = true;
- } else {
- auto pair = SplitAtFirst(header, ':');
- if (!pair.second.empty())
- me->headers_.insert(pair);
- }
- return hdr_len;
-}
-
-} // namespace curl
-} // namespace http
-} // namespace buffet
diff --git a/buffet/http_connection_curl.h b/buffet/http_connection_curl.h
deleted file mode 100644
index 67d7eac..0000000
--- a/buffet/http_connection_curl.h
+++ /dev/null
@@ -1,86 +0,0 @@
-// 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.
- bool SendHeaders(const HeaderList& headers,
- chromeos::ErrorPtr* error) override;
- bool WriteRequestData(const void* data, size_t size,
- chromeos::ErrorPtr* error) override;
- bool FinishRequest(chromeos::ErrorPtr* error) override;
-
- int GetResponseStatusCode() const override;
- std::string GetResponseStatusText() const override;
- std::string GetProtocolVersion() const override;
- std::string GetResponseHeader(const std::string& header_name) const override;
- uint64_t GetResponseDataSize() const override;
- bool ReadResponseData(void* data, size_t buffer_size,
- size_t* size_read, chromeos::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_
diff --git a/buffet/http_connection_fake.cc b/buffet/http_connection_fake.cc
deleted file mode 100644
index 6cfdde3..0000000
--- a/buffet/http_connection_fake.cc
+++ /dev/null
@@ -1,98 +0,0 @@
-// 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_connection_fake.h"
-
-#include <base/logging.h>
-#include <chromeos/mime_utils.h>
-#include <chromeos/string_utils.h>
-
-#include "buffet/http_request.h"
-
-namespace buffet {
-namespace http {
-namespace fake {
-
-Connection::Connection(const std::string& url, const std::string& method,
- std::shared_ptr<http::Transport> transport) :
- http::Connection(transport), request_(url, method) {
- VLOG(1) << "fake::Connection created: " << method;
-}
-
-Connection::~Connection() {
- VLOG(1) << "fake::Connection destroyed";
-}
-
-bool Connection::SendHeaders(const HeaderList& headers,
- chromeos::ErrorPtr* error) {
- request_.AddHeaders(headers);
- return true;
-}
-
-bool Connection::WriteRequestData(const void* data, size_t size,
- chromeos::ErrorPtr* error) {
- request_.AddData(data, size);
- return true;
-}
-
-bool Connection::FinishRequest(chromeos::ErrorPtr* error) {
- using chromeos::string_utils::ToString;
- request_.AddHeaders({{request_header::kContentLength,
- ToString(request_.GetData().size())}});
- fake::Transport* transport = static_cast<fake::Transport*>(transport_.get());
- CHECK(transport) << "Expecting a fake transport";
- auto handler = transport->GetHandler(request_.GetURL(), request_.GetMethod());
- if (handler.is_null()) {
- LOG(ERROR) << "Received unexpected " << request_.GetMethod()
- << " request at " << request_.GetURL();
- response_.ReplyText(status_code::NotFound,
- "<html><body>Not found</body></html>",
- chromeos::mime::text::kHtml);
- } else {
- handler.Run(request_, &response_);
- }
- return true;
-}
-
-int Connection::GetResponseStatusCode() const {
- return response_.GetStatusCode();
-}
-
-std::string Connection::GetResponseStatusText() const {
- return response_.GetStatusText();
-}
-
-std::string Connection::GetProtocolVersion() const {
- return response_.GetProtocolVersion();
-}
-
-std::string Connection::GetResponseHeader(
- const std::string& header_name) const {
- return response_.GetHeader(header_name);
-}
-
-uint64_t Connection::GetResponseDataSize() const {
- // HEAD requests must not return body.
- return (request_.GetMethod() != request_type::kHead) ?
- response_.GetData().size() : 0;
-}
-
-bool Connection::ReadResponseData(void* data,
- size_t buffer_size,
- size_t* size_read,
- chromeos::ErrorPtr* error) {
- size_t size_to_read = GetResponseDataSize() - response_data_ptr_;
- if (size_to_read > buffer_size)
- size_to_read = buffer_size;
- if (size_to_read > 0)
- memcpy(data, response_.GetData().data() + response_data_ptr_, size_to_read);
- if (size_read)
- *size_read = size_to_read;
- response_data_ptr_ += size_to_read;
- return true;
-}
-
-} // namespace fake
-} // namespace http
-} // namespace buffet
diff --git a/buffet/http_connection_fake.h b/buffet/http_connection_fake.h
deleted file mode 100644
index 513228a..0000000
--- a/buffet/http_connection_fake.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// 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_FAKE_H_
-#define BUFFET_HTTP_CONNECTION_FAKE_H_
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include <base/basictypes.h>
-
-#include "buffet/http_connection.h"
-#include "buffet/http_transport_fake.h"
-
-namespace buffet {
-namespace http {
-namespace fake {
-
-// This is a fake implementation of http::Connection for unit testing.
-class Connection : public http::Connection {
- public:
- Connection(const std::string& url, 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.
- bool SendHeaders(const HeaderList& headers,
- chromeos::ErrorPtr* error) override;
- bool WriteRequestData(const void* data, size_t size,
- chromeos::ErrorPtr* error) override;
- bool FinishRequest(chromeos::ErrorPtr* error) override;
-
- int GetResponseStatusCode() const override;
- std::string GetResponseStatusText() const override;
- std::string GetProtocolVersion() const override;
- std::string GetResponseHeader(const std::string& header_name) const override;
- uint64_t GetResponseDataSize() const override;
- bool ReadResponseData(void* data, size_t buffer_size,
- size_t* size_read, chromeos::ErrorPtr* error) override;
-
- private:
- // Request and response objects passed to the user-provided request handler
- // callback. The request object contains all the request information.
- // The response object is the server response that is created by
- // the handler in response to the request.
- ServerRequest request_;
- ServerResponse response_;
-
- // Internal read data pointer needed for ReadResponseData() implementation.
- size_t response_data_ptr_ = 0;
-
- DISALLOW_COPY_AND_ASSIGN(Connection);
-};
-
-} // namespace fake
-} // namespace http
-} // namespace buffet
-
-#endif // BUFFET_HTTP_CONNECTION_FAKE_H_
diff --git a/buffet/http_request.cc b/buffet/http_request.cc
deleted file mode 100644
index dfeac7f..0000000
--- a/buffet/http_request.cc
+++ /dev/null
@@ -1,301 +0,0 @@
-// 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_request.h"
-
-#include <base/logging.h>
-#include <chromeos/map_utils.h>
-#include <chromeos/mime_utils.h>
-#include <chromeos/string_utils.h>
-
-#include "buffet/http_connection_curl.h"
-#include "buffet/http_transport_curl.h"
-
-namespace buffet {
-namespace http {
-
-// request_type
-const char request_type::kOptions[] = "OPTIONS";
-const char request_type::kGet[] = "GET";
-const char request_type::kHead[] = "HEAD";
-const char request_type::kPost[] = "POST";
-const char request_type::kPut[] = "PUT";
-const char request_type::kPatch[] = "PATCH";
-const char request_type::kDelete[] = "DELETE";
-const char request_type::kTrace[] = "TRACE";
-const char request_type::kConnect[] = "CONNECT";
-const char request_type::kCopy[] = "COPY";
-const char request_type::kMove[] = "MOVE";
-
-// request_header
-const char request_header::kAccept[] = "Accept";
-const char request_header::kAcceptCharset[] = "Accept-Charset";
-const char request_header::kAcceptEncoding[] = "Accept-Encoding";
-const char request_header::kAcceptLanguage[] = "Accept-Language";
-const char request_header::kAllow[] = "Allow";
-const char request_header::kAuthorization[] = "Authorization";
-const char request_header::kCacheControl[] = "Cache-Control";
-const char request_header::kConnection[] = "Connection";
-const char request_header::kContentEncoding[] = "Content-Encoding";
-const char request_header::kContentLanguage[] = "Content-Language";
-const char request_header::kContentLength[] = "Content-Length";
-const char request_header::kContentLocation[] = "Content-Location";
-const char request_header::kContentMd5[] = "Content-MD5";
-const char request_header::kContentRange[] = "Content-Range";
-const char request_header::kContentType[] = "Content-Type";
-const char request_header::kCookie[] = "Cookie";
-const char request_header::kDate[] = "Date";
-const char request_header::kExpect[] = "Expect";
-const char request_header::kExpires[] = "Expires";
-const char request_header::kFrom[] = "From";
-const char request_header::kHost[] = "Host";
-const char request_header::kIfMatch[] = "If-Match";
-const char request_header::kIfModifiedSince[] = "If-Modified-Since";
-const char request_header::kIfNoneMatch[] = "If-None-Match";
-const char request_header::kIfRange[] = "If-Range";
-const char request_header::kIfUnmodifiedSince[] = "If-Unmodified-Since";
-const char request_header::kLastModified[] = "Last-Modified";
-const char request_header::kMaxForwards[] = "Max-Forwards";
-const char request_header::kPragma[] = "Pragma";
-const char request_header::kProxyAuthorization[] = "Proxy-Authorization";
-const char request_header::kRange[] = "Range";
-const char request_header::kReferer[] = "Referer";
-const char request_header::kTE[] = "TE";
-const char request_header::kTrailer[] = "Trailer";
-const char request_header::kTransferEncoding[] = "Transfer-Encoding";
-const char request_header::kUpgrade[] = "Upgrade";
-const char request_header::kUserAgent[] = "User-Agent";
-const char request_header::kVia[] = "Via";
-const char request_header::kWarning[] = "Warning";
-
-// response_header
-const char response_header::kAcceptRanges[] = "Accept-Ranges";
-const char response_header::kAge[] = "Age";
-const char response_header::kAllow[] = "Allow";
-const char response_header::kCacheControl[] = "Cache-Control";
-const char response_header::kConnection[] = "Connection";
-const char response_header::kContentEncoding[] = "Content-Encoding";
-const char response_header::kContentLanguage[] = "Content-Language";
-const char response_header::kContentLength[] = "Content-Length";
-const char response_header::kContentLocation[] = "Content-Location";
-const char response_header::kContentMd5[] = "Content-MD5";
-const char response_header::kContentRange[] = "Content-Range";
-const char response_header::kContentType[] = "Content-Type";
-const char response_header::kDate[] = "Date";
-const char response_header::kETag[] = "ETag";
-const char response_header::kExpires[] = "Expires";
-const char response_header::kLastModified[] = "Last-Modified";
-const char response_header::kLocation[] = "Location";
-const char response_header::kPragma[] = "Pragma";
-const char response_header::kProxyAuthenticate[] = "Proxy-Authenticate";
-const char response_header::kRetryAfter[] = "Retry-After";
-const char response_header::kServer[] = "Server";
-const char response_header::kSetCookie[] = "Set-Cookie";
-const char response_header::kTrailer[] = "Trailer";
-const char response_header::kTransferEncoding[] = "Transfer-Encoding";
-const char response_header::kUpgrade[] = "Upgrade";
-const char response_header::kVary[] = "Vary";
-const char response_header::kVia[] = "Via";
-const char response_header::kWarning[] = "Warning";
-const char response_header::kWwwAuthenticate[] = "WWW-Authenticate";
-
-// ***********************************************************
-// ********************** Request Class **********************
-// ***********************************************************
-Request::Request(const std::string& url, const char* method,
- std::shared_ptr<Transport> transport) :
- transport_(transport), request_url_(url), method_(method) {
- VLOG(1) << "http::Request created";
- if (!transport_)
- transport_.reset(new http::curl::Transport());
-}
-
-Request::~Request() {
- VLOG(1) << "http::Request destroyed";
-}
-
-void Request::AddRange(int64_t bytes) {
- if (bytes < 0) {
- ranges_.emplace_back(Request::range_value_omitted, -bytes);
- } else {
- ranges_.emplace_back(bytes, Request::range_value_omitted);
- }
-}
-
-void Request::AddRange(uint64_t from_byte, uint64_t to_byte) {
- ranges_.emplace_back(from_byte, to_byte);
-}
-
-std::unique_ptr<Response> Request::GetResponse(chromeos::ErrorPtr* error) {
- if (!SendRequestIfNeeded(error) || !connection_->FinishRequest(error))
- return std::unique_ptr<Response>();
- std::unique_ptr<Response> response(new Response(std::move(connection_)));
- transport_.reset(); // Indicate that the response has been received
- return response;
-}
-
-void Request::SetAccept(const char* accept_mime_types) {
- accept_ = accept_mime_types;
-}
-
-std::string Request::GetAccept() const {
- return accept_;
-}
-
-void Request::SetContentType(const char* contentType) {
- content_type_ = contentType;
-}
-
-std::string Request::GetContentType() const {
- return content_type_;
-}
-
-void Request::AddHeader(const char* header, const char* value) {
- headers_[header] = value;
-}
-
-void Request::AddHeaders(const HeaderList& headers) {
- headers_.insert(headers.begin(), headers.end());
-}
-
-bool Request::AddRequestBody(const void* data,
- size_t size,
- chromeos::ErrorPtr* error) {
- if (!SendRequestIfNeeded(error))
- return false;
- return connection_->WriteRequestData(data, size, error);
-}
-
-void Request::SetReferer(const char* referer) {
- referer_ = referer;
-}
-
-std::string Request::GetReferer() const {
- return referer_;
-}
-
-void Request::SetUserAgent(const char* user_agent) {
- user_agent_ = user_agent;
-}
-
-std::string Request::GetUserAgent() const {
- return user_agent_;
-}
-
-bool Request::SendRequestIfNeeded(chromeos::ErrorPtr* error) {
- if (transport_) {
- if (!connection_) {
- http::HeaderList headers = chromeos::MapToVector(headers_);
- std::vector<std::string> ranges;
- if (method_ != request_type::kHead) {
- ranges.reserve(ranges_.size());
- for (auto p : ranges_) {
- if (p.first != range_value_omitted ||
- p.second != range_value_omitted) {
- std::string range;
- if (p.first != range_value_omitted) {
- range = chromeos::string_utils::ToString(p.first);
- }
- range += '-';
- if (p.second != range_value_omitted) {
- range += chromeos::string_utils::ToString(p.second);
- }
- ranges.push_back(range);
- }
- }
- }
- if (!ranges.empty())
- headers.emplace_back(request_header::kRange,
- "bytes=" +
- chromeos::string_utils::Join(',', ranges));
-
- headers.emplace_back(request_header::kAccept, GetAccept());
- if (method_ != request_type::kGet && method_ != request_type::kHead) {
- if (!content_type_.empty())
- headers.emplace_back(request_header::kContentType, content_type_);
- }
- connection_ = transport_->CreateConnection(transport_, request_url_,
- method_, headers,
- user_agent_, referer_,
- error);
- }
-
- if (connection_)
- return true;
- } else {
- chromeos::Error::AddTo(error, http::curl::kErrorDomain,
- "request_already_received",
- "HTTP response already received");
- }
- return false;
-}
-
-// ************************************************************
-// ********************** Response Class **********************
-// ************************************************************
-Response::Response(std::unique_ptr<Connection> connection)
- : connection_(std::move(connection)) {
- VLOG(1) << "http::Response created";
- // Response object doesn't have streaming interface for response data (yet),
- // so read the data into a buffer and cache it.
- if (connection_) {
- size_t size = static_cast<size_t>(connection_->GetResponseDataSize());
- response_data_.reserve(size);
- unsigned char buffer[1024];
- size_t read = 0;
- while (connection_->ReadResponseData(buffer, sizeof(buffer),
- &read, nullptr) && read > 0) {
- response_data_.insert(response_data_.end(), buffer, buffer + read);
- }
- }
-}
-
-Response::~Response() {
- VLOG(1) << "http::Response destroyed";
-}
-
-bool Response::IsSuccessful() const {
- int code = GetStatusCode();
- return code >= status_code::Continue && code < status_code::BadRequest;
-}
-
-int Response::GetStatusCode() const {
- if (!connection_)
- return -1;
-
- return connection_->GetResponseStatusCode();
-}
-
-std::string Response::GetStatusText() const {
- if (!connection_)
- return std::string();
-
- return connection_->GetResponseStatusText();
-}
-
-std::string Response::GetContentType() const {
- return GetHeader(response_header::kContentType);
-}
-
-const std::vector<unsigned char>& Response::GetData() const {
- return response_data_;
-}
-
-std::string Response::GetDataAsString() const {
- if (response_data_.empty())
- return std::string();
-
- const char* data_buf = reinterpret_cast<const char*>(response_data_.data());
- return std::string(data_buf, data_buf + response_data_.size());
-}
-
-std::string Response::GetHeader(const char* header_name) const {
- if (connection_)
- return connection_->GetResponseHeader(header_name);
-
- return std::string();
-}
-
-} // namespace http
-} // namespace buffet
diff --git a/buffet/http_request.h b/buffet/http_request.h
deleted file mode 100644
index d9e73a4..0000000
--- a/buffet/http_request.h
+++ /dev/null
@@ -1,352 +0,0 @@
-// 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_REQUEST_H_
-#define BUFFET_HTTP_REQUEST_H_
-
-#include <limits>
-#include <map>
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include <base/basictypes.h>
-#include <chromeos/error.h>
-
-#include "buffet/http_connection.h"
-#include "buffet/http_transport.h"
-
-namespace buffet {
-namespace http {
-
-// HTTP request verbs
-namespace request_type {
- extern const char kOptions[];
- extern const char kGet[];
- extern const char kHead[];
- extern const char kPost[];
- extern const char kPut[];
- extern const char kPatch[]; // Not a standard HTTP/1.1 request method
- extern const char kDelete[];
- extern const char kTrace[];
- extern const char kConnect[];
- extern const char kCopy[]; // Not a standard HTTP/1.1 request method
- extern const char kMove[]; // Not a standard HTTP/1.1 request method
-} // namespace request_type
-
-// HTTP request header names
-namespace request_header {
- extern const char kAccept[];
- extern const char kAcceptCharset[];
- extern const char kAcceptEncoding[];
- extern const char kAcceptLanguage[];
- extern const char kAllow[];
- extern const char kAuthorization[];
- extern const char kCacheControl[];
- extern const char kConnection[];
- extern const char kContentEncoding[];
- extern const char kContentLanguage[];
- extern const char kContentLength[];
- extern const char kContentLocation[];
- extern const char kContentMd5[];
- extern const char kContentRange[];
- extern const char kContentType[];
- extern const char kCookie[];
- extern const char kDate[];
- extern const char kExpect[];
- extern const char kExpires[];
- extern const char kFrom[];
- extern const char kHost[];
- extern const char kIfMatch[];
- extern const char kIfModifiedSince[];
- extern const char kIfNoneMatch[];
- extern const char kIfRange[];
- extern const char kIfUnmodifiedSince[];
- extern const char kLastModified[];
- extern const char kMaxForwards[];
- extern const char kPragma[];
- extern const char kProxyAuthorization[];
- extern const char kRange[];
- extern const char kReferer[];
- extern const char kTE[];
- extern const char kTrailer[];
- extern const char kTransferEncoding[];
- extern const char kUpgrade[];
- extern const char kUserAgent[];
- extern const char kVia[];
- extern const char kWarning[];
-} // namespace request_header
-
-// HTTP response header names
-namespace response_header {
- extern const char kAcceptRanges[];
- extern const char kAge[];
- extern const char kAllow[];
- extern const char kCacheControl[];
- extern const char kConnection[];
- extern const char kContentEncoding[];
- extern const char kContentLanguage[];
- extern const char kContentLength[];
- extern const char kContentLocation[];
- extern const char kContentMd5[];
- extern const char kContentRange[];
- extern const char kContentType[];
- extern const char kDate[];
- extern const char kETag[];
- extern const char kExpires[];
- extern const char kLastModified[];
- extern const char kLocation[];
- extern const char kPragma[];
- extern const char kProxyAuthenticate[];
- extern const char kRetryAfter[];
- extern const char kServer[];
- extern const char kSetCookie[];
- extern const char kTrailer[];
- extern const char kTransferEncoding[];
- extern const char kUpgrade[];
- extern const char kVary[];
- extern const char kVia[];
- extern const char kWarning[];
- extern const char kWwwAuthenticate[];
-} // namespace response_header
-
-// HTTP request status (error) codes
-namespace status_code {
- // OK to continue with request
- static const int Continue = 100;
- // Server has switched protocols in upgrade header
- static const int SwitchProtocols = 101;
-
- // Request completed
- static const int Ok = 200;
- // Object created, reason = new URI
- static const int Created = 201;
- // Async completion (TBS)
- static const int Accepted = 202;
- // Partial completion
- static const int Partial = 203;
- // No info to return
- static const int NoContent = 204;
- // Request completed, but clear form
- static const int ResetContent = 205;
- // Partial GET fulfilled
- static const int PartialContent = 206;
-
- // Server couldn't decide what to return
- static const int Ambiguous = 300;
- // Object permanently moved
- static const int Moved = 301;
- // Object temporarily moved
- static const int Redirect = 302;
- // Redirection w/ new access method
- static const int RedirectMethod = 303;
- // If-Modified-Since was not modified
- static const int NotModified = 304;
- // Redirection to proxy, location header specifies proxy to use
- static const int UseProxy = 305;
- // HTTP/1.1: keep same verb
- static const int RedirectKeepVerb = 307;
-
- // Invalid syntax
- static const int BadRequest = 400;
- // Access denied
- static const int Denied = 401;
- // Payment required
- static const int PaymentRequired = 402;
- // Request forbidden
- static const int Forbidden = 403;
- // Object not found
- static const int NotFound = 404;
- // Method is not allowed
- static const int BadMethod = 405;
- // No response acceptable to client found
- static const int NoneAcceptable = 406;
- // Proxy authentication required
- static const int ProxyAuthRequired = 407;
- // Server timed out waiting for request
- static const int RequestTimeout = 408;
- // User should resubmit with more info
- static const int Conflict = 409;
- // The resource is no longer available
- static const int Gone = 410;
- // The server refused to accept request w/o a length
- static const int LengthRequired = 411;
- // Precondition given in request failed
- static const int PrecondionFailed = 412;
- // Request entity was too large
- static const int RequestTooLarge = 413;
- // Request URI too long
- static const int UriTooLong = 414;
- // Unsupported media type
- static const int UnsupportedMedia = 415;
- // Retry after doing the appropriate action.
- static const int RetryWith = 449;
-
- // Internal server error
- static const int InternalServerError = 500;
- // Request not supported
- static const int NotSupported = 501;
- // Error response received from gateway
- static const int BadGateway = 502;
- // Temporarily overloaded
- static const int ServiceUnavailable = 503;
- // Timed out waiting for gateway
- static const int GatewayTimeout = 504;
- // HTTP version not supported
- static const int VersionNotSupported = 505;
-} // namespace status_code
-
-class Response; // Just a forward declaration.
-
-///////////////////////////////////////////////////////////////////////////////
-// Request class is the main object used to set up and initiate an HTTP
-// communication session. It is used to specify the HTTP request method,
-// request URL and many optional parameters (such as HTTP headers, user agent,
-// referer URL and so on.
-//
-// Once everything is setup, GetResponse() method is used to send the request
-// and obtain the server response. The returned Response object can be
-// used to inspect the response code, HTTP headers and/or response body.
-///////////////////////////////////////////////////////////////////////////////
-class Request {
- public:
- // The main constructor. |url| specifies the remote host address/path
- // to send the request to. |method| is the HTTP request verb and
- // |transport| is the HTTP transport implementation for server communications.
- Request(const std::string& url, const char* method,
- std::shared_ptr<Transport> transport);
- ~Request();
-
- // Gets/Sets "Accept:" header value. The default value is "*/*" if not set.
- void SetAccept(const char* accept_mime_types);
- std::string GetAccept() const;
-
- // Gets/Sets "Content-Type:" header value
- void SetContentType(const char* content_type);
- std::string GetContentType() const;
-
- // Adds additional HTTP request header
- void AddHeader(const char* header, const char* value);
- void AddHeaders(const HeaderList& headers);
-
- // Removes HTTP request header
- void RemoveHeader(const char* header);
-
- // Adds a request body. This is not to be used with GET method
- bool AddRequestBody(const void* data, size_t size, chromeos::ErrorPtr* error);
-
- // Makes a request for a subrange of data. Specifies a partial range with
- // either from beginning of the data to the specified offset (if |bytes| is
- // negative) or from the specified offset to the end of data (if |bytes| is
- // positive).
- // All individual ranges will be sent as part of "Range:" HTTP request header.
- void AddRange(int64_t bytes);
-
- // Makes a request for a subrange of data. Specifies a full range with
- // start and end bytes from the beginning of the requested data.
- // All individual ranges will be sent as part of "Range:" HTTP request header.
- void AddRange(uint64_t from_byte, uint64_t to_byte);
-
- // Returns the request URL
- std::string GetRequestURL() const;
-
- // Gets/Sets a request referer URL (sent as "Referer:" request header).
- void SetReferer(const char* referer);
- std::string GetReferer() const;
-
- // Gets/Sets a user agent string (sent as "User-Agent:" request header).
- void SetUserAgent(const char* user_agent);
- std::string GetUserAgent() const;
-
- // Sends the request to the server and returns the response object.
- // In case the server couldn't be reached for whatever reason, returns
- // empty unique_ptr (null). In such a case, the additional error information
- // can be returned through the optional supplied |error| parameter.
- std::unique_ptr<Response> GetResponse(chromeos::ErrorPtr* error);
-
- private:
- // Helper function to create an http::Connection and send off request headers.
- bool SendRequestIfNeeded(chromeos::ErrorPtr* error);
-
- // Implementation that provides particular HTTP transport.
- std::shared_ptr<Transport> transport_;
-
- // An established connection for adding request body. This connection
- // is maintained by the request object after the headers have been
- // sent and before the response is requested.
- std::unique_ptr<Connection> connection_;
-
- // Full request URL, such as "http://www.host.com/path/to/object"
- std::string request_url_;
- // HTTP request verb, such as "GET", "POST", "PUT", ...
- std::string method_;
-
- // Referrer URL, if any. Sent to the server via "Referer: " header.
- std::string referer_;
- // User agent string, if any. Sent to the server via "User-Agent: " header.
- std::string user_agent_;
- // Content type of the request body data.
- // Sent to the server via "Content-Type: " header.
- std::string content_type_;
- // List of acceptable response data types.
- // Sent to the server via "Accept: " header.
- std::string accept_ = "*/*";
-
- // 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_;
- // List of optional data ranges to request partial content from the server.
- // Sent to the server as "Range: " header.
- std::vector<std::pair<uint64_t, uint64_t>> ranges_;
-
- // range_value_omitted is used in |ranges_| list to indicate omitted value.
- // E.g. range (10,range_value_omitted) represents bytes from 10 to the end
- // of the data stream.
- const uint64_t range_value_omitted = std::numeric_limits<uint64_t>::max();
-
- DISALLOW_COPY_AND_ASSIGN(Request);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// Response class is returned from Request::GetResponse() and is a way
-// to get to response status, error codes, response HTTP headers and response
-// data (body) if available.
-///////////////////////////////////////////////////////////////////////////////
-class Response {
- public:
- explicit Response(std::unique_ptr<Connection> connection);
- ~Response();
-
- // Returns true if server returned a success code (status code below 400).
- bool IsSuccessful() const;
-
- // Returns the HTTP status code (e.g. 200 for success)
- int GetStatusCode() const;
-
- // Returns the status text (e.g. for error 403 it could be "NOT AUTHORIZED").
- std::string GetStatusText() const;
-
- // Returns the content type of the response data.
- std::string GetContentType() const;
-
- // Returns response data as a byte array
- const std::vector<unsigned char>& GetData() const;
-
- // Returns response data as a string
- std::string GetDataAsString() const;
-
- // Returns a value of a given response HTTP header.
- std::string GetHeader(const char* header_name) const;
-
- private:
- std::unique_ptr<Connection> connection_;
- std::vector<unsigned char> response_data_;
- DISALLOW_COPY_AND_ASSIGN(Response);
-};
-
-} // namespace http
-} // namespace buffet
-
-#endif // BUFFET_HTTP_REQUEST_H_
diff --git a/buffet/http_transport.h b/buffet/http_transport.h
deleted file mode 100644
index 15b0bd6..0000000
--- a/buffet/http_transport.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// 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_TRANSPORT_H_
-#define BUFFET_HTTP_TRANSPORT_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include <base/basictypes.h>
-#include <chromeos/error.h>
-
-namespace buffet {
-namespace http {
-
-typedef std::vector<std::pair<std::string, std::string>> HeaderList;
-
-class Request;
-class Connection;
-
-///////////////////////////////////////////////////////////////////////////////
-// Transport is a base class for specific implementation of HTTP communication.
-// This class (and its underlying implementation) is used by http::Request and
-// http::Response classes to provide HTTP functionality to the clients.
-///////////////////////////////////////////////////////////////////////////////
-class Transport {
- public:
- Transport() = default;
- virtual ~Transport() = default;
-
- // Creates a connection object and initializes it with the specified data.
- // |transport| is a shared pointer to this transport object instance,
- // used to maintain the object alive as long as the connection exists.
- virtual std::unique_ptr<Connection> CreateConnection(
- std::shared_ptr<Transport> transport,
- const std::string& url,
- const std::string& method,
- const HeaderList& headers,
- const std::string& user_agent,
- const std::string& referer,
- chromeos::ErrorPtr* error) = 0;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(Transport);
-};
-
-} // namespace http
-} // namespace buffet
-
-#endif // BUFFET_HTTP_TRANSPORT_H_
diff --git a/buffet/http_transport_curl.cc b/buffet/http_transport_curl.cc
deleted file mode 100644
index d5a30fe..0000000
--- a/buffet/http_transport_curl.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-// 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"
-
-namespace buffet {
-namespace http {
-namespace curl {
-
-const char 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,
- chromeos::ErrorPtr* error) {
- CURL* curl_handle = curl_easy_init();
- if (!curl_handle) {
- LOG(ERROR) << "Failed to initialize CURL";
- chromeos::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 curl
-} // namespace http
-} // namespace buffet
diff --git a/buffet/http_transport_curl.h b/buffet/http_transport_curl.h
deleted file mode 100644
index 17b6acc..0000000
--- a/buffet/http_transport_curl.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// 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_TRANSPORT_CURL_H_
-#define BUFFET_HTTP_TRANSPORT_CURL_H_
-
-#include <string>
-
-#include "buffet/http_transport.h"
-
-namespace buffet {
-namespace http {
-namespace curl {
-
-extern const char kErrorDomain[];
-
-///////////////////////////////////////////////////////////////////////////////
-// An implementation of http::Transport that uses libcurl for
-// HTTP communications. This class (as http::Transport base)
-// is used by http::Request and http::Response classes to provide HTTP
-// functionality to the clients.
-// See http_transport.h for more details.
-///////////////////////////////////////////////////////////////////////////////
-class Transport : public http::Transport {
- public:
- Transport();
- virtual ~Transport();
-
- std::unique_ptr<http::Connection> 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,
- chromeos::ErrorPtr* error) override;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(Transport);
-};
-
-} // namespace curl
-} // namespace http
-} // namespace buffet
-
-#endif // BUFFET_HTTP_TRANSPORT_CURL_H_
diff --git a/buffet/http_transport_fake.cc b/buffet/http_transport_fake.cc
deleted file mode 100644
index 9aefbe3..0000000
--- a/buffet/http_transport_fake.cc
+++ /dev/null
@@ -1,264 +0,0 @@
-// 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_fake.h"
-
-#include <utility>
-
-#include <base/json/json_reader.h>
-#include <base/json/json_writer.h>
-#include <base/logging.h>
-#include <chromeos/bind_lambda.h>
-#include <chromeos/mime_utils.h>
-#include <chromeos/string_utils.h>
-#include <chromeos/url_utils.h>
-
-#include "buffet/http_connection_fake.h"
-#include "buffet/http_request.h"
-
-namespace buffet {
-
-using http::fake::Transport;
-using http::fake::ServerRequestResponseBase;
-using http::fake::ServerRequest;
-using http::fake::ServerResponse;
-
-Transport::Transport() {
- VLOG(1) << "fake::Transport created";
-}
-
-Transport::~Transport() {
- VLOG(1) << "fake::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,
- chromeos::ErrorPtr* error) {
- HeaderList headers_copy = headers;
- if (!user_agent.empty()) {
- headers_copy.push_back(std::make_pair(http::request_header::kUserAgent,
- user_agent));
- }
- if (!referer.empty()) {
- headers_copy.push_back(std::make_pair(http::request_header::kReferer,
- referer));
- }
- std::unique_ptr<http::Connection> connection(
- new http::fake::Connection(url, method, transport));
- CHECK(connection) << "Unable to create Connection object";
- if (!connection->SendHeaders(headers_copy, error))
- connection.reset();
- request_count_++;
- return connection;
-}
-
-static inline std::string GetHandlerMapKey(const std::string& url,
- const std::string& method) {
- return method + ":" + url;
-}
-
-void Transport::AddHandler(const std::string& url, const std::string& method,
- const HandlerCallback& handler) {
- handlers_.insert(std::make_pair(GetHandlerMapKey(url, method), handler));
-}
-
-void Transport::AddSimpleReplyHandler(const std::string& url,
- const std::string& method,
- int status_code,
- const std::string& reply_text,
- const std::string& mime_type) {
- auto handler = [status_code, reply_text, mime_type](
- const ServerRequest& request, ServerResponse* response) {
- response->ReplyText(status_code, reply_text, mime_type.c_str());
- };
- AddHandler(url, method, base::Bind(handler));
-}
-
-Transport::HandlerCallback Transport::GetHandler(
- const std::string& url, const std::string& method) const {
- // First try the exact combination of URL/Method
- auto p = handlers_.find(GetHandlerMapKey(url, method));
- if (p != handlers_.end())
- return p->second;
- // If not found, try URL/*
- p = handlers_.find(GetHandlerMapKey(url, "*"));
- if (p != handlers_.end())
- return p->second;
- // If still not found, try */method
- p = handlers_.find(GetHandlerMapKey("*", method));
- if (p != handlers_.end())
- return p->second;
- // Finally, try */*
- p = handlers_.find(GetHandlerMapKey("*", "*"));
- return (p != handlers_.end()) ? p->second : HandlerCallback();
-}
-
-void ServerRequestResponseBase::AddData(const void* data, size_t data_size) {
- auto bytes = reinterpret_cast<const unsigned char*>(data);
- data_.insert(data_.end(), bytes, bytes + data_size);
-}
-
-std::string ServerRequestResponseBase::GetDataAsString() const {
- if (data_.empty())
- return std::string();
- auto chars = reinterpret_cast<const char*>(data_.data());
- return std::string(chars, data_.size());
-}
-
-std::unique_ptr<base::DictionaryValue>
- ServerRequestResponseBase::GetDataAsJson() const {
- if (chromeos::mime::RemoveParameters(
- GetHeader(request_header::kContentType)) ==
- chromeos::mime::application::kJson) {
- auto value = base::JSONReader::Read(GetDataAsString());
- if (value) {
- base::DictionaryValue* dict = nullptr;
- if (value->GetAsDictionary(&dict)) {
- return std::unique_ptr<base::DictionaryValue>(dict);
- } else {
- delete value;
- }
- }
- }
- return std::unique_ptr<base::DictionaryValue>();
-}
-
-void ServerRequestResponseBase::AddHeaders(const HeaderList& headers) {
- for (const auto& pair : headers) {
- if (pair.second.empty())
- headers_.erase(pair.first);
- else
- headers_.insert(pair);
- }
-}
-
-std::string ServerRequestResponseBase::GetHeader(
- const std::string& header_name) const {
- auto p = headers_.find(header_name);
- return p != headers_.end() ? p->second : std::string();
-}
-
-ServerRequest::ServerRequest(const std::string& url,
- const std::string& method) : method_(method) {
- auto params = chromeos::url::GetQueryStringParameters(url);
- url_ = chromeos::url::RemoveQueryString(url, true);
- form_fields_.insert(params.begin(), params.end());
-}
-
-std::string ServerRequest::GetFormField(const std::string& field_name) const {
- if (!form_fields_parsed_) {
- std::string mime_type = chromeos::mime::RemoveParameters(
- GetHeader(request_header::kContentType));
- if (mime_type == chromeos::mime::application::kWwwFormUrlEncoded &&
- !GetData().empty()) {
- auto fields = chromeos::data_encoding::WebParamsDecode(GetDataAsString());
- form_fields_.insert(fields.begin(), fields.end());
- }
- form_fields_parsed_ = true;
- }
- auto p = form_fields_.find(field_name);
- return p != form_fields_.end() ? p->second : std::string();
-}
-
-void ServerResponse::Reply(int status_code, const void* data, size_t data_size,
- const char* mime_type) {
- data_.clear();
- status_code_ = status_code;
- AddData(data, data_size);
- AddHeaders({
- {response_header::kContentLength,
- chromeos::string_utils::ToString(data_size)},
- {response_header::kContentType, mime_type}
- });
-}
-
-void ServerResponse::ReplyText(int status_code, const std::string& text,
- const char* mime_type) {
- Reply(status_code, text.data(), text.size(), mime_type);
-}
-
-void ServerResponse::ReplyJson(int status_code, const base::Value* json) {
- std::string text;
- base::JSONWriter::WriteWithOptions(json,
- base::JSONWriter::OPTIONS_PRETTY_PRINT,
- &text);
- std::string mime_type = chromeos::mime::AppendParameter(
- chromeos::mime::application::kJson,
- chromeos::mime::parameters::kCharset,
- "utf-8");
- ReplyText(status_code, text, mime_type.c_str());
-}
-
-void ServerResponse::ReplyJson(int status_code,
- const http::FormFieldList& fields) {
- base::DictionaryValue json;
- for (const auto& pair : fields) {
- json.SetString(pair.first, pair.second);
- }
- ReplyJson(status_code, &json);
-}
-
-std::string ServerResponse::GetStatusText() const {
- static std::vector<std::pair<int, const char*>> status_text_map = {
- {100, "Continue"},
- {101, "Switching Protocols"},
- {102, "Processing"},
- {200, "OK"},
- {201, "Created"},
- {202, "Accepted"},
- {203, "Non-Authoritative Information"},
- {204, "No Content"},
- {205, "Reset Content"},
- {206, "Partial Content"},
- {207, "Multi-Status"},
- {208, "Already Reported"},
- {226, "IM Used"},
- {300, "Multiple Choices"},
- {301, "Moved Permanently"},
- {302, "Found"},
- {303, "See Other"},
- {304, "Not Modified"},
- {305, "Use Proxy"},
- {306, "Switch Proxy"},
- {307, "Temporary Redirect"},
- {308, "Permanent Redirect"},
- {400, "Bad Request"},
- {401, "Unauthorized"},
- {402, "Payment Required"},
- {403, "Forbidden"},
- {404, "Not Found"},
- {405, "Method Not Allowed"},
- {406, "Not Acceptable"},
- {407, "Proxy Authentication Required"},
- {408, "Request Timeout"},
- {409, "Conflict"},
- {410, "Gone"},
- {411, "Length Required"},
- {412, "Precondition Failed"},
- {413, "Request Entity Too Large"},
- {414, "Request - URI Too Long"},
- {415, "Unsupported Media Type"},
- {429, "Too Many Requests"},
- {431, "Request Header Fields Too Large"},
- {500, "Internal Server Error"},
- {501, "Not Implemented"},
- {502, "Bad Gateway"},
- {503, "Service Unavailable"},
- {504, "Gateway Timeout"},
- {505, "HTTP Version Not Supported"},
- };
-
- for (const auto& pair : status_text_map) {
- if (pair.first == status_code_)
- return pair.second;
- }
- return std::string();
-}
-
-} // namespace buffet
diff --git a/buffet/http_transport_fake.h b/buffet/http_transport_fake.h
deleted file mode 100644
index 1e58c65..0000000
--- a/buffet/http_transport_fake.h
+++ /dev/null
@@ -1,223 +0,0 @@
-// 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_TRANSPORT_FAKE_H_
-#define BUFFET_HTTP_TRANSPORT_FAKE_H_
-
-#include <map>
-#include <string>
-#include <type_traits>
-#include <vector>
-
-#include <base/callback.h>
-#include <base/values.h>
-
-#include "buffet/http_transport.h"
-#include "buffet/http_utils.h"
-
-namespace buffet {
-namespace http {
-namespace fake {
-
-class ServerRequest;
-class ServerResponse;
-class Connection;
-
-///////////////////////////////////////////////////////////////////////////////
-// A fake implementation of http::Transport that simulates HTTP communication
-// with a server.
-///////////////////////////////////////////////////////////////////////////////
-class Transport : public http::Transport {
- public:
- Transport();
- virtual ~Transport();
-
- // Server handler callback signature.
- typedef base::Callback<void(const ServerRequest&, ServerResponse*)>
- HandlerCallback;
-
- // This method allows the test code to provide a callback to handle requests
- // for specific URL/HTTP-verb combination. When a specific |method| request
- // is made on the given |url|, the |handler| will be invoked and all the
- // request data will be filled in the |ServerRequest| parameter. Any server
- // response should be returned through the |ServerResponse| parameter.
- // Either |method| or |url| (or both) can be specified as "*" to handle
- // any requests. So, ("http://localhost","*") will handle any request type
- // on that URL and ("*","GET") will handle any GET requests.
- // The lookup starts with the most specific data pair to the catch-all (*,*).
- void AddHandler(const std::string& url, const std::string& method,
- const HandlerCallback& handler);
- // Simple version of AddHandler. AddSimpleReplyHandler just returns the
- // specified text response of given MIME type.
- void AddSimpleReplyHandler(const std::string& url,
- const std::string& method,
- int status_code,
- const std::string& reply_text,
- const std::string& mime_type);
- // Retrieve a handler for specific |url| and request |method|.
- HandlerCallback GetHandler(const std::string& url,
- const std::string& method) const;
-
- // For tests that want to assert on the number of HTTP requests sent,
- // these methods can be used to do just that.
- int GetRequestCount() const { return request_count_; }
- void ResetRequestCount() { request_count_ = 0; }
-
- // Overload from http::Transport
- std::unique_ptr<http::Connection> 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,
- chromeos::ErrorPtr* error) override;
-
- private:
- // A list of user-supplied request handlers.
- std::map<std::string, HandlerCallback> handlers_;
- // Counter incremented each time a request is made.
- int request_count_ = 0;
-
- DISALLOW_COPY_AND_ASSIGN(Transport);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// A base class for ServerRequest and ServerResponse. It provides common
-// functionality to work with request/response HTTP headers and data.
-///////////////////////////////////////////////////////////////////////////////
-class ServerRequestResponseBase {
- public:
- ServerRequestResponseBase() = default;
-
- // Add/retrieve request/response body data.
- void AddData(const void* data, size_t data_size);
- const std::vector<unsigned char>& GetData() const { return data_; }
- std::string GetDataAsString() const;
- std::unique_ptr<base::DictionaryValue> GetDataAsJson() const;
-
- // Add/retrieve request/response HTTP headers.
- void AddHeaders(const HeaderList& headers);
- std::string GetHeader(const std::string& header_name) const;
- const std::map<std::string, std::string>& GetHeaders() const {
- return headers_;
- }
-
- protected:
- // Data buffer.
- std::vector<unsigned char> data_;
- // Header map.
- std::map<std::string, std::string> headers_;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(ServerRequestResponseBase);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// A container class that encapsulates all the HTTP server request information.
-///////////////////////////////////////////////////////////////////////////////
-class ServerRequest : public ServerRequestResponseBase {
- public:
- ServerRequest(const std::string& url, const std::string& method);
-
- // Get the actual request URL. Does not include the query string or fragment.
- const std::string& GetURL() const { return url_; }
- // Get the request method.
- const std::string& GetMethod() const { return method_; }
- // Get the POST/GET request parameters. These are parsed query string
- // parameters from the URL. In addition, for POST requests with
- // application/x-www-form-urlencoded content type, the request body is also
- // parsed and individual fields can be accessed through this method.
- std::string GetFormField(const std::string& field_name) const;
-
- private:
- // Request URL (without query string or URL fragment).
- std::string url_;
- // Request method
- std::string method_;
- // List of available request data form fields.
- mutable std::map<std::string, std::string> form_fields_;
- // Flag used on first request to GetFormField to parse the body of HTTP POST
- // request with application/x-www-form-urlencoded content.
- mutable bool form_fields_parsed_ = false;
-
- DISALLOW_COPY_AND_ASSIGN(ServerRequest);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// A container class that encapsulates all the HTTP server response information.
-// The request handler will use this class to provide a response to the caller.
-// Call the Reply() or the appropriate ReplyNNN() specialization to provide
-// the response data. Additional calls to AddHeaders() can be made to provide
-// custom response headers. The Reply-methods will already provide the
-// following response headers:
-// Content-Length
-// Content-Type
-///////////////////////////////////////////////////////////////////////////////
-class ServerResponse : public ServerRequestResponseBase {
- public:
- ServerResponse() = default;
-
- // Generic reply method.
- void Reply(int status_code, const void* data, size_t data_size,
- const char* mime_type);
- // Reply with text body.
- void ReplyText(int status_code, const std::string& text,
- const char* mime_type);
- // Reply with JSON object. The content type will be "application/json".
- void ReplyJson(int status_code, const base::Value* json);
- // Special form for JSON response for simple objects that have a flat
- // list of key-value pairs of string type.
- void ReplyJson(int status_code, const FormFieldList& fields);
-
- // Specialized overload to send the binary data as an array of simple
- // data elements. Only trivial data types (scalars, POD structures, etc)
- // can be used.
- template<typename T>
- void Reply(int status_code, const std::vector<T>& data,
- const char* mime_type) {
- // Make sure T doesn't have virtual functions, custom constructors, etc.
- static_assert(std::is_trivial<T>::value, "Only simple data is supported");
- Reply(status_code, data.data(), data.size() * sizeof(T), mime_type);
- }
-
- // Specialized overload to send the binary data.
- // Only trivial data types (scalars, POD structures, etc) can be used.
- template<typename T>
- void Reply(int status_code, const T& data, const char* mime_type) {
- // Make sure T doesn't have virtual functions, custom constructors, etc.
- static_assert(std::is_trivial<T>::value, "Only simple data is supported");
- Reply(status_code, &data, sizeof(T), mime_type);
- }
-
- // For handlers that want to simulate versions of HTTP protocol other
- // than HTTP/1.1, call this method with the custom version string,
- // for example "HTTP/1.0".
- void SetProtocolVersion(const std::string& protocol_version) {
- protocol_version_ = protocol_version;
- }
-
- protected:
- // These methods are helpers to implement corresponding functionality
- // of fake::Connection.
- friend class Connection;
- // Helper for fake::Connection::GetResponseStatusCode().
- int GetStatusCode() const { return status_code_; }
- // Helper for fake::Connection::GetResponseStatusText().
- std::string GetStatusText() const;
- // Helper for fake::Connection::GetProtocolVersion().
- std::string GetProtocolVersion() const { return protocol_version_; }
-
- private:
- int status_code_ = 0;
- std::string protocol_version_ = "HTTP/1.1";
-
- DISALLOW_COPY_AND_ASSIGN(ServerResponse);
-};
-
-} // namespace fake
-} // namespace http
-} // namespace buffet
-
-#endif // BUFFET_HTTP_TRANSPORT_FAKE_H_
diff --git a/buffet/http_utils.cc b/buffet/http_utils.cc
deleted file mode 100644
index d61d176..0000000
--- a/buffet/http_utils.cc
+++ /dev/null
@@ -1,171 +0,0 @@
-// 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_utils.h"
-
-#include <algorithm>
-
-#include <base/json/json_reader.h>
-#include <base/json/json_writer.h>
-#include <base/values.h>
-#include <chromeos/data_encoding.h>
-#include <chromeos/error_codes.h>
-#include <chromeos/mime_utils.h>
-
-using chromeos::mime::AppendParameter;
-using chromeos::mime::RemoveParameters;
-
-namespace buffet {
-namespace http {
-
-std::unique_ptr<Response> Get(const std::string& url,
- const HeaderList& headers,
- std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error) {
- return SendRequest(request_type::kGet, url, nullptr, 0, nullptr,
- headers, transport, error);
-}
-
-std::string GetAsString(const std::string& url,
- const HeaderList& headers,
- std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error) {
- auto resp = Get(url, headers, transport, error);
- return resp ? resp->GetDataAsString() : std::string();
-}
-
-std::unique_ptr<Response> Head(const std::string& url,
- std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error) {
- Request request(url, request_type::kHead, transport);
- return request.GetResponse(error);
-}
-
-std::unique_ptr<Response> PostText(const std::string& url,
- const char* data,
- const char* mime_type,
- const HeaderList& headers,
- std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error) {
- if (mime_type == nullptr) {
- mime_type = chromeos::mime::application::kWwwFormUrlEncoded;
- }
-
- return PostBinary(url, data, strlen(data), mime_type, headers, transport,
- error);
-}
-
-std::unique_ptr<Response> SendRequest(const char * method,
- const std::string& url,
- const void* data,
- size_t data_size,
- const char* mime_type,
- const HeaderList& headers,
- std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error) {
- Request request(url, method, transport);
- request.AddHeaders(headers);
- if (data_size > 0) {
- if (mime_type == nullptr) {
- mime_type = chromeos::mime::application::kOctet_stream;
- }
- request.SetContentType(mime_type);
- if (!request.AddRequestBody(data, data_size, error))
- return std::unique_ptr<Response>();
- }
- return request.GetResponse(error);
-}
-
-std::unique_ptr<Response> PostBinary(const std::string & url, const void* data,
- size_t data_size, const char* mime_type,
- const HeaderList& headers,
- std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error) {
- return SendRequest(request_type::kPost, url,
- data, data_size, mime_type, headers, transport, error);
-}
-
-std::unique_ptr<Response> PostFormData(const std::string& url,
- const FormFieldList& data,
- const HeaderList& headers,
- std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error) {
- std::string encoded_data = chromeos::data_encoding::WebParamsEncode(data);
- return PostBinary(url, encoded_data.c_str(), encoded_data.size(),
- chromeos::mime::application::kWwwFormUrlEncoded,
- headers, transport, error);
-}
-
-
-std::unique_ptr<Response> PostJson(const std::string& url,
- const base::Value* json,
- const HeaderList& headers,
- std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error) {
- std::string data;
- if (json)
- base::JSONWriter::Write(json, &data);
- std::string mime_type = AppendParameter(chromeos::mime::application::kJson,
- chromeos::mime::parameters::kCharset,
- "utf-8");
- return PostBinary(url, data.c_str(), data.size(),
- mime_type.c_str(), headers, transport, error);
-}
-
-std::unique_ptr<Response> PatchJson(const std::string& url,
- const base::Value* json,
- const HeaderList& headers,
- std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error) {
- std::string data;
- if (json)
- base::JSONWriter::Write(json, &data);
- std::string mime_type = AppendParameter(chromeos::mime::application::kJson,
- chromeos::mime::parameters::kCharset,
- "utf-8");
- return SendRequest(request_type::kPatch, url, data.c_str(), data.size(),
- mime_type.c_str(), headers, transport, error);
-}
-
-std::unique_ptr<base::DictionaryValue> ParseJsonResponse(
- const Response* response, int* status_code, chromeos::ErrorPtr* error) {
- if (!response)
- return std::unique_ptr<base::DictionaryValue>();
-
- if (status_code)
- *status_code = response->GetStatusCode();
-
- // Make sure we have a correct content type. Do not try to parse
- // binary files, or HTML output. Limit to application/json and text/plain.
- auto content_type = RemoveParameters(response->GetContentType());
- if (content_type != chromeos::mime::application::kJson &&
- content_type != chromeos::mime::text::kPlain) {
- chromeos::Error::AddTo(error, chromeos::errors::json::kDomain,
- "non_json_content_type",
- "Unexpected response content type: " + content_type);
- return std::unique_ptr<base::DictionaryValue>();
- }
-
- std::string json = response->GetDataAsString();
- std::string error_message;
- base::Value* value = base::JSONReader::ReadAndReturnError(
- json, base::JSON_PARSE_RFC, nullptr, &error_message);
- if (!value) {
- chromeos::Error::AddTo(error, chromeos::errors::json::kDomain,
- chromeos::errors::json::kParseError, error_message);
- return std::unique_ptr<base::DictionaryValue>();
- }
- base::DictionaryValue* dict_value = nullptr;
- if (!value->GetAsDictionary(&dict_value)) {
- delete value;
- chromeos::Error::AddTo(error, chromeos::errors::json::kDomain,
- chromeos::errors::json::kObjectExpected,
- "Response is not a valid JSON object");
- return std::unique_ptr<base::DictionaryValue>();
- }
- return std::unique_ptr<base::DictionaryValue>(dict_value);
-}
-
-} // namespace http
-} // namespace buffet
diff --git a/buffet/http_utils.h b/buffet/http_utils.h
deleted file mode 100644
index 938905d..0000000
--- a/buffet/http_utils.h
+++ /dev/null
@@ -1,180 +0,0 @@
-// 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_UTILS_H_
-#define BUFFET_HTTP_UTILS_H_
-
-#include <string>
-#include <utility>
-#include <vector>
-
-#include <chromeos/error.h>
-
-#include "buffet/http_request.h"
-
-namespace base {
-class Value;
-class DictionaryValue;
-} // namespace base
-
-namespace buffet {
-namespace http {
-
-typedef std::vector<std::pair<std::string, std::string>> FormFieldList;
-
-////////////////////////////////////////////////////////////////////////////////
-// The following are simple utility helper functions for common HTTP operations
-// that use http::Request object behind the scenes and set it up accordingly.
-//
-// For more advanced functionality you need to use Request/Response objects
-// directly.
-////////////////////////////////////////////////////////////////////////////////
-
-// Performs a generic HTTP request with binary data. Success status,
-// returned data and additional information (such as returned HTTP headers)
-// can be obtained from the returned Response object.
-// If data MIME type is not specified, "application/octet-stream" is assumed.
-std::unique_ptr<Response> SendRequest(
- const char* method, const std::string& url,
- const void* data, size_t data_size, const char* mime_type,
- const HeaderList& headers, std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error);
-
-// Performs a simple GET request and returns the data as a string.
-std::string GetAsString(const std::string& url, const HeaderList& headers,
- std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error);
-inline std::string GetAsString(const std::string& url,
- std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error) {
- return GetAsString(url, HeaderList(), transport, error);
-}
-
-// Performs a GET request. Success status, returned data and additional
-// information (such as returned HTTP headers) can be obtained from
-// the returned Response object.
-std::unique_ptr<Response> Get(const std::string& url,
- const HeaderList& headers,
- std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error);
-inline std::unique_ptr<Response> Get(
- const std::string& url, std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error) {
- return Get(url, HeaderList(), transport, error);
-}
-
-// Performs a HEAD request. Success status and additional
-// information (such as returned HTTP headers) can be obtained from
-// the returned Response object.
-std::unique_ptr<Response> Head(const std::string& url,
- std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error);
-
-// Performs a POST request with binary data. Success status, returned data
-// and additional information (such as returned HTTP headers) can be obtained
-// from the returned Response object.
-// If data MIME type is not specified, "application/octet-stream" is assumed
-std::unique_ptr<Response> PostBinary(const std::string& url,
- const void* data,
- size_t data_size,
- const char* mime_type,
- const HeaderList& headers,
- std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error);
-
-inline std::unique_ptr<Response> PostBinary(
- const std::string& url, const void* data, size_t data_size,
- const char* mime_type, std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error) {
- return PostBinary(url, data, data_size, mime_type, HeaderList(), transport,
- error);
-}
-
-inline std::unique_ptr<Response> PostBinary(
- const std::string& url, const void* data, size_t data_size,
- std::shared_ptr<Transport> transport, chromeos::ErrorPtr* error) {
- return PostBinary(url, data, data_size, nullptr, transport, error);
-}
-
-// Performs a POST request with text data. Success status, returned data
-// and additional information (such as returned HTTP headers) can be obtained
-// from the returned Response object.
-// If data MIME type is not specified, "application/x-www-form-urlencoded"
-// is assumed.
-std::unique_ptr<Response> PostText(const std::string& url,
- const char* data,
- const char* mime_type,
- const HeaderList& headers,
- std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error);
-
-inline std::unique_ptr<Response> PostText(
- const std::string& url, const char* data, const char* mime_type,
- std::shared_ptr<Transport> transport, chromeos::ErrorPtr* error) {
- return PostText(url, data, mime_type, HeaderList(), transport, error);
-}
-
-inline std::unique_ptr<Response> PostText(
- const std::string& url, const char* data,
- std::shared_ptr<Transport> transport, chromeos::ErrorPtr* error) {
- return PostText(url, data, nullptr, transport, error);
-}
-
-// Performs a POST request with form data. Success status, returned data
-// and additional information (such as returned HTTP headers) can be obtained
-// from the returned Response object. The form data is a list of key/value
-// pairs. The data is posed as "application/x-www-form-urlencoded".
-std::unique_ptr<Response> PostFormData(
- const std::string& url, const FormFieldList& data,
- const HeaderList& headers, std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error);
-
-inline std::unique_ptr<Response> PostFormData(
- const std::string& url, const FormFieldList& data,
- std::shared_ptr<Transport> transport, chromeos::ErrorPtr* error) {
- return PostFormData(url, data, HeaderList(), transport, error);
-}
-
-// Performs a POST request with JSON data. Success status, returned data
-// and additional information (such as returned HTTP headers) can be obtained
-// from the returned Response object. If a JSON response is expected,
-// use ParseJsonResponse() method on the returned Response object.
-std::unique_ptr<Response> PostJson(const std::string& url,
- const base::Value* json,
- const HeaderList& headers,
- std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error);
-
-inline std::unique_ptr<Response> PostJson(
- const std::string& url, const base::Value* json,
- std::shared_ptr<Transport> transport, chromeos::ErrorPtr* error) {
- return PostJson(url, json, HeaderList(), transport, error);
-}
-
-// Performs a PATCH request with JSON data. Success status, returned data
-// and additional information (such as returned HTTP headers) can be obtained
-// from the returned Response object. If a JSON response is expected,
-// use ParseJsonResponse() method on the returned Response object.
-std::unique_ptr<Response> PatchJson(const std::string& url,
- const base::Value* json,
- const HeaderList& headers,
- std::shared_ptr<Transport> transport,
- chromeos::ErrorPtr* error);
-
-inline std::unique_ptr<Response> PatchJson(
- const std::string& url, const base::Value* json,
- std::shared_ptr<Transport> transport, chromeos::ErrorPtr* error) {
- return PatchJson(url, json, HeaderList(), transport, error);
-}
-
-// Given an http::Response object, parse the body data into Json object.
-// Returns null if failed. Optional |error| can be passed in to
-// get the extended error information as to why the parse failed.
-std::unique_ptr<base::DictionaryValue> ParseJsonResponse(
- const Response* response, int* status_code, chromeos::ErrorPtr* error);
-
-} // namespace http
-} // namespace buffet
-
-#endif // BUFFET_HTTP_UTILS_H_
diff --git a/buffet/http_utils_unittest.cc b/buffet/http_utils_unittest.cc
deleted file mode 100644
index 8f40ad7..0000000
--- a/buffet/http_utils_unittest.cc
+++ /dev/null
@@ -1,341 +0,0 @@
-// 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 <string>
-#include <vector>
-
-#include <base/values.h>
-#include <chromeos/bind_lambda.h>
-#include <chromeos/mime_utils.h>
-#include <chromeos/string_utils.h>
-#include <chromeos/url_utils.h>
-#include <gtest/gtest.h>
-
-#include "buffet/http_transport_fake.h"
-#include "buffet/http_utils.h"
-
-using namespace buffet; // NOLINT(build/namespaces)
-using namespace buffet::http; // NOLINT(build/namespaces)
-
-static const char kFakeUrl[] = "http://localhost";
-static const char kEchoUrl[] = "http://localhost/echo";
-static const char kMethodEchoUrl[] = "http://localhost/echo/method";
-
-///////////////////// Generic helper request handlers /////////////////////////
-// Returns the request data back with the same content type.
-static void EchoDataHandler(const fake::ServerRequest& request,
- fake::ServerResponse* response) {
- response->Reply(status_code::Ok, request.GetData(),
- request.GetHeader(request_header::kContentType).c_str());
-}
-
-// Returns the request method as a plain text response.
-static void EchoMethodHandler(const fake::ServerRequest& request,
- fake::ServerResponse* response) {
- response->ReplyText(status_code::Ok, request.GetMethod(),
- chromeos::mime::text::kPlain);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-TEST(HttpUtils, SendRequest_BinaryData) {
- std::shared_ptr<fake::Transport> transport(new fake::Transport);
- transport->AddHandler(kEchoUrl, request_type::kPost,
- base::Bind(EchoDataHandler));
-
- // Test binary data round-tripping.
- std::vector<unsigned char> custom_data{0xFF, 0x00, 0x80, 0x40, 0xC0, 0x7F};
- auto response = http::SendRequest(request_type::kPost, kEchoUrl,
- custom_data.data(), custom_data.size(),
- chromeos::mime::application::kOctet_stream,
- HeaderList(), transport, nullptr);
- EXPECT_TRUE(response->IsSuccessful());
- EXPECT_EQ(chromeos::mime::application::kOctet_stream,
- response->GetContentType());
- EXPECT_EQ(custom_data.size(), response->GetData().size());
- EXPECT_EQ(custom_data, response->GetData());
-}
-
-TEST(HttpUtils, SendRequest_Post) {
- std::shared_ptr<fake::Transport> transport(new fake::Transport);
- transport->AddHandler(kMethodEchoUrl, "*", base::Bind(EchoMethodHandler));
-
- // Test binary data round-tripping.
- std::vector<unsigned char> custom_data{0xFF, 0x00, 0x80, 0x40, 0xC0, 0x7F};
-
- // Check the correct HTTP method used.
- auto response = http::SendRequest(request_type::kPost, kMethodEchoUrl,
- custom_data.data(), custom_data.size(),
- chromeos::mime::application::kOctet_stream,
- HeaderList(), transport, nullptr);
- EXPECT_TRUE(response->IsSuccessful());
- EXPECT_EQ(chromeos::mime::text::kPlain, response->GetContentType());
- EXPECT_EQ(request_type::kPost, response->GetDataAsString());
-}
-
-TEST(HttpUtils, SendRequest_Get) {
- std::shared_ptr<fake::Transport> transport(new fake::Transport);
- transport->AddHandler(kMethodEchoUrl, "*", base::Bind(EchoMethodHandler));
-
- auto response = http::SendRequest(request_type::kGet, kMethodEchoUrl,
- nullptr, 0, nullptr,
- HeaderList(), transport, nullptr);
- EXPECT_TRUE(response->IsSuccessful());
- EXPECT_EQ(chromeos::mime::text::kPlain, response->GetContentType());
- EXPECT_EQ(request_type::kGet, response->GetDataAsString());
-}
-
-TEST(HttpUtils, SendRequest_Put) {
- std::shared_ptr<fake::Transport> transport(new fake::Transport);
- transport->AddHandler(kMethodEchoUrl, "*", base::Bind(EchoMethodHandler));
-
- auto response = http::SendRequest(request_type::kPut, kMethodEchoUrl,
- nullptr, 0, nullptr,
- HeaderList(), transport, nullptr);
- EXPECT_TRUE(response->IsSuccessful());
- EXPECT_EQ(chromeos::mime::text::kPlain, response->GetContentType());
- EXPECT_EQ(request_type::kPut, response->GetDataAsString());
-}
-
-TEST(HttpUtils, SendRequest_NotFound) {
- std::shared_ptr<fake::Transport> transport(new fake::Transport);
- // Test failed response (URL not found).
- auto response = http::SendRequest(request_type::kGet, "http://blah.com",
- nullptr, 0, nullptr,
- HeaderList(), transport, nullptr);
- EXPECT_FALSE(response->IsSuccessful());
- EXPECT_EQ(status_code::NotFound, response->GetStatusCode());
-}
-
-TEST(HttpUtils, SendRequest_Headers) {
- std::shared_ptr<fake::Transport> transport(new fake::Transport);
-
- static const char json_echo_url[] = "http://localhost/echo/json";
- auto JsonEchoHandler = [](const fake::ServerRequest& request,
- fake::ServerResponse* response) {
- base::DictionaryValue json;
- json.SetString("method", request.GetMethod());
- json.SetString("data", request.GetDataAsString());
- for (const auto& pair : request.GetHeaders()) {
- json.SetString("header." + pair.first, pair.second);
- }
- response->ReplyJson(status_code::Ok, &json);
- };
- transport->AddHandler(json_echo_url, "*",
- base::Bind(JsonEchoHandler));
- auto response = http::SendRequest(
- request_type::kPost, json_echo_url, "abcd", 4,
- chromeos::mime::application::kOctet_stream, {
- {request_header::kCookie, "flavor=vanilla"},
- {request_header::kIfMatch, "*"},
- }, transport, nullptr);
- EXPECT_TRUE(response->IsSuccessful());
- EXPECT_EQ(chromeos::mime::application::kJson,
- chromeos::mime::RemoveParameters(response->GetContentType()));
- auto json = ParseJsonResponse(response.get(), nullptr, nullptr);
- std::string value;
- EXPECT_TRUE(json->GetString("method", &value));
- EXPECT_EQ(request_type::kPost, value);
- EXPECT_TRUE(json->GetString("data", &value));
- EXPECT_EQ("abcd", value);
- EXPECT_TRUE(json->GetString("header.Cookie", &value));
- EXPECT_EQ("flavor=vanilla", value);
- EXPECT_TRUE(json->GetString("header.Content-Type", &value));
- EXPECT_EQ(chromeos::mime::application::kOctet_stream, value);
- EXPECT_TRUE(json->GetString("header.Content-Length", &value));
- EXPECT_EQ("4", value);
- EXPECT_TRUE(json->GetString("header.If-Match", &value));
- EXPECT_EQ("*", value);
-}
-
-TEST(HttpUtils, Get) {
- // Sends back the "?test=..." portion of URL.
- // So if we do GET "http://localhost?test=blah", this handler responds
- // with "blah" as text/plain.
- auto GetHandler = [](const fake::ServerRequest& request,
- fake::ServerResponse* response) {
- EXPECT_EQ(request_type::kGet, request.GetMethod());
- EXPECT_EQ("0", request.GetHeader(request_header::kContentLength));
- EXPECT_EQ("", request.GetHeader(request_header::kContentType));
- response->ReplyText(status_code::Ok, request.GetFormField("test"),
- chromeos::mime::text::kPlain);
- };
-
- std::shared_ptr<fake::Transport> transport(new fake::Transport);
- transport->AddHandler(kFakeUrl, request_type::kGet, base::Bind(GetHandler));
- transport->AddHandler(kMethodEchoUrl, "*", base::Bind(EchoMethodHandler));
-
- // Make sure Get/GetAsString actually do the GET request
- auto response = http::Get(kMethodEchoUrl, transport, nullptr);
- EXPECT_TRUE(response->IsSuccessful());
- EXPECT_EQ(chromeos::mime::text::kPlain, response->GetContentType());
- EXPECT_EQ(request_type::kGet, response->GetDataAsString());
- EXPECT_EQ(request_type::kGet,
- http::GetAsString(kMethodEchoUrl, transport, nullptr));
-
- for (std::string data : {"blah", "some data", ""}) {
- std::string url = chromeos::url::AppendQueryParam(kFakeUrl, "test", data);
- EXPECT_EQ(data, http::GetAsString(url, transport, nullptr));
- }
-}
-
-TEST(HttpUtils, Head) {
- auto HeadHandler = [](const fake::ServerRequest& request,
- fake::ServerResponse* response) {
- EXPECT_EQ(request_type::kHead, request.GetMethod());
- EXPECT_EQ("0", request.GetHeader(request_header::kContentLength));
- EXPECT_EQ("", request.GetHeader(request_header::kContentType));
- response->ReplyText(status_code::Ok, "blah",
- chromeos::mime::text::kPlain);
- };
-
- std::shared_ptr<fake::Transport> transport(new fake::Transport);
- transport->AddHandler(kFakeUrl, request_type::kHead, base::Bind(HeadHandler));
-
- auto response = http::Head(kFakeUrl, transport, nullptr);
- EXPECT_TRUE(response->IsSuccessful());
- EXPECT_EQ(chromeos::mime::text::kPlain, response->GetContentType());
- EXPECT_EQ("", response->GetDataAsString()); // Must not have actual body.
- EXPECT_EQ("4", response->GetHeader(request_header::kContentLength));
-}
-
-TEST(HttpUtils, PostBinary) {
- auto Handler = [](const fake::ServerRequest& request,
- fake::ServerResponse* response) {
- EXPECT_EQ(request_type::kPost, request.GetMethod());
- EXPECT_EQ("256", request.GetHeader(request_header::kContentLength));
- EXPECT_EQ(chromeos::mime::application::kOctet_stream,
- request.GetHeader(request_header::kContentType));
- const auto& data = request.GetData();
- EXPECT_EQ(256, data.size());
-
- // Sum up all the bytes.
- int sum = std::accumulate(data.begin(), data.end(), 0);
- EXPECT_EQ(32640, sum); // sum(i, i => [0, 255]) = 32640.
- response->ReplyText(status_code::Ok, "", chromeos::mime::text::kPlain);
- };
-
- std::shared_ptr<fake::Transport> transport(new fake::Transport);
- transport->AddHandler(kFakeUrl, request_type::kPost, base::Bind(Handler));
-
- /// Fill the data buffer with bytes from 0x00 to 0xFF.
- std::vector<unsigned char> data(256);
- std::iota(data.begin(), data.end(), 0);
-
- auto response = http::PostBinary(kFakeUrl, data.data(), data.size(),
- transport, nullptr);
- EXPECT_TRUE(response->IsSuccessful());
-}
-
-TEST(HttpUtils, PostText) {
- std::string fake_data = "Some data";
- auto PostHandler = [fake_data](const fake::ServerRequest& request,
- fake::ServerResponse* response) {
- EXPECT_EQ(request_type::kPost, request.GetMethod());
- EXPECT_EQ(fake_data.size(),
- std::stoul(request.GetHeader(request_header::kContentLength)));
- EXPECT_EQ(chromeos::mime::text::kPlain,
- request.GetHeader(request_header::kContentType));
- response->ReplyText(status_code::Ok, request.GetDataAsString(),
- chromeos::mime::text::kPlain);
- };
-
- std::shared_ptr<fake::Transport> transport(new fake::Transport);
- transport->AddHandler(kFakeUrl, request_type::kPost, base::Bind(PostHandler));
-
- auto response = http::PostText(kFakeUrl, fake_data.c_str(),
- chromeos::mime::text::kPlain,
- transport, nullptr);
- EXPECT_TRUE(response->IsSuccessful());
- EXPECT_EQ(chromeos::mime::text::kPlain, response->GetContentType());
- EXPECT_EQ(fake_data, response->GetDataAsString());
-}
-
-TEST(HttpUtils, PostFormData) {
- std::shared_ptr<fake::Transport> transport(new fake::Transport);
- transport->AddHandler(kFakeUrl, request_type::kPost,
- base::Bind(EchoDataHandler));
-
- auto response = http::PostFormData(kFakeUrl, {
- {"key", "value"},
- {"field", "field value"},
- }, transport, nullptr);
- EXPECT_TRUE(response->IsSuccessful());
- EXPECT_EQ(chromeos::mime::application::kWwwFormUrlEncoded,
- response->GetContentType());
- EXPECT_EQ("key=value&field=field+value", response->GetDataAsString());
-}
-
-TEST(HttpUtils, PostPatchJson) {
- auto JsonHandler = [](const fake::ServerRequest& request,
- fake::ServerResponse* response) {
- auto mime_type = chromeos::mime::RemoveParameters(
- request.GetHeader(request_header::kContentType));
- EXPECT_EQ(chromeos::mime::application::kJson, mime_type);
- response->ReplyJson(status_code::Ok, {
- {"method", request.GetMethod()},
- {"data", request.GetDataAsString()},
- });
- };
- std::shared_ptr<fake::Transport> transport(new fake::Transport);
- transport->AddHandler(kFakeUrl, "*", base::Bind(JsonHandler));
-
- base::DictionaryValue json;
- json.SetString("key1", "val1");
- json.SetString("key2", "val2");
- std::string value;
-
- // Test POST
- auto response = http::PostJson(kFakeUrl, &json, transport, nullptr);
- auto resp_json = http::ParseJsonResponse(response.get(), nullptr, nullptr);
- EXPECT_NE(nullptr, resp_json.get());
- EXPECT_TRUE(resp_json->GetString("method", &value));
- EXPECT_EQ(request_type::kPost, value);
- EXPECT_TRUE(resp_json->GetString("data", &value));
- EXPECT_EQ("{\"key1\":\"val1\",\"key2\":\"val2\"}", value);
-
- // Test PATCH
- response = http::PatchJson(kFakeUrl, &json, transport, nullptr);
- resp_json = http::ParseJsonResponse(response.get(), nullptr, nullptr);
- EXPECT_NE(nullptr, resp_json.get());
- EXPECT_TRUE(resp_json->GetString("method", &value));
- EXPECT_EQ(request_type::kPatch, value);
- EXPECT_TRUE(resp_json->GetString("data", &value));
- EXPECT_EQ("{\"key1\":\"val1\",\"key2\":\"val2\"}", value);
-}
-
-TEST(HttpUtils, ParseJsonResponse) {
- auto JsonHandler = [](const fake::ServerRequest& request,
- fake::ServerResponse* response) {
- int status_code = std::stoi(request.GetFormField("code"));
- response->ReplyJson(status_code, {{"data", request.GetFormField("value")}});
- };
- std::shared_ptr<fake::Transport> transport(new fake::Transport);
- transport->AddHandler(kFakeUrl, request_type::kPost, base::Bind(JsonHandler));
-
- // Test valid JSON responses (with success or error codes).
- for (auto item : {"200;data", "400;wrong", "500;Internal Server error"}) {
- auto pair = chromeos::string_utils::SplitAtFirst(item, ';');
- auto response = http::PostFormData(kFakeUrl, {
- {"code", pair.first},
- {"value", pair.second},
- }, transport, nullptr);
- int code = 0;
- auto json = http::ParseJsonResponse(response.get(), &code, nullptr);
- EXPECT_NE(nullptr, json.get());
- std::string value;
- EXPECT_TRUE(json->GetString("data", &value));
- EXPECT_EQ(pair.first, chromeos::string_utils::ToString(code));
- EXPECT_EQ(pair.second, value);
- }
-
- // Test invalid (non-JSON) response.
- auto response = http::Get("http://bad.url", transport, nullptr);
- EXPECT_EQ(status_code::NotFound, response->GetStatusCode());
- EXPECT_EQ(chromeos::mime::text::kHtml, response->GetContentType());
- int code = 0;
- auto json = http::ParseJsonResponse(response.get(), &code, nullptr);
- EXPECT_EQ(nullptr, json.get());
- EXPECT_EQ(status_code::NotFound, code);
-}
-