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