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);