libchromeos: Move data_encoding from Buffet to libchromeos
BUG=chromium:405714
TEST=USE=buffet ./build_packages
Change-Id: I9c9d3994d1e33a05cd5c978a2697164071ce5aa0
Reviewed-on: https://chromium-review.googlesource.com/213362
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
Reviewed-by: Bertrand Simonnet <bsimonnet@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/buffet.gyp b/buffet/buffet.gyp
index a796de2..c9ac80d 100644
--- a/buffet/buffet.gyp
+++ b/buffet/buffet.gyp
@@ -27,7 +27,6 @@
'commands/prop_values.cc',
'commands/schema_constants.cc',
'commands/schema_utils.cc',
- 'data_encoding.cc',
'dbus_constants.cc',
'device_registration_info.cc',
'http_request.cc',
@@ -84,7 +83,6 @@
'commands/object_schema_unittest.cc',
'commands/schema_utils_unittest.cc',
'commands/unittest_utils.cc',
- 'data_encoding_unittest.cc',
'device_registration_info_unittest.cc',
'http_connection_fake.cc',
'http_transport_fake.cc',
diff --git a/buffet/buffet_client.cc b/buffet/buffet_client.cc
index ce8a928..7c0c454 100644
--- a/buffet/buffet_client.cc
+++ b/buffet/buffet_client.cc
@@ -12,6 +12,7 @@
#include <base/memory/ref_counted.h>
#include <base/memory/scoped_ptr.h>
#include <base/values.h>
+#include <chromeos/data_encoding.h>
#include <chromeos/dbus_utils.h>
#include <dbus/bus.h>
#include <dbus/message.h>
@@ -19,7 +20,6 @@
#include <dbus/object_manager.h>
#include <dbus/values_util.h>
-#include "buffet/data_encoding.h"
#include "buffet/dbus_constants.h"
using namespace buffet::dbus_constants; // NOLINT(build/namespaces)
@@ -149,7 +149,7 @@
chromeos::dbus_utils::Dictionary params;
if (!args.empty()) {
- auto key_values = buffet::data_encoding::WebParamsDecode(args.front());
+ auto key_values = chromeos::data_encoding::WebParamsDecode(args.front());
for (const auto& pair : key_values) {
params.insert(std::make_pair(
pair.first, std::unique_ptr<base::Value>(
diff --git a/buffet/data_encoding.cc b/buffet/data_encoding.cc
deleted file mode 100644
index 8614d2a..0000000
--- a/buffet/data_encoding.cc
+++ /dev/null
@@ -1,100 +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/data_encoding.h"
-
-#include <base/strings/stringprintf.h>
-#include <chromeos/string_utils.h>
-#include <cstring>
-
-namespace {
-
-inline int HexToDec(int hex) {
- int dec = -1;
- if (hex >= '0' && hex <= '9') {
- dec = hex - '0';
- } else if (hex >= 'A' && hex <= 'F') {
- dec = hex - 'A' + 10;
- } else if (hex >= 'a' && hex <= 'f') {
- dec = hex - 'a' + 10;
- }
- return dec;
-}
-
-} // namespace
-
-/////////////////////////////////////////////////////////////////////////
-namespace buffet {
-namespace data_encoding {
-
-std::string UrlEncode(const char* data, bool encodeSpaceAsPlus) {
- std::string result;
-
- while (*data) {
- char c = *data++;
- // According to RFC3986 (http://www.faqs.org/rfcs/rfc3986.html),
- // section 2.3. - Unreserved Characters
- if ((c >= '0' && c <= '9') ||
- (c >= 'A' && c <= 'Z') ||
- (c >= 'a' && c <= 'z') ||
- c == '-' || c == '.' || c == '_' || c == '~') {
- result += c;
- } else if (c == ' ' && encodeSpaceAsPlus) {
- // For historical reasons, some URLs have spaces encoded as '+',
- // this also applies to form data encoded as
- // 'application/x-www-form-urlencoded'
- result += '+';
- } else {
- base::StringAppendF(&result, "%%%02X",
- static_cast<unsigned char>(c)); // Encode as %NN
- }
- }
- return result;
-}
-
-std::string UrlDecode(const char* data) {
- std::string result;
- while (*data) {
- char c = *data++;
- int part1 = 0, part2 = 0;
- // HexToDec would return -1 even for character 0 (end of string),
- // so it is safe to access data[0] and data[1] without overrunning the buf.
- if (c == '%' &&
- (part1 = HexToDec(data[0])) >= 0 && (part2 = HexToDec(data[1])) >= 0) {
- c = static_cast<char>((part1 << 4) | part2);
- data += 2;
- } else if (c == '+') {
- c = ' ';
- }
- result += c;
- }
- return result;
-}
-
-std::string WebParamsEncode(const WebParamList& params,
- bool encodeSpaceAsPlus) {
- std::vector<std::string> pairs;
- pairs.reserve(params.size());
- for (const auto& p : params) {
- std::string key = UrlEncode(p.first.c_str(), encodeSpaceAsPlus);
- std::string value = UrlEncode(p.second.c_str(), encodeSpaceAsPlus);
- pairs.push_back(chromeos::string_utils::Join('=', key, value));
- }
-
- return chromeos::string_utils::Join('&', pairs);
-}
-
-WebParamList WebParamsDecode(const std::string& data) {
- WebParamList result;
- std::vector<std::string> params = chromeos::string_utils::Split(data, '&');
- for (const auto& p : params) {
- auto pair = chromeos::string_utils::SplitAtFirst(p, '=');
- result.emplace_back(UrlDecode(pair.first.c_str()),
- UrlDecode(pair.second.c_str()));
- }
- return result;
-}
-
-} // namespace data_encoding
-} // namespace buffet
diff --git a/buffet/data_encoding.h b/buffet/data_encoding.h
deleted file mode 100644
index e493e36..0000000
--- a/buffet/data_encoding.h
+++ /dev/null
@@ -1,46 +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_DATA_ENCODING_H_
-#define BUFFET_DATA_ENCODING_H_
-
-#include <string>
-#include <utility>
-#include <vector>
-
-namespace buffet {
-namespace data_encoding {
-
-typedef std::vector<std::pair<std::string, std::string>> WebParamList;
-
-// Encode/escape string to be used in the query portion of a URL.
-// If |encodeSpaceAsPlus| is set to true, spaces are encoded as '+' instead
-// of "%20"
-std::string UrlEncode(const char* data, bool encodeSpaceAsPlus);
-
-inline std::string UrlEncode(const char* data) {
- return UrlEncode(data, true);
-}
-
-// Decodes/unescapes a URL. Replaces all %XX sequences with actual characters.
-// Also replaces '+' with spaces.
-std::string UrlDecode(const char* data);
-
-// Converts a list of key-value pairs into a string compatible with
-// 'application/x-www-form-urlencoded' content encoding.
-std::string WebParamsEncode(const WebParamList& params, bool encodeSpaceAsPlus);
-
-inline std::string WebParamsEncode(const WebParamList& params) {
- return WebParamsEncode(params, true);
-}
-
-// Parses a string of '&'-delimited key-value pairs (separated by '=') and
-// encoded in a way compatible with 'application/x-www-form-urlencoded'
-// content encoding.
-WebParamList WebParamsDecode(const std::string& data);
-
-} // namespace data_encoding
-} // namespace buffet
-
-#endif // BUFFET_DATA_ENCODING_H_
diff --git a/buffet/data_encoding_unittest.cc b/buffet/data_encoding_unittest.cc
deleted file mode 100644
index ed6295c..0000000
--- a/buffet/data_encoding_unittest.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2011 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/data_encoding.h"
-
-#include <gtest/gtest.h>
-
-using namespace buffet::data_encoding; // NOLINT(build/namespaces)
-
-TEST(data_encoding, UrlEncoding) {
- std::string test = "\"http://sample/path/0014.html \"";
- std::string encoded = UrlEncode(test.c_str());
- EXPECT_EQ("%22http%3A%2F%2Fsample%2Fpath%2F0014.html+%22",
- encoded);
- EXPECT_EQ(test, UrlDecode(encoded.c_str()));
-
- test = "\"http://sample/path/0014.html \"";
- encoded = UrlEncode(test.c_str(), false);
- EXPECT_EQ("%22http%3A%2F%2Fsample%2Fpath%2F0014.html%20%22",
- encoded);
- EXPECT_EQ(test, UrlDecode(encoded.c_str()));
-}
-
-TEST(data_encoding, WebParamsEncoding) {
- std::string encoded = WebParamsEncode({{"q", "test"},
- {"path", "/usr/bin"},
- {"#", "%"}});
- EXPECT_EQ("q=test&path=%2Fusr%2Fbin&%23=%25", encoded);
-
- auto params = WebParamsDecode(encoded);
- EXPECT_EQ(3, params.size());
- EXPECT_EQ("q", params[0].first);
- EXPECT_EQ("test", params[0].second);
- EXPECT_EQ("path", params[1].first);
- EXPECT_EQ("/usr/bin", params[1].second);
- EXPECT_EQ("#", params[2].first);
- EXPECT_EQ("%", params[2].second);
-}
diff --git a/buffet/device_registration_info.cc b/buffet/device_registration_info.cc
index b111de1..5624d0d 100644
--- a/buffet/device_registration_info.cc
+++ b/buffet/device_registration_info.cc
@@ -10,11 +10,11 @@
#include <base/json/json_writer.h>
#include <base/values.h>
+#include <chromeos/data_encoding.h>
#include <chromeos/string_utils.h>
#include "buffet/commands/command_definition.h"
#include "buffet/commands/command_manager.h"
-#include "buffet/data_encoding.h"
#include "buffet/device_registration_storage_keys.h"
#include "buffet/http_transport_curl.h"
#include "buffet/http_utils.h"
@@ -131,7 +131,7 @@
std::string BuildURL(const std::string& url,
const std::vector<std::string>& subpaths,
- const buffet::data_encoding::WebParamList& params) {
+ const chromeos::data_encoding::WebParamList& params) {
std::string result = buffet::url::CombineMultiple(url, subpaths);
return buffet::url::AppendQueryParams(result, params);
}
@@ -165,20 +165,20 @@
std::string DeviceRegistrationInfo::GetServiceURL(
const std::string& subpath,
- const data_encoding::WebParamList& params) const {
+ const chromeos::data_encoding::WebParamList& params) const {
return BuildURL(service_url_, {subpath}, params);
}
std::string DeviceRegistrationInfo::GetDeviceURL(
const std::string& subpath,
- const data_encoding::WebParamList& params) const {
+ const chromeos::data_encoding::WebParamList& params) const {
CHECK(!device_id_.empty()) << "Must have a valid device ID";
return BuildURL(service_url_, {"devices", device_id_, subpath}, params);
}
std::string DeviceRegistrationInfo::GetOAuthURL(
const std::string& subpath,
- const data_encoding::WebParamList& params) const {
+ const chromeos::data_encoding::WebParamList& params) const {
return BuildURL(oauth_url_, {subpath}, params);
}
diff --git a/buffet/device_registration_info.h b/buffet/device_registration_info.h
index 1985bb6..cdba4aa 100644
--- a/buffet/device_registration_info.h
+++ b/buffet/device_registration_info.h
@@ -12,9 +12,9 @@
#include <base/basictypes.h>
#include <base/time/time.h>
+#include <chromeos/data_encoding.h>
#include <chromeos/error.h>
-#include "buffet/data_encoding.h"
#include "buffet/http_transport.h"
#include "buffet/storage_interface.h"
@@ -54,7 +54,7 @@
// appended to the base URL which is normally
// https://www.googleapis.com/clouddevices/v1/".
// If |params| are specified, each key-value pair is formatted using
- // data_encoding::WebParamsEncode() and appended to URL as a query
+ // chromeos::data_encoding::WebParamsEncode() and appended to URL as a query
// string.
// So, calling:
// GetServiceURL("ticket", {{"key","apiKey"}})
@@ -62,20 +62,20 @@
// https://www.googleapis.com/clouddevices/v1/ticket?key=apiKey
std::string GetServiceURL(
const std::string& subpath = {},
- const data_encoding::WebParamList& params = {}) const;
+ const chromeos::data_encoding::WebParamList& params = {}) const;
// Returns a service URL to access the registered device on GCD server.
// The base URL used to construct the full URL looks like this:
// https://www.googleapis.com/clouddevices/v1/devices/<device_id>/
std::string GetDeviceURL(
const std::string& subpath = {},
- const data_encoding::WebParamList& params = {}) const;
+ const chromeos::data_encoding::WebParamList& params = {}) const;
// Similar to GetServiceURL, GetOAuthURL() returns a URL of OAuth 2.0 server.
// The base URL used is https://accounts.google.com/o/oauth2/.
std::string GetOAuthURL(
const std::string& subpath = {},
- const data_encoding::WebParamList& params = {}) const;
+ const chromeos::data_encoding::WebParamList& params = {}) const;
// Returns the registered device ID (GUID) or empty string if failed
std::string GetDeviceId(chromeos::ErrorPtr* error);
diff --git a/buffet/http_transport_fake.cc b/buffet/http_transport_fake.cc
index 7df8567..40d8eff 100644
--- a/buffet/http_transport_fake.cc
+++ b/buffet/http_transport_fake.cc
@@ -156,7 +156,7 @@
GetHeader(request_header::kContentType));
if (mime_type == mime::application::kWwwFormUrlEncoded &&
!GetData().empty()) {
- auto fields = data_encoding::WebParamsDecode(GetDataAsString());
+ auto fields = chromeos::data_encoding::WebParamsDecode(GetDataAsString());
form_fields_.insert(fields.begin(), fields.end());
}
form_fields_parsed_ = true;
diff --git a/buffet/http_utils.cc b/buffet/http_utils.cc
index 6111aa0..439acab 100644
--- a/buffet/http_utils.cc
+++ b/buffet/http_utils.cc
@@ -9,9 +9,9 @@
#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 "buffet/data_encoding.h"
#include "buffet/mime_utils.h"
namespace buffet {
@@ -89,7 +89,7 @@
const HeaderList& headers,
std::shared_ptr<Transport> transport,
chromeos::ErrorPtr* error) {
- std::string encoded_data = data_encoding::WebParamsEncode(data);
+ std::string encoded_data = chromeos::data_encoding::WebParamsEncode(data);
return PostBinary(url, encoded_data.c_str(), encoded_data.size(),
mime::application::kWwwFormUrlEncoded,
headers, transport, error);
diff --git a/buffet/url_utils.cc b/buffet/url_utils.cc
index 3fcdb48..599fa5b 100644
--- a/buffet/url_utils.cc
+++ b/buffet/url_utils.cc
@@ -95,13 +95,13 @@
return query_string;
}
-data_encoding::WebParamList url::GetQueryStringParameters(
+chromeos::data_encoding::WebParamList url::GetQueryStringParameters(
const std::string& url) {
// Extract the query string and remove the leading '?'.
std::string query_string = GetQueryString(url, true);
if (!query_string.empty() && query_string.front() == '?')
query_string.erase(query_string.begin());
- return data_encoding::WebParamsDecode(query_string);
+ return chromeos::data_encoding::WebParamsDecode(query_string);
}
std::string url::GetQueryStringValue(
@@ -110,7 +110,7 @@
}
std::string url::GetQueryStringValue(
- const data_encoding::WebParamList& params,
+ const chromeos::data_encoding::WebParamList& params,
const std::string& name) {
for (const auto& pair : params) {
if (name.compare(pair.first) == 0)
@@ -139,7 +139,7 @@
std::string url::AppendQueryParams(
const std::string& url,
- const data_encoding::WebParamList& params) {
+ const chromeos::data_encoding::WebParamList& params) {
if (params.empty())
return url;
size_t query_pos, query_len;
@@ -151,7 +151,7 @@
} else if (query_len > 1) {
result += '&';
}
- result += data_encoding::WebParamsEncode(params);
+ result += chromeos::data_encoding::WebParamsEncode(params);
if (fragment_pos < url.size()) {
result += url.substr(fragment_pos);
}
diff --git a/buffet/url_utils.h b/buffet/url_utils.h
index d9bce25..f0e9080 100644
--- a/buffet/url_utils.h
+++ b/buffet/url_utils.h
@@ -9,8 +9,7 @@
#include <vector>
#include <base/basictypes.h>
-
-#include "buffet/data_encoding.h"
+#include <chromeos/data_encoding.h>
namespace buffet {
@@ -42,13 +41,15 @@
std::string GetQueryString(const std::string& url, bool remove_fragment);
// Parses the query string into a set of key-value pairs.
-data_encoding::WebParamList GetQueryStringParameters(const std::string& url);
+chromeos::data_encoding::WebParamList GetQueryStringParameters(
+ const std::string& url);
// Returns a value of the specified query parameter, or empty string if missing.
std::string GetQueryStringValue(const std::string& url,
const std::string& name);
-std::string GetQueryStringValue(const data_encoding::WebParamList& params,
- const std::string& name);
+std::string GetQueryStringValue(
+ const chromeos::data_encoding::WebParamList& params,
+ const std::string& name);
// Removes the query string and/or a fragment part from URL.
// If |remove_fragment| is specified, the fragment is also removed.
@@ -66,7 +67,7 @@
// Appends a list of query parameters to the URL.
std::string AppendQueryParams(
const std::string& url,
- const data_encoding::WebParamList& params) WARN_UNUSED_RESULT;
+ const chromeos::data_encoding::WebParamList& params) WARN_UNUSED_RESULT;
// Checks if the URL has query parameters.
bool HasQueryString(const std::string& url);